從wav到Ogg Opus 以及使用java解碼OPUS

作者: JadePeng

出處:https://www。cnblogs。com/xiaoqi/p/ogg-opus。html

PCM

自然界中的聲音非常複雜,波形極其複雜,通常我們採用的是脈衝程式碼調製編碼,即PCM編碼。PCM透過抽樣、量化、編碼三個步驟將連續變化的模擬訊號轉換為數字編碼。

取樣率

取樣頻率,也稱為取樣速度或者取樣率,定義了每秒從連續訊號中提取並組成離散訊號的取樣個數,它用赫茲(Hz)來表示。取樣頻率的倒數是取樣週期或者叫作取樣時間,它是取樣之間的時間間隔。通俗的講取樣頻率是指計算機每秒鐘採集多少個訊號樣本。

工業界常用的16K,就是1s有16000個取樣點。

WAV

PCM是原始語音,依據取樣率的定義,我們知道要播放PCM,需要知道取樣率,因此需要一個檔案格式可以封裝PCM,

wav

就是微軟公司專門為Windows開發的一種標準數字音訊檔案,該檔案能記錄各種單聲道或立體聲的聲音資訊。

從wav到Ogg Opus 以及使用java解碼OPUS

wav檔案前44個位元組,定義了取樣率,channel等引數,播放器透過這個資料就可以播放PCM資料了。

MP3

wav

很好的解決了PCM播放的問題,但是PCM實在是太大了,因此出現了

mp3

等音訊格式,透過一定的壓縮演算法壓縮語音,以便於網際網路傳輸分享。

Ogg 與 Opus

隨著音影片應用的越來越廣泛,工業界有了越來越多的編解碼器,比如

Speek

Opus

Opus編解碼器是專門設計用於網際網路的互動式語音和音訊傳輸。它是由IETF的編解碼器工作組設計的,合併了Skype的SILK和Xiph。 Org的CELT技術。

從wav到Ogg Opus 以及使用java解碼OPUS

OPUS編解碼

https://github。com/lostromb/concentus 是一個純java庫,可以編解碼OPUS。

OPUS一般是分幀編碼,比如一個320取樣點(640位元組)的資料,編碼後為70多個位元組,和PCM一樣,編碼後的OPUS不能直接播放:

無法從檔案本身獲取音訊的元資料(取樣率,聲道數,位元速率等)

缺少幀分隔標識,無法從連續的檔案流中分隔幀(尤其是vbr情況)

伴隨著HTML5的發展,出現了OGG媒體檔案格式,Ogg是一個自由且開放標準的多媒體檔案格式,由Xiph。Org基金會所維護。Ogg格式並不受到軟體專利的限制,並設計用於有效率地流媒體和處理高質量的數字多媒體。“Ogg”意指一種檔案格式,可以納入各式各樣自由和開放原始碼的編解碼器,包含音效、影片、文字(像字幕)與元資料的處理。

OGG音訊

壓縮型別

格式

說明

有損

Speek

以低位元率處理語音資料(〜2。1-32 kbit / s /通道)

Vorbis

處理中高階可變位元率(每通道≈16-500kbit / s)的一般音訊資料

Opus:

以低和高可變位元率處理語音,音樂和通用音訊(每通道≈6-510kbit / s)

無損

FLAC

處理檔案和高保真音訊資料

未壓縮

OggPCM

處理未壓縮的PCM音訊,與WAV類似

參考: https://juejin。cn/post/6844904016254599175

借博主的圖:

從wav到Ogg Opus 以及使用java解碼OPUS

java 解碼OPUS檔案

透過ffmpeg可以輕鬆的將wav轉換為opus檔案,本質是一個ogg封裝的opus,我們可以透過

vorbis-java

來讀取opus檔案。

透過OpusInfoTool,可以列印OPUS檔案資訊:

Processing file “C:\Users\jqpeng\Downloads\opus\wav16k。opus”Opus Headers: Version: 1 Vendor: Lavf58。27。103 Channels: 1 Rate: 16000Hz Pre-Skip: 104 Playback Gain: 0dBUser Comments: encoder=Lavc58。53。100 libopusLogical stream 81c1bbc0 (-2118009920) completedOpus Audio: Total Data Packets: 579 Total Data Length: 41406 Audio Length Seconds: 11。564333333333334 Audio Length: 00:00:11。56 Packet duration: 20。0ms (max), 20。0ms (avg), 20。0ms (min) Page duration: 1000。0ms (max), 965。0ms (avg), 580。0ms (min) Total data length: 41406 (overhead: 2。34%) Playback length: 00:00:11。56 Average bitrate: 28。70 kb/s, w/o overhead: 27。97 kb/s

再借助

concentus

,我們來解碼OPUS檔案為PCM檔案。

public void testDecode() throws IOException, OpusException { FileInputStream fs = new FileInputStream(“\\wav16k。opus”); OggFile ogg = new OggFile(fs); OpusFile of = new OpusFile(ogg); OpusAudioData ad = null; System。out。println(of。getInfo()。getSampleRate()); System。out。println(of。getInfo()。getNumChannels()); OpusDecoder decoder = new OpusDecoder(of。getInfo()。getSampleRate(), of。getInfo()。getNumChannels()); System。out。println(of。getTags()); FileOutputStream fileOut = new FileOutputStream(“wav16k。pcm”); // byte[] data_packet = new byte[of。getInfo()。getSampleRate()]; int samples = 0; while ((ad = of。getNextAudioPacket()) != null) { // NOTE: samplesDecoded 是decode出來的short個數,byte需要*2 int samplesDecoded = decoder。decode(ad。getData(), 0, ad。getData()。length , data_packet, 0, of。getInfo()。getSampleRate() / 2, false); fileOut。write(data_packet, 0, samplesDecoded * 2); samples += samplesDecoded; } System。out。println(“samples: ” + samples); System。out。println(“durationSeconds: ” + (samples / 16000f)); fileOut。close(); }

感謝您的認真閱讀。

作者: JadePeng

出處:https://www。cnblogs。com/xiaoqi/p/ogg-opus。html