2

我正在使用 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 并输出“无帧”。我知道解码这个流需要额外的数据(SPS/PPS),所以我试图从解码器中的解复用器复制原始的 AVCodecContext,但它不起作用:

  • 复制 extradata 字段的内容并设置与解码器中的默认值不同的所有其他值:返回 -1
  • 使用相同的上下文(即沿指针传递)会导致崩溃

我也尝试设置CODEC_FLAG2_CHUNKS。avcodec_decode_video2() 然后总是返回 packet.size - 3 (??) 并且 frameFinished 永远不会设置为 1。

在我看来,每当需要来自原始 CodecContext 的设置来解码 AVPackets 时,我都会在这里遇到一个普遍的问题。对于如何解决该问题的任何提示,我将不胜感激!

编辑:有时写下您的问题有助于解决它......使用上下文结构(avcodec_copy_context)的副本并仅在接收到解码帧中的副本结果后打开编解码器。有谁知道这是否安全或最好的方法?

4

0 回答 0