我正在使用libav(来自Linux和Windows上的C ++程序)解码文件中的视频流,使用avformat_open_input(),av_read_frame()和avcodec_decode_video2()可以正常工作(解码各种格式,如H264和MPEG2)
现在我必须将解复用和解码分开。一个类将调用avformat_open_input()和av_read_frame(),然后将AVPackets传递到另一个类读取的队列中。在那里,我使用avcodec_alloc_context3()来获取avcodec_decode_video2()所需的AVCodecContext。我用MPEG2视频流测试了它,它可以工作。
如果我尝试解码H264流,则会出现问题:avcodec_decode_video2()始终返回-1并输出“no frame”。我知道解码此流需要额外的数据(SPS / PPS),因此我尝试从解码器中的解复用器复制原始AVCodecContext,但它不起作用:
我也尝试设置CODEC_FLAG2_CHUNKS。 avcodec_decode_video2()然后总是返回packet.size - 3(??),frameFinished永远不会设置为1。
在我看来,这里有一个普遍的问题,只要需要原始CodecContext的设置来解码AVPackets就会出现这个问题。如果有任何关于如何解决这个问题的提示,我将不胜感激!
编辑:有时写下您的问题有助于解决问题...使用上下文结构(avcodec_copy_context)的副本并仅在收到复制后打开编解码器会产生解码帧。有谁知道这是安全还是最好的方法呢?