1 问题描述
打电话的对话,被拆分成了两个PCM文件。其中主叫的录音文件A.pcm,被叫的录音为B.pcm。
问题是怎么合成一个混音的对话文件AB.wav。
2 WAV文件的录音格式
常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit 的采样值)和双声道(44.1KHz 采样率、16Bit 的采样值)。
采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期 。
WAVE 文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE 文件是由样本组织而成的。在单声道 WAVE 文件中,声道0代表左声道,声道1代表右声道。
在多声道WAVE文件中,样本是交替出现的。
下面我们具体地分析 WAV文件的格式
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文件
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的安装
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.amr
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