如何計算VBR MP3的播放時間/持續(xù)時間【未完待續(xù)】
2009-09-01 18:26
先聊幾句閑話,最近遇到這個問題,百度找到的資料,極個別能說清楚一點的,最后還是找到了,很久之前看到的一個英文帖子,說的比較清楚,并且還有實例代碼。在此感謝之。另外也有點無語,中文資料,的確是沒幾個人去說清楚。。。
而且,下列解釋,主要也就是參考了這個帖子。
MPEG Audio Frame Headerhttp://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx【MP3的一些基礎(chǔ)知識】
想要了解如何計算VBR的MP3的播放時間之前,要簡單了解一些MP3文件的一些基本概念:
1.幀:通俗點說,就是一段連續(xù)的數(shù)據(jù)塊。是MP3文件,也是其他很多音視頻技術(shù)中的基本概念。
MP3是由很多很多個這樣的幀所組成的。
2.幀頭:數(shù)據(jù)幀的頭。也就是,專門在數(shù)據(jù)幀里面,有頭部有一些數(shù)據(jù),具體不同的位對應不同的含義,用于描述MP3文件的一些參數(shù)信息或者當前數(shù)據(jù)幀的信息。用于解碼。
3.采樣率:每秒采樣多少。
4.CBR和VBR:即Constantbitrate (CBR)固定(/不變)比特率,和Variable bitrate (VBR)不定比特率。說的是MP3的比特率是否固定。
更詳細的信息,請自己查找相關(guān)資料。
【CBR的MP3的播放時間計算方法】
這個,網(wǎng)上資料相對多點,此處簡單說一下我的理解,主要也就是翻譯那個英文帖子了。。。
MP3播放時間=MP3的文件大小FileSize/幀大小FrameSize * 每一幀的時間SecPerFrame
其中的Frame Size = ( (Samples Per Frame / 8 * Bitrate) / Sampling Rate) + Padding Size
而其中的Samples Per Frame和bitrate以及Sampling Rate,Padding Size,
都是可以直接從MPEG的幀頭中,按照格式一點點分析出來的。然后,對于MP3播放時間,就可以直接計算出來了。
【如何計算VBR MP3的播放時間】
真是對此問題感興趣的人,總的來說,都是已經(jīng)知道了上面說的如何計算CBR的MP3的播放時間之后,但是對于VBR的計算方法不清楚,才會來關(guān)注這個問題的。
位置
長度
含義
示例
0
11
用于同步幀,找到此幀頭(所有位均置1)
1111 1111 111
11
2
音頻版本ID (參見 表3.2)
00 - 版本是MPEG 2.5 (MPED-2的非官方擴展版本)
01 – 保留
10 – 版本是MPEG 2 (ISO/IEC 13818-3)
11 – 版本是MPEG 1 (ISO/IEC 11172-3)
11
13
2
Layer 的索引
00 – 保留
01 - Layer III
10 - Layer II
11 - Layer I
01
15
1
保護位
0 – 用16位的CRC保護下面的幀頭
1 – 無CRC
1
16
4
比特率索引 (參見 表2.1.3)
1001
20
2
采樣率索引 (參見表2.1.2)
11
22
1
填充位
如果設(shè)置了,就會對每幀數(shù)據(jù)填充一個slot (對于幀大小的計算很重要)
0
23
1
私有位 (僅用于標示性的)
1
24
2
聲道的模式
00 – 立體聲
01 – 混合立體聲
10 – 雙聲道 (兩個單聲道)
11 – 一個聲道 (單聲道)
注: 雙聲道文件由兩個獨立的單聲道所組成。大多數(shù)解碼器把雙聲道輸出成立體聲,但是實際上,不是所有的雙聲道都是立體聲的。
01
26
2
模式擴展 (僅用于聯(lián)合立體聲)
(參見 表 2.1.6)
00
表 2.1.1MPEG音頻幀頭的格式
按照上表,通過對頭進行解析,可以解析出來對應的,我們計算VBR MP3播放時間所需要的參數(shù):
【未完待續(xù)】
about TOC:
Xing VBR headerIf first bit of flags is set,
100*1 bytes 100 1-byte TOC entries
Every TOC entry contains the size of the n-th frame. Calculating the position
of the 3rd frame should look as following: header_size + toc[0] + toc[1] + toc[2]