FFMPEG之时间戳计算

FFMPEG之时间戳计算

   因为公司项目需求,需要将HEVC 视频裸码流  和 G711A 音频裸码流 封装到MP4容器中,但是FFMPEG 并不支持将G711A 格式音频 封装到MP4中,需要将G711A 格式音频转换成AAC格式的音频,再封装到MP4容器中,或者修改FFMPEG 的源码(不是本文重点) 。在封装过程中音频数据 和视频数据都需要打上解码时间戳,显示时间戳,一帧的时长,这就需要计算每帧的时间戳。

FFMPEG 中 视频时间戳的计算

   在FFMPEG中可以区分 视频流 和 音频流。同时每个媒体流 都有一个时间基数,一般的MP4 的视频流的时间基数是90000,这个时间基数 在封装的时候可以自己定义,这个时间基数可以这么理解,一把尺子一厘米包含了10个小刻度,同理,时间基数 是指 1秒钟 包含了 90000 个 刻度,如果是固定帧率的情况下,假设 设计的视频流 的帧率是 15,那么一帧视频 就 占用了 90000/15 = 6000 个时间刻度,那么FFMPEG 中 视频流的时间戳的计算 pts = frame_no(当前帧数) * 6000,如果 数据中没有 B帧 数据,那么可以认为 dts 和 pts 相同,如果是 可变帧率 ,就需要统计每秒的帧数,来计算 一帧 数据占用的刻度数,由于 每一帧占的刻度数不一样了,不能简单的 用帧数 * 刻度数,而是 使用累加 计算 pts += 90000/帧数,dts 和 pts 相同。 这个算法的时间戳的误差在两秒左右,应该可以接受。

FFMPEG 中 音频时间戳计算

在计算音频时间戳之前先了解下 和音频相关的几个名词。
**采样率:一秒内 音频的采样频率  sample_rate
采样数:一帧音频的采样数,也是一帧的大小  frame_size**
AAC 格式的音频的 一帧 采样数 是 1024,而采样率 是我们自己设置的,一般 有 44100,48000,32000,16000,8000,等需要根据裸流中采样率来确定,假如已经确定 了 采样率 是16000,那么音频一帧的耗时是 1024/16000 这里单位是秒,这里有个技巧,我们在音频流中设置时间基数为我们的采样率,那么 每帧音频数据占用 1024 个 刻度,就和我们的 采样数 相同,我们就不需要去做过多计算 。那么 FFMPEG 中 音频时间戳 pts = frame_no (当前帧数)* 1024,也就是 **pts  = frame_no * frame_size / sample_rate * time_base**
音频帧 的 播放时间 等于 采样数 / 采样率 (frame_size/sample_rate)
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值