Video 在使用libav/ffmpeg的UDP流媒体中找到更好的VP8参数,以增强鲁棒性
我在使用libav库的视频聊天应用程序中遇到了一些问题。我通过UDP将VP8编码的1080p视频作为WebM容器发送,效果非常好。在大多数情况下,任何一方的解码器都可以从传输造成的数据包丢失中恢复 然而,在某个时间点,它只是冻结,永远不会恢复。这最终在双方都会发生。当通过有损传输通道发送时,我正在搜索VP8编解码器参数,以提高鲁棒性。为了增强稳健性,我结合了我发现的一些。然而,经过一段时间的视频聊天后,它仍然冻结 以下是我当前使用的参数。 我从中提取的大多数参数 我是否还必须为解码器设置参数以提高错误恢复能力?Video 在使用libav/ffmpeg的UDP流媒体中找到更好的VP8参数,以增强鲁棒性,video,ffmpeg,codec,libav,libvpx,Video,Ffmpeg,Codec,Libav,Libvpx,我在使用libav库的视频聊天应用程序中遇到了一些问题。我通过UDP将VP8编码的1080p视频作为WebM容器发送,效果非常好。在大多数情况下,任何一方的解码器都可以从传输造成的数据包丢失中恢复 然而,在某个时间点,它只是冻结,永远不会恢复。这最终在双方都会发生。当通过有损传输通道发送时,我正在搜索VP8编解码器参数,以提高鲁棒性。为了增强稳健性,我结合了我发现的一些。然而,经过一段时间的视频聊天后,它仍然冻结 以下是我当前使用的参数。 我从中提取的大多数参数 我是否还必须为解码器设置参数以
或者我在编码器中丢失了一些参数,或者设置不正确。非常感谢您提供的任何帮助或提示。我将回答我自己的问题,因为我最终成功地让视频聊天在没有冻结的情况下运行 事实证明,这些参数实际上有利于错误恢复能力 问题是一些函数调用,例如
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
...
}
timer.tic();
ret=av_读取_帧(…);
timer.reset();
如果(ret)
timer.tic();
ret = av_read_frame(...);
timer.reset();
if (ret<0)
{
//received corrupted frame
//reinitialize format context
//open input
//find decoder and open codec
...
}