Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 在使用libav/ffmpeg的UDP流媒体中找到更好的VP8参数,以增强鲁棒性_Video_Ffmpeg_Codec_Libav_Libvpx - Fatal编程技术网

Video 在使用libav/ffmpeg的UDP流媒体中找到更好的VP8参数,以增强鲁棒性

Video 在使用libav/ffmpeg的UDP流媒体中找到更好的VP8参数,以增强鲁棒性,video,ffmpeg,codec,libav,libvpx,Video,Ffmpeg,Codec,Libav,Libvpx,我在使用libav库的视频聊天应用程序中遇到了一些问题。我通过UDP将VP8编码的1080p视频作为WebM容器发送,效果非常好。在大多数情况下,任何一方的解码器都可以从传输造成的数据包丢失中恢复 然而,在某个时间点,它只是冻结,永远不会恢复。这最终在双方都会发生。当通过有损传输通道发送时,我正在搜索VP8编解码器参数,以提高鲁棒性。为了增强稳健性,我结合了我发现的一些。然而,经过一段时间的视频聊天后,它仍然冻结 以下是我当前使用的参数。 我从中提取的大多数参数 我是否还必须为解码器设置参数以

我在使用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
    ...
}