有很多的采集卡,摄像头,在做采集的时候,明明设置的25FPS,但实际采集数据回调过来,发现并不是40毫秒的间隔,而是50,60,甚至100不等的时间间隔。
这就给编码后打时间戳带来很大的困难。
在libav里,我们的默认编码参数都是:
ptAvEncoder->ptAvStreamVideo->codec->time_base.den = 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)s32Fps);
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,所以也化成了毫秒单位。
编解码信息列表
1.2参数列表
封装格式参数
输入类型:输入视音频采用的传输协议。举例:RTP,FILE(文件),HTTP,RTMP。
封装格式:视音频采用的封装格式。举例:AVI,FLV,MKV,RMVB。
比特率:视音频的码率。举例1Mbps。
时长:视音频的时间长度。
MetaData:视音频元数据信息。
视频参数
输出像素格式:解码后像素数据格式。举例:YUV420P,RGB24,UYVY。
编码方式:视频采用的压缩编码标准。举例:H.264,MPEG2。
帧率:每秒钟视频画面数。举例:25fps。
画面大小:画面的分辨率。举例:1920x1080,720x576。
解码分析:以列表的形式显示每个视频帧的详细信息。
音频参数
采样率:每秒钟采样点个数。举例:44.1kHz,48kHz。
编码方式:音频采用的压缩编码标准。举例:AAC,MP3,WMA。
声道数:声道数量。
解码分析:以列表的形式显示每个音频帧的详细信息。