如何计算MP3总时长的问题(三)--对于变比特率MP3求总时长
??????? 3、變比特率MP3總時(shí)長(zhǎng)求解
???????? 之前我們所討論的都是對(duì)于一個(gè)固定比特率(CBR)的MP3進(jìn)行求總時(shí)長(zhǎng),由于固定比特率的特殊性,很容易第一幀的幀頭就能知道整個(gè)MP3的信息,但是對(duì)于變比特率(VBR)的MP3,比特率和幀長(zhǎng)都不是固定的,所以我們就不能用之前的公式來(lái)計(jì)算總時(shí)長(zhǎng)。
???????? 其實(shí)在第一幀的幀頭后面還存著VBR的一些信息,里面存著文件長(zhǎng)度,總幀數(shù)等信息,從而使我們很快算出變比特率的總時(shí)長(zhǎng),方法如下:
??????? 1)XING頭標(biāo)志
由于VBR是XING公司推出的算法,所以在MP3的第一幀里會(huì)有"XING"或者"Info"的關(guān)鍵字,具體格式
| ???????????? 位置 | ????? 長(zhǎng)度(字節(jié)) | ????????????????????????????????????? 含義 |
| 0 | 4 | 包含ASCII的字符XING或者Info,沒(méi)有NULL結(jié)尾 |
| 4 | 4 | 標(biāo)識(shí)位 0x0001 - 存在總幀數(shù)(Frames)字段 |
| 8 | 4 | 若標(biāo)識(shí)位存在總幀數(shù),那么這四個(gè)字節(jié)就是總幀數(shù) |
| 12 | 4 | 若標(biāo)識(shí)位存在文件大小,那么這四個(gè)字節(jié)就是文件大小 |
還有別的信息,這里不需要,我就不在這里說(shuō)了。
???????? 2) VBRI頭標(biāo)志
還有一種頭也同樣標(biāo)識(shí)和XING類(lèi)似,只是有"VBRI"的關(guān)鍵字,具體格式
| ???????? 位置 | ??? 長(zhǎng)度(字節(jié)) | ????????? 含義 |
| 0 | 4 | 包含ASCII的字符VBRI,沒(méi)有NULL結(jié)尾 |
| 10 | 4 | 文件大小 |
| 14 | 4 | 總幀數(shù) |
我只寫(xiě)了對(duì)總時(shí)長(zhǎng)有需要的位置,其他的暫時(shí)沒(méi)用到,就不提了,不過(guò)可以討論。
??? 3)確定標(biāo)志頭位置
? 知道的有這樣的標(biāo)志頭可以幫助我們很快找到需要的信息,那么如何定位呢,公式如下:
標(biāo)志頭位置 = MPEG 頭位置 +? MPEG幀頭大小(4字節(jié))+ 邊信息大小
對(duì)于邊信息,我們可以根據(jù)頭中所給J位置上2個(gè)字節(jié)得到
mode = (header>>6)&0x03
其中:'00'? Stereo; '01'? Joint Stereo (Stereo);?? '10'? Dual channel (Two mono channels);
???????????? '11'? Single channel (Mono).
???????????????????????????????????????????????????????????????????????????? MPEG 1?????????????????????????????????? MPEG2/2.5
Stereo ,Joint Stereo? Dual channel????????? 32??????????????????????????????????????????????????? 17
Mono??????????????????????????????????????????????????????????????????? 17????????????????????????????????????????????????????? 9
現(xiàn)在已經(jīng)很清楚了,我們就能定位出來(lái)頭標(biāo)志,然后讀出我們需要的總幀數(shù),之前一屆我已經(jīng)介紹了每幀持續(xù)時(shí)間,因此
VBR的MP3總時(shí)長(zhǎng)(毫秒) =? 總幀數(shù)*每幀持續(xù)時(shí)間
?
到此不知道我講的清楚不清楚,這也是我通過(guò)自己做,和看別人的文檔總結(jié)的一些,希望能幫助到需要的人,有什么問(wèn)題可以和我討論。
???????? 這個(gè)準(zhǔn)確度還是比較高的,前提是從幀頭中讀到的信息是正確有效的,呵呵,我測(cè)得大部分MP3還是比較正確的,如果真的要準(zhǔn)確,那就預(yù)讀一遍MP3文件,把每一幀的找到,累加得到幀數(shù),我做MP3幀索引表的時(shí)候就這么搜的,其實(shí)對(duì)于小文件還是比較快的。
轉(zhuǎn)載于:https://www.cnblogs.com/candycaicai/archive/2010/11/26/1889085.html
總結(jié)
以上是生活随笔為你收集整理的如何计算MP3总时长的问题(三)--对于变比特率MP3求总时长的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 人人开源项目拉取
- 下一篇: switchHost工具的使用