2016-09-28 48 views
0

我目前正在實施Java Sound SPI的編解碼器。我已經到了一個階段,我將不得不改變一些AudioInputStream的行爲(因此不得不重寫它)。但是,「樣本框架」的措詞對我來說沒有任何意義。我的編解碼器中的採樣數量和幀數量是非常不同的數字和含義。那麼在這個階級的背景下,它的意義是什麼?AudioInputStream上下文中的「示例幀」

例如,frameLength記錄爲「此流的長度,以樣本幀爲單位」。流的長度不等於流中的幀數。

framePos記錄爲「此流中的當前位置,以樣本幀(從零開始)」。這是否意味着它保存了當前流的哪個幀或流的樣本?

等等

回答

0

AudioFormat docs

對於像PCM編碼,一幀由在給定時間點所設定的所有信道的樣本的,所以一幀(以字節爲單位)的大小始終是等於樣本的大小(以字節爲單位)乘以通道數量。但是,對於其他類型的編碼,幀可以包含整個系列樣本的一系列壓縮數據以及其他非樣本數據。對於這樣的編碼,採樣率和採樣大小是指將數據解碼爲PCM後的數據,因此它們與幀速率和幀大小完全不同。

因此,如果您的編解碼器壓縮音頻,例如, mp3,a frame更像是一個壓縮的數據塊,它的大小與你在未壓縮的PCM編碼中遇到的樣本量相關很小(更多關於mp3幀可以找到here)。

所以frameLengthAudioInputStream docs真的只是意味着此流中的總幀數

或者在壓縮音頻的上下文中更加清楚:壓縮塊的數量

當讀取壓縮音頻時,使用stream = AudioSystem.getAudioInputStream(file)壓縮的流與適當的AudioFormat實例一起返回。預計用戶將使用類似decompressedStream = AudioSystem.getAudioInputStream(PCM_SIGNED, stream)的文件對進行解壓縮

不幸的是,這經常被誤解。

1

「樣本框架」是指在所有通道上包含單個樣本的框架。因此,對於8位單聲道,這是1個字節,對於16位立體聲,它是4個字節(2個通道,每個樣本2個字節)。 AudioInputStream從傳遞給構造函數的AudioFormat獲取此大小。

frameLengthframePos然後總是以此尺寸爲單位。

AudioInputStream總是嘗試讀取完整數量的示例幀,以便應用程序代碼不必處理獲取幀的一部分。