从ffmpeg 1.1升级到3.3后没有帧解码

时间:2018-05-01 08:51:53

标签: c++ ffmpeg h.264 decoding libavcodec

我在C ++中使用libavcodec来解码h264 rtsp流帧。此源代码是使用ffmpeg 1.1编写的。现在,当我升级到ffmpeg 3.3时,除了解码帧不起作用外,所有事情似乎都能正常工作。 在旧版本中,我使用的是avcodec_decode_video2。升级后,avcodec_decode_video2始终将got_picture设置为0,并且返回值等于输入数据包的大小(这意味着使用了所有数据)。永远不会解码帧。 我还删除了avcodec_decode_video2并使用avcodec_send_packet和avcodec_receive_frame完成解码,但avcodec_send_packet始终返回0并且avcodec_receive_frame始终返回-11(EAGAIN)。

这是我用于解码的代码:

aquire

可以从此链接下载测试帧数据: Frames.zip (~3.7MB)

我使用了来自Builds - Zeranoe FFmpeg的Windows版本 如果您将此代码复制粘贴到IDE中,则代码会成功编译。使用libavcodec新版本,不会解码任何帧。使用旧版本的libavcodec(20141216-git-92a596f),解码在feed frame 2开始。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

FFmpeg / libAV描述非常复杂,并且在可理解性方面可能不是最好的(如果不是说它很糟糕)。你应该仔细阅读。

但是,您缺少的是使用AVPacket初始化av_init_packet。或者使用av_packet_alloc()创建将初始化数据包的数据包(最好在以后复制它以进行编码)。

// code ...
AVPacket avpkt;
av_init_packet(&avpkt);         // initialize packet
avpkt.data = (uint8_t*)buffer;
avpkt.size = nReadSize;
// code ...

// code ...
AVPacket* avpkt = av_packet_alloc();
avpkt->data = (uint8_t*)buffer;
avpkt->size = nReadSize;
// use ...
auto len = avcodec_decode_video2(avCodecContext, avFrame, &got_frame, avpkt);

在代码中使用av_packet_alloc()也更加一致,因为您还使用AVFrame作为指针。

请记住还要释放数据包/帧/图片,否则会出现内存泄漏。

同样here是ffmpeg的(或多或少)好/“最新”教程。