复用时常用api--av_interleaved_write_frame

int av_interleaved_write_frame(AVFormatContext *fmt_ctx, AVPacket *pkt);
 

1. 核心功能

  • 数据排序与同步
    该函数将编码后的 AVPacket 按时间戳(DTS)排序后写入输出文件或流,确保音视频数据的正确交错(interleaving)和播放顺序。
  • 自动缓冲机制
    内部通过缓存和调整数据包的时序,避免因乱序写入导致播放异常

2. 参数说明

  • fmt_ctx: 输出文件的格式上下文(AVFormatContext),包含输出流和容器格式信息23。
  • pkt: 待写入的 AVPacket,需包含编码后的数据及时间戳(PTS/DTS)等元信息23。

3. 返回值

  • 0 表示成功,负值为错误码(如 AVERROR_EOF 或 AVERROR(EAGAIN))24。

4. 内部工作机制

  • 时间戳处理
    自动修正数据包的 dts 和 pts,确保输出文件的时间戳连续性。
  • 比特流过滤
    调用 do_packet_auto_bsf 函数处理比特流过滤逻辑(如 H.264 的 Annex B 格式转换)。
  • 交错排序算法
    若容器未实现自定义交错逻辑,默认使用 ff_interleave_packet_per_dts 按 DTS 排序。

5. 典型使用场景

  • 流媒体输出
    与 avio_open 结合使用,支持 RTMP/RTSP 等协议的实时推流5。
  • 多轨道媒体文件
    适用于包含音视频混合的 MP4/MKV 等格式,防止因写入顺序错误导致播放器解析失败24。
  • 网络传输优化
    在服务器断开时需检查编码参数或网络连接状态5。

6. 与 av_write_frame 的区别

特性av_interleaved_write_frameav_write_frame
数据排序自动按 DTS 排序并缓冲直接写入,无排序逻辑
适用场景需严格时序的多轨道文件或流媒体用户自行管理交错顺序的场景
性能开销较高(需缓存和排序)较低
引用计数处理自动接管 AVPacket 引用所有权需手动管理引用34

7. 注意事项

  • 引用计数
    若 AVPacket 是引用计数的,函数会接管其所有权并在适当时机释放37。
  • 错误处理
    返回 AVERROR(EAGAIN) 时需继续调用直至数据写入完成4。
  • 头尾写入
    需在 avformat_write_header 和 av_write_trailer 之间调用此函数48。

此方法一看就是要有了avpacket的时候,就调用一次,我们在写入文件的时候测试一下。 todo

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值