aac 和 h264等的时间戳
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了aac 和 h264等的时间戳相关的知识,希望对你有一定的参考价值。
aac 时间戳
aac:高级音频编码,采样率一般为44100,那如何算时间戳呢?一般来说,大家都会这样计算:1024*1000/44100 = 23 毫秒, 那这个1024 从何而来?
1024 是指的nb_sample, 就是从中选择1024个字节进行编码, 而根据采样率来说,一秒钟产生44100字节,那1024占多少呢,就是1024/44100, 乘以1000,转化成了毫秒。了解了这个,也就是可以产生正确的时间戳了。
对于RTP协议来说,直接传输1024间隔作为时间戳就行。
h264 h265 时间戳
RTP协议和其他协议是不一样的,如果是使用RTP协议,音频的时间戳和视频的时间戳都需要调整。对于视频,我们给出一个计算公式代码
static uint32_t convertToRTPTimestamp(/*struct timeval tv*/)
timeval tv;
gettimeofday(&tv, NULL);
UINT32 timestampIncrement = (90000 * tv.tv_sec);
timestampIncrement += (UINT32)((2.0 * 90000 * tv.tv_usec + 1000000.0) / 2000000);
//UINT32 const rtpTimestamp = timestampIncrement;
return timestampIncrement;
这是h264 h265 等编码计算时间戳的函数,可以明显看出乘了一个90000,为什么,因为90000乘了以后可以成为一个整数,那么0, 4500,9000,13500 的这个整数怎么计算帧率的,x * 90000 = 4500 ,那么 x = 4500/90000 = 1/20, 很明显,相隔 二十分之一秒,此刻你一看就知道是一秒钟20帧。
RTMP协议时间戳
对于像RTMP等协议时间戳呢,它是使用相对和绝对时间戳,第一个是绝对时间戳,后面使用相对时间戳,也就是相对于第一个绝对时间的相对时间戳。像这类协议的时间戳,是使用正常的时间戳的。
ffmpeg
ffmpeg里面是否可以直接使用当前相对时间戳?也是和协议有关。对于RTMP 推流和RTSP推流来说,要遵循协议,RTSP协议显然要遵守RTP协议时间戳,RTMP 使用正常的时间戳,可以使用0,然后跟着逝去的时间就行,也就是绝对时间戳使用0,相对时间戳使用相对于零点的时间差。
以上是关于aac 和 h264等的时间戳的主要内容,如果未能解决你的问题,请参考以下文章