我在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开始。
有什么想法吗?
答案 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的(或多或少)好/“最新”教程。