【技術筆記】實現一個非常簡易的flac裁剪並轉換為wav格式
最近專案中遇到了一個需求是要實現對Flac歌曲的裁剪,而且不能是GPL開源協議的軟體,網上查了一下,foolbar和千千靜聽都是會支援,其中foolbar是開放原始碼的,下載程式碼看了發現是使用的libflac(後來我又找了兩個支援flac格式裁剪的mp3splt和pysourcefile,發現都是使用libflac),於是決定研究一下怎麼使用libflac實現。
libflac還有衍生的libflac++是BSD協議,而衍生的工具flac和metaflac則是GPL協議的
下載下來libflac後,最初是在linux上編譯的,發現始終編譯不通過,應該是缺少libtool,看了軟體包提供多個平臺的編譯檔案,就先試試整合性比較好的win,開啟之後工程如下:
除了上面說到的幾個工程外,還有幾個是測試工程和示例工程
win啟動後發現還是編譯不通過,報錯缺少nasm.exe,參考部落格https://blog.csdn.net/dragoo1/article/details/22396325下載後搞定
再編譯發現報錯為缺少ogg.h標頭檔案,查了一下也是歌曲編碼相關的,是BSD協議,下載下來後先編譯libogg,編譯完成後拷貝到libflac下面,再編譯libflac,這次編譯通過了
接下來看了下示例工程example_c_decode_file,發現是實現flac轉wav的,可以直接編譯,編譯完測了下功能,穩穩地^ ^
看了下樣例程式碼,發現是通過註冊函式到libflac,通過libflac一幀一幀(這裡是不是幀大小有待商榷,反正理解這個意思就行了)
本來想參考mp3splt的呼叫方法,看到這個發現修改這裡就可以實現一個的(真正的程式設計師要學會規避風險,避免投入大於產出^ ^)
先隨便寫一個,這個歌曲的framesize是2183,跳過開頭的100和2000以後的,果然被裁剪掉了
原歌曲長度是3分48秒
裁剪後變成了3分18秒
這裡稍稍研究了一下,這個歌曲的總samples是10056067,每個frame下面的sample個數是4608,所以總共有2183個frame,另外它的samplerate是44100,所以歌曲總長度是228秒,即3分48秒,我跳過了前100和後183,共283*4608個sample,而時長就是(283*4608)/44100≈30s,這個實際查詢的結果是相符的,說明我裁剪ok了
由於示例程式碼比較簡單,所以它也有幾個限制:
1、只能處理channels為2和16bits的
2、使用小端位元組序
【附】
1、示例解碼程式碼中使用的libflac的api和它的功能
FLAC__stream_decoder_new --建立一個解碼器
FLAC__stream_decoder_set_md5_checking --設定是否md5校驗檢查
FLAC__stream_decoder_init_file( --初始化,註冊函式
decoder, --解碼器
argv[1], --目標flac檔案
write_callback, --寫回調
metadata_callback, --只回調一次,可以獲取到歌曲檔案的資訊
error_callback, --錯誤時回撥,可以通過FLAC__StreamDecoderErrorStatusString獲取原因
/*client_data=*/fout);
FLAC__stream_decoder_process_until_end_of_stream --啟動解碼
FLAC__stream_decoder_delete --刪除解碼器