头像
06_taro
核心会员
核心会员
帖子: 998
注册时间: 2010-09-22 18:32
来自: United Kingdom
联系: 网站

FFDShow編譯版(修正Audio output formats選擇邏輯)

現在一般常見的聲卡都只支持接收最高24bit的輸入,
因此要使用WASAPI/ASIO Renderer的話解碼輸出應該使用16~24bit的formats。
不過FFDShow有個詭異的邏輯,
全部輸出都勾選的情況下,它的選擇邏輯沒有問題。
但是只勾選16/24bit時,
由於FFDShow裡的EQ、Mixer、volume與Winamp2這四個filter不支持24bit的運算,
因此對24bit的輸入,如果開啟了上述四個filter中任何一個(例如很常用的Mixer),
內部運算輸出的是32bit interger,這種情況下輸出會按照32bit interger輸入的優先級來計算。
而32bit interger輸入時,不允許32bit 輸出的話輸出的優先選擇是16bit而不是24bit,導致較大的質量損失,無法發揮24bit聲卡的優勢。
要想輸出24bit,必須只勾選24bit輸出,而不能勾選16bit。
但是這樣的話不光24/32/float按24bit輸出了,連16bit輸入的也會輸出24bit,造成沒必要的帶寬浪費。
LAV Audio倒是沒這種混亂的問題,不過LAV目前還不支持channel up/downmix;
而且LAV內部需要降低bit depth的時候始終是直接bit shift的,不能像ffdshow那樣開啟dither/noise shaping(當然音頻一般也沒必要就是了…),
所以LAV很多時候還沒法單獨使用(我自己也是全部走LAV解碼,然後輸出原始bit depth的PCM交給ffdshow去進行必要的downmix處理的),
於是自己稍微修改了一下,把ffdshow那個混蛋output formats選擇邏輯改掉了。

下載(ICL12是指ICL12.1編譯的,在Intel的CPU上表現更好,部分filter甚至有30-50%的提速;未標記的是MSVC2010 SP1編譯的):
新版(也許是最後的版本):
ffdshow_rev4505_20130402_tMod_x86.7z
ffdshow_rev4505_20130402_tMod_x64.7z

ffdshow_rev4479_20120812_tMod_x86.7z: MediaFireNMM-Mirror
ffdshow_rev4479_20120812_tMod_x64.7z: MediaFireNMM-Mirror
ffdshow_rev4479_20120812_tMod_icl12.1_x86.7z: MediaFireNMM-Mirror
ffdshow_rev4479_20120812_tMod_icl12.1_x64.7z: MediaFireNMM-Mirror

這個修改版裡,完整的優先級順序是:
16bit interger輸入按照16bit interger>24bit interger>32bit interger>32bit float的優先級順序輸出;
24bit interger輸入按照24bit interger>32bit interger>32bit float>16bit interger的優先級順序輸出;
32bit interger輸入按照32bit interger>32bit float>24bit interger>16bit interger的優先級順序輸出;
32bit float的輸入按照32bit float>32bit interger>24bit interger>16bit interger的優先級順序輸出。

例如對目前常見的24bit聲卡只勾選16/24bit輸出的情況下,
16bit輸入時則輸出16bit,24/32/32float輸入則輸出24bit。
如果聲卡要求24bit必須pad到32bit,則應該只勾選16/32bit輸出,此時
16bit輸入則輸出16bit,24/32/32float輸入則輸出32bit。
當然如果勾選全部的輸出格式,則和原版一樣沒有影響。
總之原則是能不轉則不轉,在必須轉時優先進行無損的提升bit方式轉換,在必須降bit時優先輸出允許的最高bit depth。
不過正如前面說的,FFDShow裡的EQ、Mixer、volume與Winamp2這四個filter不支持24bit的運算,
因此對24bit的輸入,如果開啟了上述filter的話,內部運算輸出的是32bit interger,這種情況下輸出會按照32bit interger的優先級來計算。
即如果聲卡支持16/24/32bit輸入的話,同時勾選這三個,則
16bit輸入時輸出16bit;24bit輸入時如果不開啟上述四個filter,則輸出24bit,若開啟上述四個filter,則輸出32bit;32bit interger/float輸入時輸出為32bit。

順便貼一下official版ffdshow詭異而坑爹的邏輯下的完整優先級:
16bit interger輸入按照16bit interger>32bit interger>32bit float>24bit interger的優先級順序輸出;
24bit interger輸入按照24bit interger>32bit interger>16bit interger>32bit float的優先級順序輸出;
32bit interger輸入按照32bit interger>16bit interger>24bit interger>32bit float的優先級順序輸出;
32bit float的輸入按照32bit float>32bit interger>16bit interger>24bit interger的優先級順序輸出。
上次由 06_taro 在 2013-05-03 21:55,总共编辑 5 次。
つまんねー事聞くなよ!

