编解码器:Opus编码器内置FEC功能测试

本文转自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编码器内置FEC功能测试_第1张图片

如图在opus_demo.exe可执行文件目录下打开命令台,之后就要对你的pcm源文件进行编码和解码,测试FEC的纠错功能。利用opus_demo演示程序对pcm文件进行处理。

根据上面链接文章中的指令参数调用表格,写出如下指令:


   
   
   
   
  1. opus_demo voip 48000 1 16000 path\ to\ test .pcm path\ to\ test_nofec_0 .pcm
  2. opus_demo voip 48000 1 16000 -loss 5 path\ to\ test .pcm path\ to\ test_nofec_5 .pcm
  3. opus_demo voip 48000 1 16000 -loss 10 path\ to\ test .pcm path\ to\ test_nofec_10 .pcm
  4. opus_demo voip 48000 1 16000 -loss 15 path\ to\ test .pcm path\ to\ test_nofec_15 .pcm
  5. opus_demo voip 48000 1 16000 -loss 20 path\ to\ test .pcm path\ to\ test_nofec_20 .pcm
  6. opus_demo voip 48000 1 16000 -loss 25 path\ to\ test .pcm path\ to\ test_nofec_25 .pcm
  7. opus_demo voip 48000 1 16000 -loss 30 path\ to\ test .pcm path\ to\ test_nofec_30 .pcm
  8. opus_demo voip 48000 1 16000 -inbandfec path\ to\ test .pcm path\ to\ test_0 .pcm
  9. opus_demo voip 48000 1 16000 -inbandfec -loss 5 path\ to\ test .pcm path\ to\ test_5 .pcm
  10. opus_demo voip 48000 1 16000 -inbandfec -loss 10 path\ to\ test .pcm path\ to\ test_10 .pcm
  11. opus_demo voip 48000 1 16000 -inbandfec -loss 15 path\ to\ test .pcm path\ to\ test_15 .pcm
  12. opus_demo voip 48000 1 16000 -inbandfec -loss 20 path\ to\ test .pcm path\ to\ test_20 .pcm
  13. opus_demo voip 48000 1 16000 -inbandfec -loss 25 path\ to\ test .pcm path\ to\ test_25 .pcm
  14. 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 来只执行编码)


   
   
   
   
  1. opus_demo -e voip 48000 1 16000 -inbandfec -loss 19 path\ to\ test .pcm path\ to\ test19 .opus
  2. opus_demo -e voip 48000 1 16000 -inbandfec -loss 20 path\ to\ test .pcm path\ to\ test20 .opus
  3. opus_demo -e voip 48000 1 16000 -inbandfec -loss 21 path\ to\ test .pcm path\ to\ test21 .opus
  4. opus_demo -e voip 48000 1 16000 -loss 19 path\ to\ test .pcm path\ to\ test19_nofec .opus
  5. opus_demo -e voip 48000 1 16000 -loss 20 path\ to\ test .pcm path\ to\ test20_nofec .opus
  6. 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%

你可能感兴趣的:(编解码)