1. 程式人生 > >【技術筆記】實現一個非常簡易的flac裁剪並轉換為wav格式

【技術筆記】實現一個非常簡易的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             --刪除解碼器