potplayer调用自身解码(FFMPEG)、外部解码(ffdshow、LAV)、不同阶段声音处理,会有不同的效果,以下将介绍个人满意的方案。
ffdshow_rev4534_20150809_paehl:http://pan.baidu.com/s/1sl4jV0D
以DTS为例,图1。
图2是设置步骤的gif,之后会详细介绍每一步。
图3是potplayer到声音被播放出的音频流程。
以下步骤更多理论、经验谈,若无需求,按照步骤设置,再试听一下即可。
另附:potplayer的WASAPI设置。
potplayer也可以设置WASAPI,优点是可以绕过windows音频处理,包括windows混音。
这里不建议使用独占模式,不然其他应用、系统将无法调用该音频设备,如果是独立的音频涉笔而非主声音驱动程序(系统默认音频设备),无所谓!
据说论坛网友说,win10的WASAPI和DS音质一样,而以前的系统会有差异,源于win10新的音频处理Media Foundation,他替换了DS,不过表面上保留DS、MME等接口。之后会测试xp、win7基础版等老系统与新系统的资源占用,届时会测试一下音频、图像等差异!
首先安装potplayer和ffdshow,这里ffdshow是K-Lite Mega自带的,版本是4534,而且所含ffmpeg.dll已更新至2016-11-15,不过这次是用的解码器是libdts,仍是4534自带的:ffdshow官网版本4531,sourceforge最新版本4533,而这款是paehl编译的,发布时间是2015-08-09,被K-Lite、完美解码等解码包所包含。
potplayer和ffdshow都有32位和64位版本,请安装相应的版本,potplayer不能调用不一样位数的ffdshow!
使用potplayer调用ffdshow,用他做解码、混音。
这里使用libdts解码,而非libavcodec(ffmpeg),因为ffmpeg会将DTS解码为7声道(6.1),而非6声道(5.1)。potplayer也是ffmpeg解码。
而原始声道其实是5.1声道,6.1声道是将后左后右移动到侧左侧右,然后根据这两条音轨混音出本不存在的后中。所以我宁愿选择DTS解码。
而且如果是预设的混音模式的话,会有区别,如果自定义矩阵混音的话,7声道和6声道是一样的,因为矩阵可以更灵活的写,而预设是固定矩阵。
输出扬声器配置:选择立体声,功能是给系统标识为双声道输出(杜比定向逻辑同样效果,因为他也是双声道输出),因为系统或声卡也会对多声道自动混音,如果不标识为双声道的话,系统输出会音量减小,因为系统的混音算法就是前左前右声道音量降低,realtek声卡和VIA声卡也有各自的混音算法。避免这些再混音的方法就是标识为双声道输出。而potplayer这边是使用源声道输出还是2.0立体声输出,都可以~
虚拟声场空间和头部相关转换函数,这两个是函数而非矩阵,虽然同样是双声道输出,但是当选择这两个的时候,无法使用自定义矩阵,其他的模式,自定义矩阵是会覆盖预设矩阵,但声道是模式的输出。
下面的耳机间距就是虚拟声场空间唯一可调的一项参数,而头部相关转换函数是无可调项的!
矩阵,是原声道到目标声道的映射,因为四四方方一个阵,大概就叫成矩阵了吧!
ffmpeg的一个参数-ac channels set number of audio channels
其算法来自于ATSC(美国数字电视国家标准)。
音频滤镜中有一个pan,可以自定义声道映射、混音!
potplayer和ffdshow都参考甚至搬运于ffmpeg,这个矩阵的原型大概就是pan。
图1的自定义矩阵可以写做: -af "pan=stereo|FL ffmpeg调用,则可以使用该矩阵编码成立体声文件。 ffplay调用,则像ffdshow一样以该矩阵播放立体声。 参考:FFmpeg Filters Documentation、AudioChannelManipulation – FFmpeg 矩阵中的值来自于杜比定向逻辑、LAV等的参考。 杜比定向逻辑中有负值,在测试中,当左右声道反相时,声音很奇妙。 图1所标,1、4声音一样,听着是单声道感觉,2、3声音一样,但绝不是单声道,频谱虽然一模一样,但是听感却是右前方的位置,而且右耳略有不适,我不知道是不是每个人都是这种感觉!在这里类似于左右声道处于敌对,而左右耳道相通,如果与听者的人体结构有关,可能会有感觉偏左的情况。 这让我想到扬声器单元是分正负极的,如果将正负极接错,会有什么结果!? 之前看头部相关转换函数(HRTF)的文档,以及在HRTF的输出中,左右声道的音量并不一样大,不知道是否专门做成差值达到环绕效果,有待测试。 杜比定向逻辑中,都采用了负值,1代中是完全反相,在2代中有差值。 在混音中,除了上述疑似反相对抗的原理,还有负值消减了混合与目标声道中其他声道的声音,这样更突出了另一个声道的声音,以达到更强的环绕效果,但是在消减中,如果混音至同声道的其他声道声音与反相声道类似,例如都有某个人的说话声,该说话声会被抵消,导致声音不自然,甚至严重失真。 个人并不喜欢这种设置,虽然有了更强的临场感,但不自然,会失真。在测试某段循环时,听多了甚至有要吐的感觉,就像晕3D游戏/视频。 不过反相提升临场感却是是个有效的方法,于是设定一个非常小的反相值,略有临场感也不会感觉到失真。 左右声道反相测试_先反相_后同相.wav:http://pan.baidu.com/s/1nuRc2ox 规格化矩阵:为了避免混音时,声音叠加后,音量过大而产生爆音。 ffmpeg的文档中,pan滤镜的原文是:如果通道规范中的'='替换为'<',则该规范的增益将被重新归一化,以使总数为1,从而避免削波噪声。 在杜比定向逻辑中可以看到,负值是按照绝对值算得,而非按照负值算。 开启规格化矩阵后,混音音量会变小,之后再用potplayer增益下即可! 图2、图3分别是规格化矩阵在potplayer和LAV中的设置。 关于混音的看法,最简单的混音就是1+1+1...,音量过大就开启规格化矩阵。 杜比定向逻辑,又名杜比环绕,最初就是为了增强环绕效果而来。 在影音作品中,声音都是经过定向处理过的,本是提供电影院,家庭影院的多声道音响播放的,而非耳机。所以耳机需要的双声道还原多声道的听感。而非简单的混音,因为即便是多声道,摆放也是有讲究的,在realtek、potplayer、ffdshow中,都有针对多声道中每条声道的音量处理。所以立体声转多声道不再是简单的1+1+1...。 potplayer开启声音处理滤镜,这样外部解码的声音就可以回馈给potplayer,才能再做声音处理、以及录制。反之potplayer的声音处理无法生效,也无法录制到声音! potplayer默认是开启规格化音量的,但是预设75,音量太高,很多时候会产生爆音,动漫的话问题更严重,因为大几率齿音。增益后,齿音更加明显。 我倾向50,其实25已经可以用可以接受了,在网页、系统正常播放音量下,potplayer的声音25增益也可以清晰的听到! 中文翻译的水平扩展和水平衰减,不明其意,英文就很明了。 gain:增益,并不只是放大,预设类型中,增益是最终音量,如果原音量大于设置音量,则是变小。 relesae time:释放时间,待处理音量到处理后音量的过度变换时间,不至于音量突然增大的突兀、不自然!预设类型是不断调整音量,直到音量到达最终音量,可以看到5和25,是同一个坡度减小的,因为增益算法是一样的,所以坡度一样,25提早到达了指定音量,不再变化。而5,继续缩小,直到指定音量。 此预设类型可以理解为处理再处理,直到整个音频的放大量维持在指定音量下。 而后两者处理类型以及ffdshow的音量处理并无法如此先进,所以potplayer的该算法是很优秀的,遗憾的就是预设音量有点高! 以上就是过程中涉及到的相关知识,之后会在其他文章中详解相关知识点。毕竟一周搞出一堆知识,才写一篇文章,不甘心呀! 即便如此,上面还是堆出一堆东西!