1. 程式人生 > >sox+ffmpeg+mad+flac

sox+ffmpeg+mad+flac

一切為了聽歌

上次用了libmad 搞了mp3的解碼+alsa的音樂播放,但是不可能只是支援一種格式。所以改改改改

需要支援 mp3,flac,m4a,wav,wmv…..格式

而且在這裡我們還有resample channels 等一些關於音訊的其他引數的需求,最終我們選用了sox ,sox提供了帶其他解碼庫的編譯選項,比方說ffmpeg的庫,libavxxxx,libflac,lame,twolame等具體可以在官方的說明裡面找到,但是感覺最重要的還是ffmpeg。

交叉編譯肯定就大家自己動手了。
接下來說一下編譯的時候碰到的問題。

  1. 編譯的時候無法生成動態庫。
    無法生成so檔案。編譯過程中

     checking if libtool supports shared libraries... no

    這裡我矇蔽了好一會兒。後來查到是arch=arm的問題,把arch=arm-none-linux就好了

  2. sox帶libavxxxx編譯的時候,出現找不到函式

    checking for av_open_input_file in -lavformat... no

    首先你要確定你的庫路徑是對的。

    readelf -a libavformat | grep av_open_input_file

    看看到底有沒有。
    我用的sox 14.4.1 2013年釋出的,但是av_open_input_file這個函式在後面的某一年的ffmpeg裡面被廢棄了,所以,如果你的ffmpeg版本太新也是沒有這個函式,肯定是編譯不過去的。後來我選用了比較早的ffmpeg的版本,這個問題就解決掉了。

  3. wma和ape的支援

    如果你直接使用

    sox xxxx.wma -t alsa

    來播放的wma檔案的話,即使在有ffmpeg庫的情況下也是不能播放的(這僅僅是我自己測試到的情況,後面版本如果有修改的話,當我沒說)。在這種情況下要

    sox -t ffmpeg xxxx.wma -t alsa

    直接指定輸入檔案使用ffmpeg處理,在程式設計中在open_read的時候,有個一type的引數,正常情況下為null,在此處直接設定為ffmpeg就可以播放了。

  4. 個別破音
    在播放某一些音樂的時候,會有一些破音的情況,硬體上這個問題應該是大頭,但是我們也可以通過縮小輸出的幅度來防止這種情況的發生可以在播放的時候加入 vol的effect 然後加入一個引數比方0.5 0.3,這樣音量就會x0.5 x0.3,從而達到減小輸出音量的效果。

  5. sox的rate效果
    在使用sox的rate效果的時候,比方把96k轉化為48k或者其他頻率的音訊播放時,會出現卡頓的情況,這種情況下,可以試著把rate的轉換效果降低,預設是高質量的,可以通過為rate新增引數的方法,降低效果,減少單次轉換的運算量,使得播放順暢。

這是我在做音訊的一些碰到的一些問題,希望能幫助到別人,如果有錯,勞煩告知,謝謝。
有一些我還是沒有解決問題,如果哪位大神會,也請幫助我一下
我使用的是imx6ul,但是對他的arsc表示無奈,不會用,本來想要通過這個模組直接硬體轉rate,但是我發現imx6ul沒有44100的倍數的時鐘。手冊上寫的支援44.1,48等一系列的都可以支援,但是我不會用。

14.4.1中存在記憶體洩漏的問題。本來準備使用14.4.2,但是發現14.4.2不支援ffmpeg了,心累,bug怎麼辦。。。 最新一個版本更新隔了一年,sox是準備涼涼了嗎

發現新的情況 好像跟格式有關係 wma和m4a,記憶體漲的特別快,但是wav mp3之類的就沒有明顯的增長,這兩個格式的支援是在ffmpeg中支援的,但是ffmpeg的庫有點老

下次還有這種應用的話,還是嘗試換種方式