使用libav / ffmpeg查找更好的VP8参数以实现UDP流中的鲁棒性

lmNt

我在使用libav库的视频聊天应用程序中遇到一些问题。我正在通过UDP发送以VP8编码为WebM容器的1080p视频,并且效果很好。在大多数情况下,两侧的解码器都会从传输造成的数据包丢失中恢复过来。

但是,在某个时间点,它只是冻结而不再恢复。最终,双方都会发生这种情况。我正在搜索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编码器的大多数参数

我还必须为解码器设置参数以提高错误恢复能力吗?还是我在编码器中缺少某些参数或设置不正确。任何帮助或提示,我们将不胜感激。

lmNt

我会回答自己的问题,因为我最终设法使视频聊天正常运行。

事实证明,这些参数实际上对于提高错误恢复能力很有用。

问题是某些函数调用例如

av_read_frame()
avformat_open_input()

程序包损坏时,解码器线程中的线程被阻止,从而导致视频冻结。

因此,我最终要做的是编写一个计时器类,并让计时器测量所述函数的执行时间。我编写了一个中断回调函数,并将其传递给解码器的格式上下文,如下所示:

static int interrupt_cb (void *p)
{
    unsigned int expTime = 1000;
    Uint32 elapsedTime = pVidConfTimer.elapsedTimeInMs();
    if (elapsedTime > expTime) 
    {
       return 1;
    }
    return 0;
}

static const AVIOInterruptCB cb = {interrupt_cb, &dummy};
frmQ.pFormatCtx->interrupt_callback = cb;

如果执行时间超过expTime,则将从函数返回。您也可以将自定义参数通过void *p传递给回调函数

在我的解码/显示线程中,我只是调用类似

timer.tic();
ret = av_read_frame(...);
timer.reset();

if (ret<0)
{
    //received corrupted frame
    //reinitialize format context
    //open input
    //find decoder and open codec
    ...
}

希望这可以帮助任何有类似问题的人。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用libav / ffmpeg查找更好的VP8参数以增强UDP流中的鲁棒性

来自分类Dev

使用FFMPEG LibAV重采样音频

来自分类Dev

使用libav *将H.264转码为VP8的帧速率不正确

来自分类Dev

使用libav *将原始帧(D3D11Texture2D)编码为rtsp流

来自分类Dev

Set RTSP/UDP buffer size in FFmpeg/LibAV

来自分类Dev

FFmpeg / Libav音频解码示例

来自分类Dev

在FFmpeg / LibAV中设置RTSP / UDP缓冲区大小

来自分类Dev

在 libav 中读取 dumpepd RTP 流

来自分类Dev

使用libav进行x264编码

来自分类Dev

使用libav而不生成输出文件

来自分类Dev

使用libav转换mp4-ts

来自分类Dev

使用--enable- *从GIT构建libav

来自分类Dev

使用--enable- *从GIT构建libav

来自分类Dev

使用libav转换mp4-ts

来自分类Dev

使用libav的未定义引用蚀

来自分类Dev

用 libav / ffmpeg 替换 Bento4

来自分类Dev

如何使用ffmpeg将Vorbis音频和VP8视频混合为WebM格式?

来自分类Dev

当执行示例命令以使用VP8进行转换时,ffmpeg失败

来自分类Dev

可以在FFmpeg上将VP8或VP9编码与Intel Quick Sync一起使用吗?

来自分类Dev

使用libav-tools与通过源构建的libav-视频质量差很多

来自分类Dev

如何安装比库中更高版本的libav

来自分类Dev

使用Gstreamer编码/解码VP8或VP9?

来自分类Dev

使用Gstreamer编码/解码VP8或VP9?

来自分类Dev

如何在CMake中检测ffmpeg vs libav?

来自分类Dev

使用Libav的视频原始音频解码被切碎

来自分类Dev

使用avconv(libav)转换非常慢-Trusty Tahr 14.04吗?

来自分类Dev

使用avconv(libav)转换非常慢-Trusty Tahr 14.04吗?

来自分类Dev

C ++ H264 ffmpeg / libav编码/解码(无损)问题

来自分类Dev

libav / ffmpeg输出优化,适用于小文件

Related 相关文章

热门标签

归档