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_frame | av_write_frame |
|---|---|---|
| 数据排序 | 自动按 DTS 排序并缓冲 | 直接写入,无排序逻辑 |
| 适用场景 | 需严格时序的多轨道文件或流媒体 | 用户自行管理交错顺序的场景 |
| 性能开销 | 较高(需缓存和排序) | 较低 |
| 引用计数处理 | 自动接管 AVPacket 引用所有权 | 需手动管理引用34 |
7. 注意事项
- 引用计数
若AVPacket是引用计数的,函数会接管其所有权并在适当时机释放37。 - 错误处理
返回AVERROR(EAGAIN)时需继续调用直至数据写入完成4。 - 头尾写入
需在avformat_write_header和av_write_trailer之间调用此函数48。
此方法一看就是要有了avpacket的时候,就调用一次,我们在写入文件的时候测试一下。 todo
2198

被折叠的 条评论
为什么被折叠?



