Я столкнулся с некоторыми проблемами в своем приложении видеочата, которое использует библиотеки libav. Я отправляю видео 1080p, закодированные в VP8, как контейнер WebM через UDP, и это работает довольно хорошо. В большинстве случаев декодер с обеих сторон восстанавливает потери пакетов из-за передачи.
Однако в какой-то момент он просто замерзает и больше никогда не восстанавливается. В конечном итоге это происходит с обеих сторон. Я искал параметры кодека VP8 для повышения надежности при отправке по каналам передачи с потерями. И я объединил некоторые из найденных, чтобы повысить надежность. Тем не менее, он все еще зависает после некоторого времени видеочата.
Вот параметры, которые я сейчас использую.
pVidCodecCtx->codec_id = AV_CODEC_ID_VP8;
pVidCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
pVidCodecCtx->width = frmQ->pCodecCtx->width; //1920
pVidCodecCtx->height = frmQ->pCodecCtx->height; //1080
pVidCodecCtx->time_base = frmQ->pCodecCtx->time_base;
pVidCodecCtx->pix_fmt = PIX_FMT_YUV420P;
pVidCodecCtx->qmin = 4;
pVidCodecCtx->qmax = 56;
pVidCodecCtx->bit_rate = pVidCodecCtx->width * pVidCodecCtx->height * 6;
pVidCodecCtx->slices = 8;
pVidCodecCtx->profile = 3;
pVidCodecCtx->thread_count = 3;
pVidCodecCtx->keyint_min = 5;
av_dict_set(&pDictCodecOpts, "rc_lookahead", "0", 0);
av_dict_set(&pDictCodecOpts, "quality", "realtime", 0);
av_dict_set(&pDictCodecOpts, "deadline", "realtime", 0);
av_dict_set(&pDictCodecOpts, "max-intra-rate", "0", 0);
av_dict_set(&pDictCodecOpts, "qcomp", "0", 0);
av_dict_set(&pDictCodecOpts, "default", "er", 0);
av_dict_set(&pDictCodecOpts, "error_resilient", "er", 0);
av_dict_set(&pDictCodecOpts, "partitions", "er", 0);
Большинство параметров я извлек из кода ffmpeg для кодировщика vpx.
Нужно ли также устанавливать параметры для декодера, чтобы повысить устойчивость к ошибкам? Или я пропускаю какие-то параметры в энкодере или неправильно их устанавливаю. Любая помощь или подсказки приветствуются.