Opus功能十分强大,内置了FEC和DTX功能,Opus对FEC的使用方式是动态的,也就是说Opus能根据对端反馈的丢包率来动态的使用FEC功能,48k采样率,单声道、16k码率并且帧长度为20ms时,这种情况下只有在丢包率高于20%的时候Opus才会使用FEC,今天主要对Opus在这种条件下的FEC的功能进行了测试,本问是基于Opus接口的那篇文章写的,如果没看过可以链接到 编解码器:Opus编解码器的接口及使用。
找一段pcm音频原始文件,用作编解码器操作数据的源文件,取名为test.pcm。然后进入到opus_demo.exe文件的目录下SHIFT+右键点击在此处打开命令窗口。
如图在opus_demo.exe可执行文件目录下打开命令台,之后就要对你的pcm源文件进行编码和解码,测试FEC的纠错功能。利用opus_demo演示程序对pcm文件进行处理。
根据上面链接文章中的指令参数调用表格,写出如下指令:
opus_demo voip 48000 1 16000 path\to\test.pcm path\to\test_nofec_0.pcm
opus_demo voip 48000 1 16000 -loss 5 path\to\test.pcm path\to\test_nofec_5.pcm
opus_demo voip 48000 1 16000 -loss 10 path\to\test.pcm path\to\test_nofec_10.pcm
opus_demo voip 48000 1 16000 -loss 15 path\to\test.pcm path\to\test_nofec_15.pcm
opus_demo voip 48000 1 16000 -loss 20 path\to\test.pcm path\to\test_nofec_20.pcm
opus_demo voip 48000 1 16000 -loss 25 path\to\test.pcm path\to\test_nofec_25.pcm
opus_demo voip 48000 1 16000 -loss 30 path\to\test.pcm path\to\test_nofec_30.pcm
opus_demo voip 48000 1 16000 -inbandfec path\to\test.pcm path\to\test_0.pcm
opus_demo voip 48000 1 16000 -inbandfec -loss 5 path\to\test.pcm path\to\test_5.pcm
opus_demo voip 48000 1 16000 -inbandfec -loss 10 path\to\test.pcm path\to\test_10.pcm
opus_demo voip 48000 1 16000 -inbandfec -loss 15 path\to\test.pcm path\to\test_15.pcm
opus_demo voip 48000 1 16000 -inbandfec -loss 20 path\to\test.pcm path\to\test_20.pcm
opus_demo voip 48000 1 16000 -inbandfec -loss 25 path\to\test.pcm path\to\test_25.pcm
opus_demo voip 48000 1 16000 -inbandfec -loss 30 path\to\test.pcm path\to\test_30.pcm
每一行都会生成一个pcm文件(opus_demo指令之后加 -e 和 -d 分别表示只编码和只解码,什么都不加表示编码之后再解码),前7行表示在不使用FEC功能前提下的Opus在各种丢包率下编解码操作后的得到的pcm文件,后7行表示前7行的基础上加入了opus内置的FEC功能,将所有最终得到的pcm原始音频文件在coolEditPro软件中播放,然后比较他们之间的音质差异。
首先比较没加FEC处理的音频在各种丢包率下的音质(当然是丢包率越少越好),然后比较在相同丢包率下,FEC处理过和FEC没有处理过的音频的音质比较,你会发现一个很奇怪的现象,在丢包率不大于20%时,FEC处理过的音质与FEC没有处理过的音质基本没有区别,甚至用Beyond Compare软件对两个pcm文件进行是16进制比较时,也发现没有任何区别,这也验证了我之前说的,在丢包率不大于20%时,Opus不会启用FEC,在丢包率大于20%时,相同丢包率下,FEC处理过的音质要远高于FEC没有处理的,这说明FEC还是很有成效的。
如果你非要想去验证那就只用opus_demo的编码功能(opus_demo后面加 -e 来只执行编码)
opus_demo -e voip 48000 1 16000 -inbandfec -loss 19 path\to\test.pcm path\to\test19.opus
opus_demo -e voip 48000 1 16000 -inbandfec -loss 20 path\to\test.pcm path\to\test20.opus
opus_demo -e voip 48000 1 16000 -inbandfec -loss 21 path\to\test.pcm path\to\test21.opus
opus_demo -e voip 48000 1 16000 -loss 19 path\to\test.pcm path\to\test19_nofec.opus
opus_demo -e voip 48000 1 16000 -loss 20 path\to\test.pcm path\to\test20_nofec.opus
opus_demo -e voip 48000 1 16000 -loss 21 path\to\test.pcm path\to\test21_nofec.opus
通过16进制对比,test19.opus 和 test19_nofec.opus,test20.opus 和 test20_nofec.opus 是毫无差别的,说明丢包率不高于20%时,Opus不启动FEC。而 test21.opus 和 test21_nofec.opus 则有很大不同,说明在丢包率大于20%时,Opus启用了FEC。
上述全是在 48k采样率,单声道、16k码率并且帧长度为20ms时测试的,我觉得在其他条件下这个丢包率的阈值有可能会不同,以后如果测试到不同会继续补充,有问题请在评论区留言。
——————————————————————————————————————————————————————
2018年8月6日,补上部分丢包率阈值测试结果
采样率 语音长度 比特率 丢包率
16K 20ms 16K 20%
16K 20ms 64K 2%
16K 60ms 16K 5%
16K 60ms 64K 5%
48K 20ms 16K 20%
48K 20ms 64K 2%
48K 60ms 16K 5%
48K 60ms 64K 5%