作者: JadePeng
出處:https://www。cnblogs。com/xiaoqi/p/ogg-opus。html
PCM
自然界中的聲音非常複雜,波形極其複雜,通常我們採用的是脈衝程式碼調製編碼,即PCM編碼。PCM透過抽樣、量化、編碼三個步驟將連續變化的模擬訊號轉換為數字編碼。
取樣率
取樣頻率,也稱為取樣速度或者取樣率,定義了每秒從連續訊號中提取並組成離散訊號的取樣個數,它用赫茲(Hz)來表示。取樣頻率的倒數是取樣週期或者叫作取樣時間,它是取樣之間的時間間隔。通俗的講取樣頻率是指計算機每秒鐘採集多少個訊號樣本。
工業界常用的16K,就是1s有16000個取樣點。
WAV
PCM是原始語音,依據取樣率的定義,我們知道要播放PCM,需要知道取樣率,因此需要一個檔案格式可以封裝PCM,
wav
就是微軟公司專門為Windows開發的一種標準數字音訊檔案,該檔案能記錄各種單聲道或立體聲的聲音資訊。
wav檔案前44個位元組,定義了取樣率,channel等引數,播放器透過這個資料就可以播放PCM資料了。
MP3
wav
很好的解決了PCM播放的問題,但是PCM實在是太大了,因此出現了
mp3
等音訊格式,透過一定的壓縮演算法壓縮語音,以便於網際網路傳輸分享。
Ogg 與 Opus
隨著音影片應用的越來越廣泛,工業界有了越來越多的編解碼器,比如
Speek
,
Opus
Opus編解碼器是專門設計用於網際網路的互動式語音和音訊傳輸。它是由IETF的編解碼器工作組設計的,合併了Skype的SILK和Xiph。 Org的CELT技術。
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
借博主的圖:
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