ffmpeg PCM转AMR格式

 上次说到安装了ffmpeg并且将文件从pcm转到mp3然后到amr格式,当时我听了一下pcm和转后的文件都卡卡做声,就以为给的pcm文件就是这么回事,
 但今天跟固件端同事调试发算不是这么的,pcm文件是可以出声音的,是自己转换出问题了。

先看一下常见命令参数:
主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
视频参数:
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数://主要关注
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
-ab 设置比特率(单位:bit/s,也许老版是kb/s)前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换 默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上。

发现我转出来的mp3文件Hz是44100Hz,但pcm文件是16000Hz,调整相应的参数即可。
以及设定声音的Channel数值也不对,应该是1.

//以前执行的命令
/usr/local/ffmpeg3/bin/ffmpeg -f s16le -ar 44.1k -ac 2 -i file.pcm file.mp3

//调整后的命令
/usr/local/ffmpeg3/bin/ffmpeg -f s16le -ar 16.0k -ac 1 -i test.pcm test03.mp3

//在从mp3转成mar即可
/usr/local/ffmpeg3/bin/ffmpeg -i test03.mp3 -ac 1 -ar 8000 test03.amr

经过几次测试,对比如图:
ffmpeg PCM转AMR格式_第1张图片

以上并不是最终的结果:(1月7日更新)
固件端的同事说我的amr是mode7,说微信里面应该是mode1才对。
把我弄得云里雾里的,根本听不懂啊。

百度科普一下:
AMR(Audio/Modem Riser,声音/调制解调器插卡)插槽是Intel公司开发的一种扩展槽标准。采用这种标准,通过附加的解码器可以实现软件
音频功能和软件调制解调器功能。

自适应多码率编译码器是一种在较大数据传输速率范围内的编译码器,AMR编解码器也用在多种蜂窝系统中协调编译码器标准。
这里都是针对AMR narrow-band (AMR-NB)进行讨论
编码方式
Mode 0 - AMR 4.75 - Encodes at 4.75kbit/s
Mode 1 - AMR 5.15 - Encodes at 5.15kbit/s
Mode 2 - AMR 5.9 - Encodes at 5.9kbit/s
Mode 3 - AMR 6.7 - Encodes at 6.7kbit/s
Mode 4 - AMR 7.4 - Encodes at 7.4kbit/s
Mode 5 - AMR 7.95 - Encodes at 7.95kbit/s
Mode 6 - AMR 10.2 - Encodes at 10.2kbit/s
Mode 7 - AMR 12.2 - Encodes at 12.2kbit/s
8~15位一些 noise frames 和保留位的定义。
对应帧的大小
CMR Mode Frame size (bytes)
0 AMR 4.75 13
1 AMR 5.15 14
2 AMR 5.9 16
3 AMR 6.7 18
4 AMR 7.4 20
5 AMR 7.95 21
6 AMR 10.2 27
7 AMR 12.2 32
我们来做一个简单的计算,PCM16和AMR之间的转换
Amr 一帧为20毫秒
AMR 4.75Kbits/s:
每秒产生的声音位数 = 4750bits/s
每20ms帧占用的位数 = 4750bits/s / 50frames/s = 95bits
每20ms帧占用的字节数 = 95bits / 8bits/byte = 11.875bytes - 圆整到12字节,不足的补0
加上一个字节的帧头,所以,20ms一帧的AMR: 12-bytes + 1-byte = 13-bytes
相反,转换回来就成了
13-bytes * 50frames/s * 8bits/byte = 5200bits/s
注意,这里两个数值并不对应,是由于圆整地原因

ffmpeg -ab参数的说明

-ab 设置比特率(单位:bit/s,也许老版是kb/s)前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换 默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上。

最终的命令是
/usr/local/ffmpeg3/bin/ffmpeg -i test03.mp3 -ac 1 -ar 8000 -ab 5.15k test05.amr

一直没有找到两者直接转换的命令。

从pcm–>mp3–>amr格式:
/usr/local/ffmpeg3/bin/ffmpeg -f s16le -ar 16.0k -ac 1 -i test.pcm test03.mp3
/usr/local/ffmpeg3/bin/ffmpeg -ac 1 -ar 8000 -ab 5.15k -i test03.mp3 test05.amr

从amr–>mp3–>pcm格式
/usr/local/ffmpeg3/bin/ffmpeg -i file.amr -ac 1 -ar 16.0k file.mp3
/usr/local/ffmpeg3/bin/ffmpeg -i file.mp3 -f s16le -acodec pcm_s16le file.pcm

你可能感兴趣的:(Yii2,Server)