libav - 解码H264帧错误

时间:2015-10-02 10:43:37

标签: c++ ffmpeg libav

我正在尝试使用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.
[...]

我错过了什么?我尝试搜索有关类似问题的线程但没有出现。或者有没有办法可以调试错误以获取更多信息?

2 个答案:

答案 0 :(得分:1)

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

  

和@AntonAngelov,我使用的是11.04。你知道错误是什么吗?   该怎么说?错误在谈论什么缓冲区?

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

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

我的猜测是你必须以某种方式从 LIVE555 获取 SPS PPS 标题,并通过它{{{ 1}}(你也必须设置extradata),然后再调用avcodec_open2()。

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

修改 Here回答了类似的问题。

答案 1 :(得分:1)

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,但您并没有告诉我们缓冲区/大小的来源。鉴于错误消息,我几乎可以确定您正在从文件,套接字或类似内容中读取原始数据,就好像它是原始的附件流一样。

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