本文转自https://blog.csdn.net/qq_29621351/article/details/81393757,如有侵权请联系删除
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% |