1 問題描述html
打電話的對話,被拆分紅了兩個PCM文件。其中主叫的錄音文件A.pcm,被叫的錄音爲B.pcm。linux
問題是怎麼合成一個混音的對話文件AB.wav。git
2 WAV文件的錄音格式github
常見的聲音文件主要有兩種,分別對應於單聲道(11.025KHz 採樣率、8Bit 的採樣值)和雙聲道(44.1KHz 採樣率、16Bit 的採樣值)。
採樣率是指:聲音信號在「模→數」轉換過程當中單位時間內採樣的次數。採樣值是指每一次採樣週期 。
WAVE 文件數據塊包含以脈衝編碼調製(PCM)格式表示的樣本。WAVE 文件是由樣本組織而成的。在單聲道 WAVE 文件中,聲道0表明左聲道,聲道1表明右聲道。
在多聲道WAVE文件中,樣本是交替出現的。
下面咱們具體地分析 WAV文件的格式centos
endian | field name | Size | 說明 | 計算方式 |
big | ChunkID | 4 | 文件頭標識,通常就是" RIFF" 四個字母 | ASCII 碼錶示的「RIFF」。(0x52494646) |
little | ChunkSize | 4 | 整個數據文件的大小,不包括上面ID和Size自己 | 36+SubChunk2Size,或是4 + ( 8 + SubChunk1Size ) + ( 8 + SubChunk2Size ),這是整個數據塊的大小(不包括ChunkID和ChunkSize的大小) |
big | Format | 4 | 通常就是" WAVE" 四個字母 | ASCII 碼錶示的「WAVE」。(0x57415645) |
big | SubChunk1ID | 4 | 格式說明塊,本字段通常就是"fmt " | 新的數據塊(格式信息說明塊)ASCII 碼錶示的「fmt 」——最後是一個空格。(0x666d7420) |
little | SubChunk1Size | 4 | 本數據塊的大小,不包括ID和Size字段自己 | 本塊數據的大小(對於PCM,值爲16)。 |
little | AudioFormat | 2 | 音頻的格式說明 | PCM = 1 (好比,線性採樣),若是是其它值的話,則多是一些壓縮形式 |
little | NumChannels | 2 | 聲道數 | 1 => 單聲道 | 2 => 雙聲道 |
little | SampleRate | 4 | 採樣率 | 採樣率,如 8000,44100 等值 |
little | ByteRate | 4 | 比特率,每秒所須要的字節數 | 等於: SampleRate * numChannels * BitsPerSample / 8 |
little | BlockAlign | 2 | 數據塊對齊單元 | 等於:NumChannels * BitsPerSample / 8 |
little | BitsPerSample | 2 | 採樣時模數轉換的分辨率 | 採樣分辨率,也就是每一個樣本用幾位來表示,通常是 8bits 或是 16bits |
big | SubChunk2ID | 4 | 真正的聲音數據塊,本字段通常是"data" | 新數據塊,真正的聲音數據。ASCII 碼錶示的「data 「(0x64617461) |
little | SubChunk2Size | 4 | 本數據塊的大小,不包括ID和Size字段自己 | 數據大小,即,其後跟着的採樣數據的大小。 |
little | Data | N | 音頻的採樣數據 | 真正的聲音數據 |
3 查看錄音的PCM文件ide
1 查看錄音的二進制文件 2 給出合成的思路。頭文件的字節數 3 JAVA源碼 4 安裝ffmpeg
pcm轉立體聲mp3 ffmpeg -i input1.pcm -i input2.pcm -filter_complex "amovie=input1.pcm [l]; amovie=input2.pcm [r]; [l] [r] amerge" output.mp3 amr轉混音amr ffmpeg -i input1.amr -i input2.amr -filter_complex amix=inputs=2:duration=longest -ab 12.2k -ar 8000 -ac 1 output.amr 在後面加上 -loglevel quiet -y, 能夠覆蓋輸出文件,避免輸出日誌 如: ffmpeg -i input1.amr -i input2.amr -filter_complex amix=inputs=2:duration=longest -ab 12.2k -ar 8000 -ac 1 output.amr -loglevel quiet -y
在作的過程當中,漸漸發現這一切早有工具實現。下面來看看ffmpeg工具。工具
4 ffmpeg的安裝post
ffmpeg 安裝步驟 ######################################################################################## root 用戶下安裝下列依賴軟件 1 下載 ffmpeg wget http://ffmpeg.org/releases/ffmpeg-3.1.2.tar.bz2 2 下載mp3依賴庫libmp3lame wget http://downloads.sourceforge.net/lame/lame-3.99.5.tar.gz 安裝libmp3lame tar -zxvf lame-3.99.5.tar.gz ./configure make make install 3 安裝yasm yum install yasm 4 安裝Xext yum install libXext-devel 5 安裝amr的依賴庫opencore-amr wget --no-check-certificate https://sourceforge.net/projects/opencore-amr/files/opencore-amr/opencore-amr-0.1.3.tar.gz/download ./configure make make install 6 安裝ffmpeg-3.1.2.tar.bz2 tar -jxvf ffmpeg-3.1.2.tar.bz2 ./configure --enable-shared --enable-nonfree --enable-gpl --enable-decoder=aac --enable-demuxer=mov --enable-x11grab --enable-zlib --enable-protocol=http --enable-filter=aformat --enable-filter=volume --enable-filter=aresample --enable-version3 --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb ----------- configue 必定要沒有錯誤,若是有錯誤,按照提示安裝相應的依賴軟件 make make install ######################################################################################## 安裝好後輸入ffmpeg 查看 若是報錯ffmpeg: error while loading shared libraries: libavdevice.so.57: cannot open shared object file: No root 下輸入命令 ldconfig 若是獲得 ffmpeg version 3.1.2 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4) configuration: --enable-shared --enable-nonfree --enable-gpl --enable-decoder=aac --enable-demuxer=mov --enable-x11grab --enable-zlib --enable-protocol=http --enable-filter=aformat --enable-filter=volume --enable-filter=aresample --enable-version3 --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb libavutil 55. 28.100 / 55. 28.100 libavcodec 57. 48.101 / 57. 48.101 libavformat 57. 41.100 / 57. 41.100 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 47.100 / 6. 47.100 libswscale 4. 1.100 / 4. 1.100 libswresample 2. 1.100 / 2. 1.100 libpostproc 54. 0.100 / 54. 0.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Use -h to get full help or, even better, run 'man ffmpeg' 則安裝成功
5 測試效果測試
5.1 1.amr 和 2.amr 是左右聲道的錄音,如今合成混音1_2.amrui
ffmpeg -i 1.amr -i 2.amr -filter_complex amix=inputs=2:duration=longest:dropout_transition=2 -ab 12.2k -ar 8000 -ac 1 1_2.amr
5.2 1.wav 和 2.wav是左右聲道的錄音,如今合成立體聲1_2.mp3,即左聲道是1的聲音,右聲道是2的聲音。
ffmpeg -i 1.wav -i 2.wav -filter_complex "amovie=1.wav [l]; amovie=2.wav [r]; [l] [r] amerge" 1_2.mp3
雙聲道的pcm轉換爲單聲道的amr,指定編解碼器 ffmpeg -y -f s16le -ar 8000 -ac 2 -i 1.pcm -acodec amr_nb -ab 12.2k -ar 8000 -ac 1 1.amr
http://blog.csdn.net/xianglingchuan/article/details/54092584
參考資料
1 ffmpeg經常使用轉換命令,支持WAV轉AMR http://www.cnblogs.com/xiaofengfeng/p/3573025.html
2 WAVE 文件格式分析 http://www.cnblogs.com/liyiwen/archive/2010/04/19/1715715.html
3 How to compile FFmpeg on CentOS, Fedora or RHEL http://ask.xmodulo.com/compile-ffmpeg-centos-fedora-rhel.html
4 Linux下ffmpeg的完整安裝 http://www.cnblogs.com/wanghetao/p/3386311.html
5 linux系統中ffmpeg安裝配置步驟 http://www.111cn.net/sys/linux/82964.htm
6 error while loading shared libraries https://forum.ivorde.com/ffmpeg-error-while-loading-shared-libraries-libavdevice-so-52-cannot-open-shared-object-file-no-t129.html
7 FFmpeg Filters Documentation http://ffmpeg.org/ffmpeg-filters.html
8 ffmpeg的中文文檔 https://wanglongqi.github.io/tools/2014/12/23/ffmpegdoc/
9 How to change ffmpeg -threads settings http://superuser.com/questions/792525/how-to-change-ffmpeg-threads-settings