WAVE 文件格式分析

 ̄綄美尐妖づ 提交于 2020-01-15 05:44:59

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'

则安装成功
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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!