1. 程式人生 > >時間戳——入門分析

時間戳——入門分析

時間戳——入門分析

很多新手提到如何音視訊同步,最重要的就是時間戳了。這個只要入門了,以後你都會清楚一點。我也是一開始很搞不懂,搜尋了很多資料,感覺總說不到點上,要麼說的有點高深,對於新手來說很懵懂。 現在已經明白這個思路,就想分享一下,我也說的簡單易懂一點。

基礎的看這裡就行了http://blog.csdn.net/nine_locks/article/details/48007055

為了好理解,就以H264+AAC為例子。

AAC:

一幀 1024 sample。取樣率 Samplerate 44100KHz

AAC一幀的播放時間是= 1024*1000000/44100= 22.32ms(單位為ms)

這裡注意,

1000000表示是在1000000單位下,計算出來的22.32ms

H264
幀率為25的話。fps = 25.00 ,計算出來的時常為40ms.可以參考AAC的來計算。

由硬體產生的時間戳一般是系統時間,我們最多進行置0計算(也就是取到第一個時間戳記為0,讓時間戳從0開始增長),或者64位到32位的轉換(這個轉換有的需要有的不需要)。所以一般得到(25fps2個視訊時間戳之差為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

,但都需要設定這個timescale,例如:

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 的遞增。