我正在尝试使用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.
[...]
我错过了什么?我尝试搜索有关类似问题的线程但没有出现。或者有没有办法可以调试错误以获取更多信息?
答案 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帖子中所述。