解码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比特流(参见这里举例)。 也可以尝试使用avplay或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