【问题标题】:h.264 I-frame loss handling in rtsp streamingrtsp 流中的 h.264 I 帧丢失处理
【发布时间】:2014-05-06 06:41:50
【问题描述】:

我正在开发一个播放器,它使用 Live555 打开 rtsp 流并使用 FFMPEG 解码视频流。我被困在一个点,IDR 帧在网络上丢失,因此在解码其后续 B/P 帧后,它在视频中显示出抖动效果。它在视频中的表现非常糟糕。

所以我的问题是,如何处理 I 帧数据包丢失?想知道有没有什么策略/算法来处理丢包,让视频流畅或者清晰。

任何帮助将不胜感激。 谢谢。

【问题讨论】:

    标签: c++ ffmpeg h.264 rtsp live555


    【解决方案1】:

    如果是第一种方法,我猜你是同步解码帧,我的意思是Live555 afterGetting回调直接调用FFMPEG的avcodec_decode_video2。

    在这种情况下,接收套接字在解码过程中没有被读取,然后数据包被缓冲直到溢出。

    您可以尝试不同的解决方法,例如增加套接字缓冲区,使用基于 TCP 的 RTP,但真正的解决方案需要更加异步,例如 afterGetting 可以将数据推送到 fifo 并且解码线程可以从中获取。

    【讨论】:

    • 感谢您的建议,这是我为播放器实现代码的方式。但我担心网络数据包丢失、处理和获取窒息视频。
    • 为了流畅播放视频,需要实现一个jitter filter。参见例如ind.rwth-aachen.de/en/research/speechaudio-communication/…。这适用于音频,但视频的问题是一样的。
    【解决方案2】:

    嗯,一旦 I 帧丢失,它就丢失了。你真的不能在客户端做任何事情。我们可以解决这个问题的唯一方法是配置服务器(即:流媒体),使其发送更频繁的 I 帧(即:流中的更多 I 帧)或更不频繁的 I 帧(即_流中的 I 帧更少)(如果您使用 ffmpeg/libx264,它可以在发送 I 帧时微调到令人难以置信的精确度)。

    【讨论】:

    • 我怎么知道,I-frame 丢失了?有 2 个流以不同的模式传输。就像一台具有 7,8,6,5,1,1,1,1,1.....7,8,6,5,1,1.. 的摄像机和具有这种模式 6,5,6 的另一个流,1,1,6,1,1,6,1,1...,6,5,6,1,1,... 如果 I 帧丢失,我应该跳过它的下一个相关帧并停止解码直到我得到下一个 I 帧?
    • 我认为您需要以某种方式将播放器的 I 帧请求与流媒体的 I 帧输出同步。例如,如果您将流媒体配置为在每 4 个 B 帧之后不断输出 1 个 I 帧(是的,不要求编码器执行此操作,但是可以强制/这些只是与任何事物无关的数字/)和您开始计算帧数,您可以轻松检测到丢失的 I 帧。在这种情况下,您可以决定做什么。
    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 2011-10-05
    • 2013-11-07
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2017-06-17
    相关资源
    最近更新 更多