【发布时间】:2019-05-18 10:28:58
【问题描述】:
我正在尝试使用 ffmpeg 库解码视频流,我基本上就是这样做的:
void video_decode(const char *filename)
{
AVCodec *codec;
AVCodecContext *c= NULL;
int frame_count=0;
FILE *f;
AVFrame *frame;
uint8_t inbuf[INBUF_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
AVPacket avpkt;
av_init_packet(&avpkt);
memset(inbuf + INBUF_SIZE, 0, AV_INPUT_BUFFER_PADDING_SIZE);
printf("Decoding video file...\n");
/* find the h264 video decoder */
codec = avcodec_find_decoder(AV_CODEC_ID_H264);
c = avcodec_alloc_context3(codec);
c->bit_rate = 400000;
c->width = 1920;
c->height = 1080;
if (avcodec_open2(c, codec, NULL) < 0) {
fprintf(stderr, "Could not open codec\n");
exit(1);
}
frame = av_frame_alloc();
for (;;) {
avpkt.size = fread(inbuf, 1, INBUF_SIZE, f);
if (avpkt.size == 0)
break;
avpkt.data = inbuf;
while(avpkt.size > 0){
int len, got_frame;
len = avcodec_decode_video2(c, frame, &got_frame, &avpkt);
if (len < 0) {
fprintf(stderr, "Errr while decding frame %d\n", frame_count);
exit (1);
}
if (got_frame) {
//Print out frame information..
}
if (avpkt.data) {
avpkt.size -= len;
avpkt.data += len;
}
}
}
}
但我得到了以下输出:
Decoding video file...
[h264 @ 0x303c040] decode_slice_header error
[h264 @ 0x303c040] decode_slice_header error
[h264 @ 0x303c040] decode_slice_header error
[h264 @ 0x303c040] no frame!
Errr while decding frame 0
很明显,编解码器的启动是不完整的。你有使用 h264 api 的经验吗?任何帮助将不胜感激。
【问题讨论】:
-
您是否有证据证明该文件确实是原始 h264 流?至少一帧可以吗?你的 IBUF_SIZE 会不会太小?请将您的代码与roxlu.com/2014/039/decoding-h264-and-yuv420p-playback 进行比较:您缺少的一件事是它们的 H264_Decoder::readBuffer()
-
好提示!谢谢:-)
-
我很困惑为什么某些 .h264 文件一帧(只有一帧)可以走,但某些 .h264 文件没有帧可以?我的意思是,它们都是 .h264 文件,解码的差异在哪里?又如何知道 h264 流是否是原始 h264 流? @亚历克斯科恩
-
您可以使用
ffprobe或ffmpeg来检查文件的格式。关于第一个问题,下面的@szatmary 给出了提示:您选择了一些任意的INBUF_SIZE。如果 h264 流的第一帧恰好适合此缓冲区,则 avcodec 可以对其进行解码。如果流的第一帧碰巧更大,那么您的方法将失败。您是否更新了代码以执行我上面链接的 roxlu.comreadBuffer()的逻辑? -
嗨,我确实阅读了您推荐的代码。我没有使用随机 IBUF_SIZE,而是使用了最大大小:这有点浪费内存,但节省了更新缓冲区的工作量。我认为 AU 或 NALU 确实在这种情况下发挥了重要作用,我必须进一步阅读这些东西。非常感谢!