libav - 解码 H264 帧错误

libav - Decoding H264 Frame Error

我正在尝试使用 libav 库解码 H264 帧。通过分配框架和上下文初始化库后,我使用以下代码进行解码:

AVPacket pkt;
int got_picture, len;
av_init_packet(&pkt);
pkt.size = size;
pkt.data = buffer;
while(pkt.size > 0) {
    if((len = avcodec_decode_video2(context, frame, &got_picture, &pkt)) < 0) {
        break;
    }

    if(got_picture) {
        // Do something with the picture...
    }

    avPkt.size -= len;
    avPkt.data += len;
}

但是,每当我调用 avcodec_decode_video2 时,它都会在控制台中打印以下错误:

[...]    
[h264 @ 000000000126db40] AVC: The buffer size 210 is too short to read the nal length size 0 at the offset 210.
[h264 @ 000000000126db40] AVC: The buffer size 283997 is too short to read the nal length size 0 at the offset 283997.
[h264 @ 000000000126db40] AVC: The buffer size 17137 is too short to read the nal length size 0 at the offset 17137.
[...]

我错过了什么?我尝试搜索有关类似问题的线程,但没有找到任何结果。或者有什么方法可以调试错误以获取更多相关信息?

首先,我假设您正确分配了输出帧。

And @AntonAngelov, I am using 11.04. Do you know what the error is supposed to say? What buffer is the error talking about?

我刚刚查看了 11.04 的源代码(在 /avcodec/h264.c 中),但我没有看到这个错误是在哪里产生的,而在旧版本中它是存在的。

似乎错误表明您发送到解码器的 NALU 数据包的大小是 0

我的猜测是你必须以某种方式从 LIVE555 获得 SPSPPS headers 并通过它的 extradata 将它们提供给解码器(您还必须设置 extradata_size),然后再调用 avcodec_open2()。

另一个想法是将您收到的所有数据包转储到一个 .h264 文件中。然后使用解析h264比特流的软件(see here for example)。也尝试用 avplayVLC 播放它,看看比特流是否正确。

编辑: Here 回答了类似的问题。

AVPacket pkt;
int got_picture, len;
av_init_packet(&pkt);
pkt.size = size;
pkt.data = buffer;
while(pkt.size > 0) {
    if((len = avcodec_decode_video2(context, frame, &got_picture, &pkt)) < 0) {

你的代码让我担心,因为你手动初始化一个 AVPacket,但你没有告诉我们 buffer/size 来自哪里。鉴于错误消息,我几乎可以肯定,您正在从文件、套接字或类似的东西中读取原始数据,就好像它是原始 annexb 流一样。

FFmpeg(或 Libav,就此而言)不接受此类数据作为其 H.264 解码器的输入。要解决此问题,请使用 AVParser,如前所述 this post.