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 获得 SPS 和 PPS headers 并通过它的 extradata
将它们提供给解码器(您还必须设置 extradata_size
),然后再调用 avcodec_open2()。
另一个想法是将您收到的所有数据包转储到一个 .h264 文件中。然后使用解析h264比特流的软件(see here for example)。也尝试用 avplay 或 VLC 播放它,看看比特流是否正确。
编辑:
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.
我正在尝试使用 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 获得 SPS 和 PPS headers 并通过它的 extradata
将它们提供给解码器(您还必须设置 extradata_size
),然后再调用 avcodec_open2()。
另一个想法是将您收到的所有数据包转储到一个 .h264 文件中。然后使用解析h264比特流的软件(see here for example)。也尝试用 avplay 或 VLC 播放它,看看比特流是否正确。
编辑: 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.