收藏 分享(赏)

DTS和PTS的解释.doc

上传人:精品资料 文档编号:9679408 上传时间:2019-08-23 格式:DOC 页数:4 大小:102.18KB
下载 相关 举报
DTS和PTS的解释.doc_第1页
第1页 / 共4页
DTS和PTS的解释.doc_第2页
第2页 / 共4页
DTS和PTS的解释.doc_第3页
第3页 / 共4页
DTS和PTS的解释.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、DTS 和 PTS 的解释FFmpeg 里有两种时间戳:DTS(Decoding Time Stamp)和PTS(Presentation Time Stamp) 。 顾名思义,前者是解码的时间,后者是显示的时间。要仔细理解这两个概念,需要先了解 FFmpeg 中的 packet 和 frame 的概念。FFmpeg 中用 AVPacket 结构体来描述解码前或编码后的压缩包,用AVFrame 结构体来描述解码后或编码前的信号帧。 对于视频来说,AVFrame就是视频的一帧图像。这帧图像什么时候显示给用户,就取决于它的PTS。DTS 是 AVPacket 里的一个成员,表示这个压缩包应该什么时

2、候被解码。 如果视频里各帧的编码是按输入顺序(也就是显示顺序)依次进行的,那么解码和显示时间应该是一致的。可事实上,在大多数编解码标准(如 H.264 或HEVC,当出现 B 帧的时候)中,编码顺序和输入顺序并不一致。 于是才会需要 PTS 和 DTS 这两种不同的时间戳。视频帧根据帧率,在同一时间基上累加,例如,25 帧每秒,则按毫秒计, 1000/25=40ms,在首帧 pts 上进行累加音频根据采样率及样本个数,在同一时间基上累加,例如,1024 个样本,44100 采样率,毫秒计,1000*1024/44100=23.21995464852607709750566893424 ms基本

3、理论是这样,但实际的同步远没有这么简单,掉线,断网,弱网,丢帧,跳帧,等一系列均对你的同步进行阻挠,需要根据具体情况做同步,坐等高手给出较为鲁棒的同步措施。一 固定帧率1. 视频时间戳pts = inc+ *(1000/fps); 其中 inc 是一个静态的,初始值为 0,每次打完时间戳 inc 加 1.在 ffmpeg,中的代码为pkt.pts= m_nVideoTimeStamp+ * (m_VCtx-time_base.num * 1000 / m_VCtx-time_base.den);2. 音频时间戳pts = inc+ * (frame_size * 1000 / sample_r

4、ate)在 ffmpeg 中的代码为pkt.pts= m_nAudioTimeStamp+ * (m_ACtx-frame_size * 1000 / m_ACtx-sample_rate);采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。正常人听觉的频率范围大约在 20Hz20kHz 之间,根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在 40kHz 左右。常用的音频采样频率有8kHz、11.025kHz 、22.05kHz、16kHz 、37.8kHz、44.1kHz、48kHz 等,如果采用更高的采样频率,还可以达到 DVD 的音质对采样率为 44.1kHz

5、 的 AAC 音频进行解码时,一帧的解码时间须控制在 23.22毫秒内。背景知识:(一个 AAC 原始帧包含一段时间内 1024 个采样及相关数据)分析:1 AAC音频帧的播放时间=一个 AAC 帧对应的采样样本的个数 /采样频率(单位为 s)一帧 1024 个 sample。采样率 Samplerate 44100KHz,每秒 44100 个 sample, 所以 根据公式 音频帧的播放时间=一个 AAC 帧对应的采样样本的个数/采样频率当前 AAC 一帧的播放时间是= 1024*1000000/44100= 22.32ms(单位为 ms)2 MP3mp3 每帧均为 1152 个字节, 则:

6、frame_duration = 1152 * 1000000 / sample_rate例如:sample_rate = 44100HZ 时, 计算出的时长为 26.122ms,这就是经常听到的 mp3 每帧播放时间固定为 26ms 的由来。二 可变帧率有很多的采集卡,摄像头,在做采集的时候,明明设置的 25FPS,但实际采集数据回调过来,发现并不是 40 毫秒的间隔,而是 50,60,甚至 100 不等的时间间隔。这就给编码后打时间戳带来很大的困难。在 libav 里,我们的默认编码参数都是:ptAvEncoder-ptAvStreamVideo-codec-time_base.den =

7、 s32Fps;ptAvEncoder-ptAvStreamVideo-codec-time_base.num = 1;这样在编码后的时间戳以 1 递增,只适合于固定帧率。我们来改一下:ptAvEncoder-ptAvStreamVideo-codec-time_base.den = s32Fps * 1000;ptAvEncoder-ptAvStreamVideo-codec-time_base.num = 1* 1000;这样就把时间戳的 scale 变成了毫秒,就可以以毫秒为单位进行计算了,如下:tAvPacket.pts = (s64)u32TimeStamp * (s64)s32Fp

8、s);u32TimeStamp 是从开始记录的时间差值,以毫秒为单位;s32Fps 是帧率。对于音频,mp4 文件默认是采样率为 tick 的,时间戳计算为:tAvPacket.pts = (AvEncoderAudioInSizeGet(hHandle) * ( (s64)(u32TimeStamp) / (AvEncoderAudioInSizeGet(hHandle) * 1000 / ptAvEncoder-ptAvStreamAudio-codec-sample_rate);AvEncoderAudioInSizeGet(hHandle) 每次编码器需要的 PCM 数据长度。u32TimeStamp 是从开始记录的时间差值,以毫秒为单位。ptAvEncoder-ptAvStreamAudio-codec-sample_rate PCM 采样率,代表一秒的数据量。因为乘以了 1000,所以也化成了毫秒单位。对于 mp4,视频直接用绝对时间,音频用数据量,对 rtmp,视频是毫秒计算,音频也换算成毫秒计算

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报