我的目标是解码视频文件的多个帧,将解码后的帧累积到FIFO缓冲区中,然后再读取它们。我将数据包解码为我的AVFRame mFrame:
avcodec_decode_video2(mCodecContext,mFrame,&安培; frameFinished,&安培; mPacket);
通常我可以将YUF帧从mFrame-> data [n] [0]复制到我的FIFO缓冲区,但我只是想尽可能地减少memcpy。因此,我不想复制mFrame-> data [n] [0],而只想在缓冲区中存储mFrame(它比它指向的帧小得多),当涉及到读取时,我可以只获取它并达到数据。
我试图这样做,但它没有用。 AVFrame是从缓冲区中获取的,但是当您在屏幕上显示它们时,视频就像冻结一样。您可能会认为我使用相同的mFrame并在每次解码数据包时覆盖它,但我不是。我每次都在解码循环中创建一个新的AVFrame *。
这个问题与avcodec的工作原理有关吗?有什么想法吗?
由于 麦克
答案 0 :(得分:1)
我有同样的问题。我认为即使我们创建另一个AVFrame,它也会指向相同的内存区域(由解码器以某种方式分配)。想一想:你永远不会分配帧内存(你只分配AVFrame,这只是一个结构)。所以我试图使用av_picture_copy来完成这项工作,但它仍然没有用。因此,如果您找到解决方案,请在此处分享。