ffmpeg 写入avpacket时候,即av_interleaved_write_frame方法是如何不需要 业务层释放avpacket的 逻辑分析

时间:2025-05-14 11:30:28

我们在通过 av_interleaved_write_frame方法 写入 avpacket的时候,通常不需要关心 avpacket的生命周期。

本文分析一下内部实现的部分。

----> 代表一个内部实现。

A(){

        B();

        C();

}

B(){

        D();

}

表示为:

A

---->B();

        ---->D();

---->C();

int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)

---->write_packets_common(s, pkt, 1/*interleaved*/);

        ---->write_packet_common(s, st, pkt, interleaved);

                ---->interleaved_write_packet(s, pkt, 0);

                        ---->interleave_packet(s, &opkt, pkt, flush); 生命周期此方法内部

                                ---->ff_interleave_packet_per_dts(s, out, in, flush);

                                        ---->ff_interleave_add_packet(s, pkt, interleave_compare_dts)

                                                ----> av_packet_move_ref(&this_pktl->pkt, pkt);//就是这里

                        ---->pkt = NULL;//最后还置为nullptr了