解码H264帧错误

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

我错过了什么? 我试图寻找有关类似问题的线索,但没有出现。 或者有没有一种方法可以调试错误以获取有关它的更多信息?


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

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

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

看来错误显示你发送给解码器的NALU数据包的大小为0

我的猜测是,你必须从LIVE555以某种方式获得SPS和PPS头文件,并在调用avcodec_open2()之前通过它的extradata (也必须设置extradata_size )将它们提供给解码器。

另一个想法是将所有收到的数据包转储到一个.h264文件中。 然后使用软件来解析h264比特流(参见这里举例)。 也可以尝试使用av​​play或VLC播放,以查看比特流是否正确。

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


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,如本文前面所述。

链接地址: http://www.djcxy.com/p/67555.html

上一篇: Decoding H264 Frame Error

下一篇: Decode compressed frame to memory using LibAV: avcodec