I, personally, for me, believe (obviously sometimes) that my OS choice is right. That's me. I'm not telling you that you should believe it. Learn the facts, and the origins behind the facts, and make up your own damn mind. That's why you have one. (source)

Follow me: @06_taro

304——
为纪念伟大的宇宙史上最强压制304先生,联合国教科文组织决定,将每年的第304天,即平年的10月31日或者闰年的10月30日,定为世界304日。
fch1993
帖子: 213
注册时间: 2012-06-12 11:56

Re: FFDShow編譯版(修正Audio output formats選擇邏輯)

输入在AC3上存在判定问题


General
Unique ID : 210037838904639228682688168241470842973 (0x9E03D0FBA9E59FDF960628CC707B285D)
Complete name : G:\movie\[西班牙女佣].Spanglish.720p.HDTV.ACE.x264.mkv
Format : Matroska
Format version : Version 1
File size : 4.37 GiB
Duration : 2h 5mn
Overall bit rate : 4 981 Kbps
Encoded date : UTC 2007-01-31 12:58:08
Writing application : mkvmerge v1.8.1 ('Little By Little') built on Nov 25 2006 16:14:30
Writing library : libebml v0.7.7 + libmatroska v0.8.0

Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L5.1
Format settings, CABAC : Yes
Format settings, ReFrames : 6 frames
Codec ID : V_MPEG4/ISO/AVC
Duration : 2h 5mn
Bit rate : 4 594 Kbps
Width : 1 280 pixels
Height : 720 pixels
Display aspect ratio : 16:9
Frame rate : 25.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.199
Stream size : 3.95 GiB (90%)
Title : Video
Writing library : x264 core 54 svn-616
Encoding settings : cabac=1 / ref=3 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=6 / brdo=1 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / chroma_qp_offset=0 / threads=2 / nr=0 / decimate=1 / mbaff=0 / bframes=3 / b_pyramid=1 / b_adapt=1 / b_bias=0 / direct=3 / wpredb=1 / bime=1 / keyint=250 / keyint_min=25 / scenecut=40(pre) / rc=2pass / bitrate=4594 / ratetol=1.0 / rceq='blurCplx^(1-qComp)' / qcomp=0.60 / qpmin=10 / qpmax=51 / qpstep=4 / cplxblur=20.0 / qblur=0.5 / ip_ratio=1.40 / pb_ratio=1.30
Language : English
Default : Yes
Forced : No

Audio
ID : 2
Format : AC-3
Format/Info : Audio Coding 3
Mode extension : CM (complete main)
Format settings, Endianness : Big
Codec ID : A_AC3
Duration : 2h 5mn
Bit rate mode : Constant
Bit rate : 384 Kbps
Channel(s) : 2 channels
Channel positions : Front: L R
Sampling rate : 48.0 KHz
Bit depth : 16 bits
Compression mode : Lossy
Delay relative to video : 24ms
Stream size : 345 MiB (8%)
Title : Audio
Language : English
Default : Yes
Forced : No

结果输出时为32位浮点,reclock无法运行。
一开始以为是设置不对,结果我关了所有的滤镜问题依旧存在。
卸载了reclock,并关闭了MPC-HC的内部滤镜。
解码器也是ffdshow。
图片
图片
图片
图片
图片
图片

网上就一个4460,绝不会弄错的。
头像
06_taro
核心会员
核心会员
帖子: 998
注册时间: 2010-09-22 18:32
来自: United Kingdom
联系: 网站

Re: FFDShow編譯版(修正Audio output formats選擇邏輯)

ffdshow識別沒有問題,ac3本來就是float,所以ffdshow,lavaudio解碼默認都是輸出float,nero的dshow輸出24int。mediainfo把ac3當16bit那是它的事。如果你的聲卡不支持float就別在ffdshow裡開啟float輸出,或者用reclock的話在reclock的輸出設定裡選支持的格式而不是as-is,不然肯定RP
つまんねー事聞くなよ!

I, personally, for me, believe (obviously sometimes) that my OS choice is right. That's me. I'm not telling you that you should believe it. Learn the facts, and the origins behind the facts, and make up your own damn mind. That's why you have one. (source)

Follow me: @06_taro

304——
为纪念伟大的宇宙史上最强压制304先生,联合国教科文组织决定,将每年的第304天,即平年的10月31日或者闰年的10月30日,定为世界304日。
fch1993
帖子: 213
注册时间: 2012-06-12 11:56

Re: FFDShow編譯版(修正Audio output formats選擇邏輯)

can you update ffdshow as rev77 of IntelQuickSync Decoder has been updated.

回到 “解码 播放 字幕 / Decoder playback and subtitles”