時間戳——入門分析
時間戳——入門分析
很多新手提到如何音視訊同步,最重要的就是時間戳了。這個只要入門了,以後你都會清楚一點。我也是一開始很搞不懂,搜尋了很多資料,感覺總說不到點上,要麼說的有點高深,對於新手來說很懵懂。 現在已經明白這個思路,就想分享一下,我也說的簡單易懂一點。
基礎的看這裡就行了http://blog.csdn.net/nine_locks/article/details/48007055
為了好理解,就以H264+AAC為例子。
AAC:
一幀 1024個 sample。取樣率 Samplerate 44100KHz
AAC一幀的播放時間是= 1024*1000000/44100= 22.32ms(單位為ms)
這裡注意,
H264:
幀率為25的話。fps = 25.00
,計算出來的時常為40ms.可以參考AAC的來計算。
由硬體產生的時間戳一般是系統時間,我們最多進行置0計算(也就是取到第一個時間戳記為0,讓時間戳從0開始增長),或者64位到32位的轉換(這個轉換有的需要有的不需要)。所以一般得到(25fps)2個視訊時間戳之差為40000(也就是duration)。進行如下轉換後變成1920。
AVRational time_base2;
time_base2.num = 1;
time_base2.den = 48000;
AVRational time_base;
time_base.num = 1;
time_base.den = 1000000;
output_packet.pts= av_rescale_q(output_packet.pts,time_base, time_base2);
av_rescale_q 這個函式的轉換,換算成公式如下:
48000*40000/1000000=1920
48000*48000/1000000=1024//aac 參考
就是吧在1000000這個單位下的40000轉換成在48000下的“40000”,也就是1920.
1000000 和 48000 就是timescale,就是時鐘tick數。就是時鐘1秒走了多少下的意思。
1000000這個的由來是:原本的pts是系統時間,us為單位。
48000這個的由來是:這個不清楚,很多都是用48000。可能更好計算吧,換成其他的也可以例如90000
在ffmpeg下就是:
AVDictionary *opt=NULL;
av_dict_set_int(&opt,"video_track_timescale",48000,0);
avformat_write_header(ofmt_ctx,&opt);
在MP4V2下就是:
MP4SetTimeScale(MP4V2_file, 48000);
Tag:
值得注意的是FLV 是流媒體,是可以進行傳輸實時播放的。所以它的時間戳一定是以真正的播放時間。例如H264-25fps 的就是40 的遞增。