音视频同步#
1. 时间戳#
- DTS: decoding time stamp 解码时间戳
- PTS: presentation time stamp 显示时间戳
视频采用H264编码,其解码和显示顺序可能是不一样的,所以其DTS和PTS是不一样的;音频不存在这个问题,音频的DTS和PTS是一样的,对于音频通常我们只说PTS。
1.1 音频时间戳#
- frame_size: 音频帧的大小,也就是一段特定时长的音频,比如2.5, 5, 10, 20, 40 or 60 ms,一般是采样的时候用这个名词
- time_interval: 时间间隔,播放一帧音频数据需要的时间,大小与frame_size相等,一般是播放的时候用这个名词
- frame_byte_size:一帧音频按照字节存储的大小
例如:
48k 2ch 16bit frame_size 为 10ms
那么一帧数据(10ms)所占用的存储空间是:
frame_byte_size = (frame_size/1000ms) * 48k * channel_num * (sample_resolution/8)
= (10ms/1000ms) * 48K * 2 * 2
= 1920 Byte
- sample_rate: 音频的采样率,常用的有:8000,16000,44100,48000
- sample_resolution:采样位数
-
channel_num:通道数
-
pts: 时间戳
// sample_resolution/8:如果采样位数是16 bit,那么就是16/8=2 Byte
time_interval(ms) = frame_byte_size/channel_num/(sample_resolution/8) * 1000 / sample_rate (ms)
pts(ms) = audio_index++ * time_interval (ms)
= audio_index++ * frame_size (ms)
例如:
48k 2ch 16bit frame_size 为10ms
那么一帧数据(10ms)所占用的存储空间是:
frame_byte_size = (frame_size/1000ms) * 48k * channel_num * (sample_resolution/8)
= (10ms/1000ms) * 48K * 2 * 2
= 1920 Byte
反过来说,假如:
一段音频数据的大小是1920 Byte,其采样参数是:48k 2ch 16bit
那么这段音频的大小(时长)是:
frame_size(ms)
= frame_byte_size/channel_num/(sample_resolution/8) * 1000 / sample_rate (ms)
= 1920/2/(16/8)*1000/48000 (ms)
= 10ms
1.2 视频时间戳#
- fps: 视频帧率
pts(ms) = video_index++ * 1000 / fps (ms)