音訊、視訊時間戳計算及每幀播放時間
av_rescale_q用於計算Packet的PTS。av_rescale_q的返回值是一個很大的整數,且每次計算的結果間隔很大。
不同於avcodec_encode_video改變AVCodecContext *avctx的pts(小整數,且間隔小)。
av_rescale_q(a,b,c)是用來把時間戳從一個時基調整到另外一個時基時候用的函式。它基本的動作是計算a*b/c,但是這個函式還是必需的,因為直接計算會有溢位的情況發生。AV_TIME_BASE_Q是AV_TIME_BASE作為分母后的版本。它們是很不相同的:AV_TIME_BASE
* time_in_seconds = avcodec_timestamp而AV_TIME_BASE_Q * avcodec_timestamp = time_in_seconds(注意AV_TIME_BASE_Q實際上是一個AVRational物件,所以你必需使用avcodec中特定的q函式來處理它)。
H264/90000,代表時鐘頻率必須是90000
背景知識:
(一個AAC原始幀包含一段時間內1024個取樣及相關資料)
1. 視訊時間戳
pts = inc++ *(1000/fps); 其中inc是一個靜態的,初始值為0,每次打完時間戳inc加1.
在ffmpeg,中的程式碼為
pkt.pts= m_nVideoTimeStamp++ * (m_VCtx->time_base.num * 1000 / m_VCtx->time_base.den);
2. 音訊時間戳
pts = inc++ * (frame_size * 1000 / sample_rate)
在ffmpeg中的程式碼為
pkt.pts= m_nAudioTimeStamp++ * (m_ACtx->frame_size * 1000 / m_ACtx->sample_rate);
取樣頻率是指將模擬聲音波形進行數字化時,每秒鐘抽取聲波幅度樣本的次數。
。正常人聽覺的頻率範圍大約在20Hz~20kHz之間,根據奈奎斯特取樣理論,為了保證聲音不失真,取樣頻率應該在40kHz左右。常用的音訊取樣頻率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果採用更高的取樣頻率,還可以達到DVD的音質
對取樣率為44.1kHz的AAC音訊進行解碼時,一幀的解碼時間須控制在23.22毫秒內。
背景知識:
(一個AAC原始幀包含一段時間內1024個取樣及相關資料)
分析:
1 AAC
音訊幀的播放時間=一個AAC幀對應的取樣樣本的個數/取樣頻率(單位為s)
一幀 1024個 sample。取樣率 Samplerate 44100Hz,每秒44100個sample, 所以根據公式 音訊幀的播放時間=一個AAC幀對應的取樣樣本的個數/取樣頻率
當前AAC一幀的播放時間是= 1024*1000/44100= 22.32ms(單位為ms)
2 MP3
mp3 每幀均為1152個位元組, 則:
frame_duration = 1152 * 1000 / sample_rate
例如:sample_rate = 44100HZ時,計算出的時長為26.122ms,這就是經常聽到的mp3每幀播放時間固定為26ms的由來。
視訊的幀率是會變的