tbr tbn tbc 的意思
因為最近的工作需要從MP4視頻中提取一些關(guān)鍵幀,要了解如何將視頻的時間點轉(zhuǎn)換為對應(yīng)的幀號,所以查閱了一些關(guān)于視頻編解碼以及時間同步方式的資料。再此總結(jié)一下。
首先是解碼,利用FFmpeg解碼得到的信息通常如下:
Metadata:
????major_brand?????: isom
????minor_version???: 512
????compatible_brands: mp41
????title??????:??Digital Tipping Point
????date???????????: 2008
????encoder???????: Lavf51.10.0
????comment??????: license:??http://creativecommons.org/licenses/by-sa/3.0/
??Duration: 00:03:44.29, start: 0.000000, bitrate: 579 kb/s
????Stream #0.0(und): Video: h264, yuv420p, 360×240 [PAR 1:1 DAR 3:2], 511 kb/s, 29.97 fps, 29.97 tbr, 2997 tbn, 59.94 tbc
????Stream #0.1(und): Audio: aac, 32000 Hz, stereo, s16, 64 kb/s
Output #0, image2, to ‘?’:
????Stream #0.0: Video: mjpeg, yuvj420p, 360×240, q=2-31, 100000 kb/s, 90k tbn, 59.94 tbc
而我只關(guān)注了其中部分信息,主要是與幀率和時間同步相關(guān)的信息。
1. 顏色編碼:其中YUV420是視頻中通常采用的顏色編碼方式,Y表示亮度,而U,V則與顏色相關(guān),而420則分別對應(yīng)著存儲相應(yīng)分量所占用的比特數(shù)之比。其實采用這種編碼方式就是為了早期彩色電視與黑白電視能更好的相容,更多具體內(nèi)容參見百度百科相應(yīng)詞條。
2. 幀率相關(guān)信息:
上例中的fps, tbr, tbn, tbc等參數(shù)分別代表的含義如何,如果我要完成時間點與幀號的轉(zhuǎn)換就需要找出合適的參數(shù)。參閱了某bbs,得到以下信息:
tbn is the time base in AVStream that has come from the container, I
think. It is used for all AVStream time stamps.
tbc is the time base in AVCodecContext for the codec used for a
particular stream. It is used for all AVCodecContext and related time
stamps.
tbr is guessed from the video stream and is the value users want to see
when they look for the video frame rate, except sometimes it is twice
what one would expect because of field rate versus frame rate.
fps 自然的是 frame per second,就是幀率了。
所以tbn和tbc應(yīng)該都是在相應(yīng)層上的時間單元,比如tbn=2997就相當(dāng)于在視頻流層把1s的時間分成了2997個時間單元,如此精細(xì)可以更好的與其他流比如音頻流同步,對應(yīng)著fps=29.97就表示每100個時間單元中有一幀。
3. 時間同步方式:
問題來了:fps=29.97這是一個小數(shù)啊,我如果直接利用公式 frame number = time * fps 得到了也不是一個整數(shù)啊,而幀號應(yīng)該是一個整數(shù)才對。
首先,29.97f/s這個變態(tài)的數(shù)是如何得到的?這起源于早期的NTSC電視制式,而現(xiàn)代的數(shù)字編碼只是為了兼容而沿用了它的標(biāo)準(zhǔn)。其實在標(biāo)準(zhǔn)制定時,NTSC采用的是30f/s的幀率,只是后來為了消除由彩色信號及伴音信號所產(chǎn)生的圖像干擾,每秒幀幅由30幀稍微下調(diào)至29.97幀,同時線頻由15750Hz稍微下降至15734.26Hz。欲知詳情,參看Wikipedia:link。
然后,帶小數(shù)點的幀率如何實現(xiàn)呢,顯然每一秒不可能顯示相同個數(shù)的幀。實際上存在著叫做SMPTE Non-Drop-Frame和SMPTE Drop-Frame的時間同步標(biāo)準(zhǔn),也就是說在某些時候,會通過丟掉一些幀的方式來將時間同步上。
比如剛才提到的29.97幀率,我們可以計算:29.97 f/sec = 1798.2 f/min = 107892 f/hour;
對于30f/s的幀率我們可以計算: 30 f/s = 1800 f/s = 108000 f/hour;
這樣,如果利用每秒30幀的速度來采集視頻,而用29.97f/s的速率來播放視頻,每個小時就少播放了108幀,這樣播放時間會比真實時間變慢。為了解決這個問題,SMPTE 30 Drop-Frame就采取了丟掉這108幀的方式,具體策略是每1分鐘丟兩幀,如果是第10分鐘則不丟,所以每小時丟掉的幀數(shù)是:2×60 – 2×6 = 108 幀。更具體的信息,可以參考:link1,?link2。
唉,多么麻煩,如果采集播放都采用30f/s不就省事兒多了,可是技術(shù)的事情總是面臨著向前兼容的問題,就像鐵路與馬屁股的故事一樣!
http://topic.csdn.net/u/20091225/09/0a7499ce-7015-40fb-9c9d-f8628d0fe275.html
25 tbr代表幀率;1200k tbn代表文件層(st)的時間精度,即1S=1200k,和duration相關(guān);50 tbc代表視頻層(st->codec)的時間精度,即1S=50,和strem->duration和時間戳相關(guān)。
不是所有參數(shù)都能得到的,有的文件沒有這些信息,要看解析層而定。這是代碼中的內(nèi)容:
???? if(st->codec->codec_type == CODEC_TYPE_VIDEO){
???????? if(st->r_frame_rate.den && st->r_frame_rate.num)
???????????? print_fps(av_q2d(st->r_frame_rate), "tbr");
???????? if(st->time_base.den && st->time_base.num)
???????????? print_fps(1/av_q2d(st->time_base), "tbn");
???????? if(st->codec->time_base.den && st->codec->time_base.num)
???????????? print_fps(1/av_q2d(st->codec->time_base), "tbc");
???? }
總結(jié)
以上是生活随笔為你收集整理的tbr tbn tbc 的意思的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机淘宝宝贝详情页《问大家》数据爬虫手把
- 下一篇: Linux——LDAP(相当于Windo