原汁原味儲存的PCM檔案本來也沒什麼問題,可是在實際應用中,有的業務場景需要特定規格的PCM音訊。比如某廠家的語音識別引擎,要求只能輸入16位的PCM資料,然而標準的MP3音訊都採用32位取樣,如此一來,得想辦法把32位的MP3音訊轉換為16位的PCM音訊才行。
考慮到使用FFmpeg的命令列轉換比較方便,於是在控制檯執行下面的ffmpeg格式轉換指令,在轉換取樣頻率和聲道數量的同時一起轉換取樣位數。
誰知控制檯輸出以下的報錯資訊“pcm_s16le codec not supported”,意思是不支援16位的PCM編碼器。
咦,FFmpeg怎麼會不支援這麼基本的PCM編碼器呢?繼續執行下面的編碼器檢視命令:
發現輸出的查詢結果赫然出現下面的pcm_s16le資訊,說明FFmpeg預設已經支援該編碼器。
那麼為啥ffmpeg命令列無法正常轉換PCM音訊的取樣位數呢?
搜了一圈發現沒有使用ffmpeg成功轉換取樣位數的案例,只好先把原音訊轉換為32位取樣的PCM檔案,轉換命令如下所示:
接下來另外編寫轉換音訊取樣位數的程式碼convertpcm.c,程式碼內容如下所示:
儲存程式碼,然後執行下面的編譯命令。
編譯完成,再執行下面的取樣位數轉換命令。
現在生成的output_16.pcm就是16位取樣的PCM檔案,可以用作語音識別了。
更多詳細的FFmpeg開發知識參見