簡介
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
ffmpeg 是一款非常快速的視頻和音頻轉換器, 是開源項目 FFmpeg (Fast Forward moving pictures expert group) 的命令行程序。 它可以在任意采樣率之間轉換,並通過高質量的多相濾波器實時調整視頻大小。
ffmpeg 程序的轉碼流程,如下所示
_______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ | | | | | | | output | <-------- | encoded data | <----+ | file | muxer | packets | encoder |________| |______________|
其中, demuxer 為解復用器, muxer 為復用器; decoder 為解碼器, encoder 為編碼器
具體使用示例
假定 PCM 音頻格式 s16le (signed 16 bits little endian, 有符號 16 位小端) , 更多格式參見"補充內容 - 1. PCM格式".
1. PCM 音頻轉換為 WAV 格式
ffmpeg -y -f s16le -ar 16k -ac 1 -i input.raw output.wav
其中, -y 表示無需詢問,直接覆蓋輸出文件; -f s16le 用於設置文件格式為 s16le ; -ar 16k 用於設置音頻采樣頻率為 16k; -ac 1 用於設置通道數為 1; -i input.raw 用於設置輸入文件為 input.raw; output.wav 為輸出文件.
2. PCM 音頻轉換為 MP3 格式
ffmpeg -y -f s16le -ar 16k -ac 1 -i input.raw output.mp3
注: 與PCM音頻轉換為WAV命令相比, 只有輸出文件不同, 其他相同.
3. WAV 音頻轉換為 PCM 格式
ffmpeg -y -i input.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16k output.pcm
其中, -acodec 用於設置音頻的編碼器和解碼器(codec, 即 coder-decoder 的混成詞). 也是參數 -codec:a 的別名, 其中a表示 audio.
4. MP3 音頻轉換為 PCM 格式
ffmpeg -y -i input.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 16k output.pcm
5. WAV 音頻轉換為 MP3 格式
ffmpeg -y -i input.wav input.mp3
6. MP3 音頻轉換為 WAV 格式
ffmpeg -y -i input.mp3 input.wav
補充內容
1. PCM 格式
PCM, 英文全稱為 pulse-code modulation, 中文名為脈沖編碼調制, 是用於數字化表示采樣后的模擬信號的一種方法. 其也是數字音頻的標准形式. 更多內容參見 Pulse-code modulation, Wikipedia. 由於 PCM 音頻只包含數據, 沒有數據頭指定采樣率, 通道數, 數據位數等, 所以需要在轉碼(transcoding)前, 指定這些參數. 在 ffmpeg 程序中, 支持多種格式的 PCM 數據, 如下所示:
$ ffmpeg -formats | grep PCM DE alaw PCM A-law DE f32be PCM 32-bit floating-point big-endian DE f32le PCM 32-bit floating-point little-endian DE f64be PCM 64-bit floating-point big-endian DE f64le PCM 64-bit floating-point little-endian DE mulaw PCM mu-law DE s16be PCM signed 16-bit big-endian DE s16le PCM signed 16-bit little-endian DE s24be PCM signed 24-bit big-endian DE s24le PCM signed 24-bit little-endian DE s32be PCM signed 32-bit big-endian DE s32le PCM signed 32-bit little-endian DE s8 PCM signed 8-bit DE u16be PCM unsigned 16-bit big-endian DE u16le PCM unsigned 16-bit little-endian DE u24be PCM unsigned 24-bit big-endian DE u24le PCM unsigned 24-bit little-endian DE u32be PCM unsigned 32-bit big-endian DE u32le PCM unsigned 32-bit little-endian DE u8 PCM unsigned 8-bit
其中, A-law 和 mu-law 都是壓縮和擴展算法 (companding algorithm). 在 8 位 PCM 數字通信系統中, 用於優化模擬信號數字化的動態范圍. A-law 算法主要應用在歐洲, 而 mu-law 算法主要應用在北美和日本. 更多內容,參見 A-law algorithm, Wikipedia 和 μ-law algorithm, Wikipedia .
2. 使用 ffplay 播放音頻
$ ffplay [options] [input_url]
ffplay 是一款使用 FFmpeg 庫(用於轉換視頻和音頻文件, 官方網址為 https://ffmpeg.org) 和 SDL 庫(Simple DirectMedia Layer, 一個跨平台的開發庫, 用於通過 OpenGL 和 Direct3D, 提供對音頻, 鼠標, 操縱桿和圖形硬件的低層訪問, 官方網址為 https://www.libsdl.org), 主要用於各種 FFmpeg API 的測試平台.
注意: 播放PCM文件時, 同樣需要指定具體參數信息.
具體播放命令, 示例如下:
1). 播放 s16le 格式的 PCM 文件 input.raw
$ ffplay -f s16le -ac 1 -ar 16k -i input.raw
其中, -i 參數可以省略
2). 播放 wav 格式文件
$ ffplay -i input.wav
3). 播放 mp3 格式文件
$ ffplay -i input.mp3
參考資料
1. ffmpeg Documentation. https://ffmpeg.org/ffmpeg.html
2. Can ffmpeg convert audio to raw PCM? If so, how? https://stackoverflow.com/questions/4854513/can-ffmpeg-convert-audio-to-raw-pcm-if-so-how
3. FFmpeg wiki: audio types. https://trac.ffmpeg.org/wiki/audio%20types
4. ffplay Documentation. https://ffmpeg.org/ffplay.html
5. FFmpeg - Wikipedia. https://en.wikipedia.org/wiki/FFmpeg