2012-10-08 70 views
1

我的目标是解码视频文件的多个帧,将解码后的帧累积到FIFO缓冲区中,然后再读取它们。我对分组进行解码,以我的AVFRame mFrame:libavcodec将AVFrame解码到FIFO缓冲区

avcodec_decode_video2(mCodecContext,mFrame,& frameFinished,& mPacket);

正常情况下,我可以将mFrame-> data [n] [0]中的YUV帧复制到我的FIFO缓冲区,但我只是尽量减少memcpy的数量。所以不是复制mFrame-> data [n] [0]我只是想将mFrame(它比它指向的帧小得多)存储在缓冲区中,当涉及到读取时,我可以获取它并到达数据。

我试图做到这一点,但它没有奏效。 AVFrames从缓冲区中获取,但是当您在屏幕上显示它们时,视频就像冻结一样。您可能会认为我每次解码数据包时都使用相同的mFrame并覆盖它,但我不是。我每次都在解码循环中创建一个新的AVFrame *。

这个问题与avcodec的工作方式有关吗?有任何想法吗?

感谢 迈克

回答

1

我有同样的问题。我认为,即使我们创建另一个AVFrame,它也会指向相同的内存区域(由解码器以某种方式分配)。想一想:你永远不会分配帧内存(你只分配AVFrame,这只是一个结构)。所以我试图使用av_picture_copy来完成这项工作,但它仍然无法工作。所以如果你找到解决方案,请在这里分享。