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