如何在ffmpeg中使用av_frame_unref?

时间:2018-03-23 12:12:43

标签: ffmpeg

  1. 我可以创建一个AVFrame并用它来解码所有帧吗?所以我拨打av_frame_unref()一次,解码所有帧,然后拨打av_frame_alloc一次。或者我应该为{em>每个框架致电av_frame_unref / av_frame_alloc() av_frame_unref()
  2. 我应该在解码之前还是在解码之后调用av_frame_unref?
  3. 一个。

    av_frame_alloc()
    

    (解码...)

    B中。或者这个变种:

    av_frame_unref()
    

    (解码...)

    submit

2 个答案:

答案 0 :(得分:2)

  1. 通过调用AVFrame一次,您只能在整个解码/编码过程中使用一个av_frame_alloc()结构。
  2. 仅当您决定为编码/解码上下文启用引用计数时才需要
  3. av_frame_unref()
  4. 在编码/解码过程结束时使用av_frame_free()释放帧结构及其所有缓冲区。
  5. 请参阅ffmpeg的官方示例,了解如何使用它们: demuxing_decoding

答案 1 :(得分:1)

引用计算共享动态分配源的通用进程(即多个线程之间)。为了防止线程释放源并放置其他offside位置,使用此机制。主要使用与对象关联的简单原子计数器实现。

那些访问源调用addref的线程,这通常会使计数器增加1,当使用它完成的线程调用unref时,这会减少计数器(如果ffmpeg这些是{如果我没有弄错的话,{1}}和av_frame_ref

这使得确保源在使用它的线程完成之前一直有效。

最后,如果计数器达到零,这意味着没有任何用户离开,最终安全地释放了源。

希望这可以解决一些含糊不清的问题。