【问题标题】:FFmpeg can't decode H264 stream/frame dataFFmpeg 无法解码 H264 流/帧数据
【发布时间】:2012-07-05 01:21:44
【问题描述】:

最近我有机会使用两台通过 RTSP 流式传输 H264 的设备。 我在尝试使用 FFmpeg 库解压缩此流时遇到了一些问题。

每次调用“avcodec_decode_video2” - FFmpeg 只会说:

[h264 @ 00339220] 没有框架!

我的原始 H264 流 I 帧数据如下所示:“65 88 84 21 3F F8 F8 0D...” (据我了解,这个 0x65 表示它是一个 IDR 帧?)

一个设备的其他帧开头如下:“41 9A 22 07 F3 4E 48 CC....”

对于其他设备 - 像这样:“61 9A 25 C1 1C 45 62 39....”

  • 我在这里遗漏了一些帧数据吗?
  • FFmpeg 是否需要设置一些额外的参数?

我期望帧数据的开头至少有“00 00 00 01”字节......但这就是我所得到的......

【问题讨论】:

    标签: stream ffmpeg h.264 rtsp


    【解决方案1】:

    好的,成功了。

    • 我需要包含序列 (SPS) 和图片参数集 (PPS) 在将帧发送到 FFmpeg 之前用于我的帧数据。
    • 我需要在 SPS 和 PPS 数据之后添加 4 个额外字节“00 00 00 01”。

    这是一张小图,说明了我的意思:

    Bytes "65 88..." 是我的原始帧数据开始的地方。

    此 SPS 和 PPS 信息未包含在 RTP 数据包中。我正在使用 Live555 库进行 RTSP 流式传输,因此我使用了子会话“fmtp_spropparametersets”函数来获得我需要的东西。此信息是 Base64 编码的。 (示例:类似 "Z0KAKNoC0EkQ,aM48gA==") 请注意,有两个“参数”SPS 和 PPS 由“,”分隔,并且这些参数没有“00 00 00 01 " 包括在内,因此您需要添加它们。

    一些代码示例(我在这里使用 Qt 库):

    QByteArray        ba          = pSubSession->fmtp_spropparametersets();
    QList<QByteArray> recordsList = ba.split(',');
    
    for (int i = 0; i < recordsList.size(); i++)
    {
       mExtraData.append(char(0x00));
       mExtraData.append(char(0x00));
       mExtraData.append(char(0x00));
       mExtraData.append(char(0x01));
    
       mExtraData += QByteArray::fromBase64(recordsList.at(i));
    }
    

    现在对于每一帧我都做这样的事情:

    QByteArray ba = QByteArray(4, 0); // Prepare the "00 00 00 01"
               ba[3] = 0x01;
    
    mpTrackVideo->buffer.insert(0, mExtraData);
    mpTrackVideo->buffer.insert(mExtraData.size(), ba);
    

    一年前,我以为我的项目中集成了 H264 流支持,直到我有机会使用其他一些设备对其进行测试... 所以您需要记住,有些设备可能会为每个 I 帧发送 SPS 和 PPS 数据……而有些可能不会!

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 2020-10-06
      • 2016-04-09
      • 2011-11-24
      • 2013-09-22
      • 1970-01-01
      • 2019-12-15
      • 2017-04-23
      • 1970-01-01
      相关资源
      最近更新 更多