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等的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

FLV文件(H264 + AAC)格式超详细分析

FLV文件(H264 + AAC)格式超详细分析

iOS音频AAC视频H264编码 推流最佳方案

h264 aac mux flv

在 mp4 中使用 gstreamer h264 + aac 录制只会产生部分可播放的文件

(原)从mp4,flv文件中解析出h264和aac,送解码器解码失败