当前位置: 首页 > news >正文

ffmpeg 问答系列-> mux 部分


author: hjjdebug
date: 2025年 08月 24日 星期日 09:47:08 CST
descrip: ffmpeg 问答系列-> mux 部分


文章目录

  • 1. frame->pts 和 packet->pts 是什么关系?
  • 2 问pts 和 dts, 哪一个时间戳是严格递增的?
  • 3. av_interleaved_write_frame 的工作原理

mux 部分对frame 的pts, packet的pts, dts 要求十分严格,
这里对时间戳概念pts,dts进行一下辨析.
pts 是演播时间戳. dts 是解码时间戳. 时间戳的基准单位根据上下文可以自己设置.
frame中有时间戳pts,
packet中不仅有pts, 还有dts.

mpeg 音频frame 被编码为packet,

1. frame->pts 和 packet->pts 是什么关系?

一般是直接copy 的关系, 但也有可能差一个偏移.
对mpegaudio 而言, 其关系为:
参考代码: libavcodec/mpegaudioenc_template.c:773
if (frame->pts != AV_NOPTS_VALUE)
avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding)

其中avctx->initial_padding 是481, 所以pkt->pts 总是比frame->pts 小481
当frame->pts=0时, pkt->pts=-481

mpeg 视频frame 被编码为packet, packet有pts 和 dts,

2 问pts 和 dts, 哪一个时间戳是严格递增的?

首先frame->pts 是严格递增的,它就是frame的个数.
然后看一下实测结果. mpeg2 编码视频.
从实验中看出, pkt->dts 是严格递增的.

vframe->pts:0    第一个frame, 被缓存,编不出pkt
--
vframe->pts:12个frame, 被缓存,编不出pkt
--
vframe->pts:22个frame, 得pkt->pts=0, pkt->dts=-1
只所以有dts, 解码时间戳,或者说为什么引入dts概念, 就是要你按解码时间戳来解码, 它是严格递增的.
pts 由于有b帧的存在, 呈现小幅波动, 例如测试的编码例子为0,3,1,2,6,4,5,9... 像喝醉酒一样往上长!pkt before rescale, pts:0,dts:-1
--
vframe->pts:3
pkt before rescale, pts:3,dts:0
--
vframe->pts:4
pkt before rescale, pts:1,dts:1
--
vframe->pts:5
pkt before rescale, pts:2,dts:2
--
vframe->pts:6
pkt before rescale, pts:6,dts:3
--
vframe->pts:7
pkt before rescale, pts:4,dts:4
--
vframe->pts:8
pkt before rescale, pts:5,dts:5
--
vframe->pts:9
pkt before rescale, pts:9,dts:6
--
vframe->pts:10
pkt before rescale, pts:7,dts:7
--
vframe->pts:11
pkt before rescale, pts:8,dts:8
--
vframe->pts:12
pkt before rescale, pts:12,dts:9

3. av_interleaved_write_frame 的工作原理

ret = av_interleaved_write_frame(fmt_ctx, pkt);

  1. 检查并修正输入AVPacket的pts/dts
  2. 设置有pkt 的链表缓冲, 通过ff_interleave_packet_per_dts默认算法按解码时间戳(DTS)排序.
  3. 先缓存数据包,当时间戳满足连续性条件时批量写入. 例如音视频包都存在且满足连续性条件.开始写入.
  4. 由AVFormatContext->max_interleave_delta参数控制最大缓冲时长. 超过该容忍度强制写入.
    里边内容还是挺多的, 可以调试源码获得第一手资料.
http://www.dtcms.com/a/348277.html

相关文章:

  • 启动Flink SQL Client并连接到YARN集群会话
  • Node.js自研ORM框架深度解析与实践
  • 柱状图中最大的矩形+单调栈
  • STM32 入门实录:macOS 下从 0 到点亮 LED
  • Java全栈开发面试实录:从基础到实战的深度探讨
  • 微服务-19.什么是网关
  • 【论文阅读】AI 赋能基于模型的系统工程研究现状与展望
  • Redis--day12--黑马点评--附近商铺用户签到UV统计
  • Excel 表格 - 合并单元格、清除单元格格式
  • 包裹堆叠场景漏检率↓79%!陌讯多目标追踪算法在智慧物流的实践优化
  • EXCEL实现复制后倒序粘贴
  • 暗影哨兵:安全运维的隐秘防线
  • 深度学习部署实战 Ubuntu24.04单机多卡部署ERNIE-4.5-VL-28B-A3B-Paddle文心多模态大模型(详细教程)
  • 用墨刀开发能碳管理系统 —— 从流程图到设计稿全流程拆解
  • EAM、MES和CRM系统信息的整理
  • c语言指针学习
  • C文件编译
  • IQC、IPQC、PQC、FQC、OQC在ERP/MES/WMS中的系统协同
  • 【SBP】Unity 打包构建管线原理解析于对比
  • 什么是服装企业管理软件?
  • 【Canvas与旗帜】金波浪圈法兰西国旗
  • 广告业务连续四季度双位数增长,B站做了什么?
  • DAY 51 复习日+退款开始
  • 数据挖掘 4.8 评估泛化能力
  • 【DeepResearch调研】基于知识图谱与数据合成的大语言模型幻觉缓解研究前沿
  • C++ Core Guidelines: 最佳实践与深入解析
  • 服务器硬件电路设计之 SPI 问答(五):服务器场景下的ESD防护策略与通信故障诊断指南
  • Flink元空间异常深度解析:从原理到实战调优指南
  • LLM实践系列:利用LLM重构数据科学流程07 - 工程化实践与挑战
  • 计算机网络基础(三) --- TCP/IP网络结构(运输层)