說明書”)
目錄先給一張“世界觀表”dshow 在 FFmpeg 里的真實鏈路第一步永遠先從 list 開始別靠猜第二步看設(shè)備“到底支持什么格式”一個“能打”的音視頻同時采集命令為什么這樣寫才是“懂 dshow”的人攝像頭 獨立聲卡推薦寫法dshow 最反直覺的 5 件事血淚版1?. dshow 不支持“軟改分辨率”2?. 延遲不是 FFmpeg 的鍋是 BufferTime3?. 音頻采樣率 ≠ 設(shè)備真實 clock4?. 虛擬攝像頭基本都殘5?. 攝像頭被占用 ≠ 報錯而是 RUN 不起來C 代碼視角dshow 到底給你什么調(diào)試 dshow 的“作弊鍵”看 SampleGrabber 實際進了啥用 GraphEdit / GraphStudioNext 對照什么時候不該用 dshow總結(jié)覺得有用就請您幫忙點贊轉(zhuǎn)發(fā)收藏吧您的鼓勵是我創(chuàng)作的動力多謝看官。由于能力水平有限文中的錯誤或不嚴謹?shù)牡胤皆谒y免還請批評指正。FFmpeg 與 DirectShow 在 Windows 平臺上主要通過兩種方式進行交互一是利用 FFmpeg 的dshow輸入格式直接調(diào)用 DirectShow 接口采集音視頻設(shè)備數(shù)據(jù)二是使用基于 FFmpeg 核心庫開發(fā)的 ?LAV Filters? 組件作為 DirectShow 過濾器來提升媒體播放和解碼能力。很多人第一次用 FFmpeg 采攝像頭都是這一句ffmpeg -f dshow -i videoIntegrated Camera out.mp4然后黑屏報Could not run filter graph幀率低得像 PPT麥克風(fēng)有聲、攝像頭沒圖于是你得到一個錯誤印象dshow 是 FFmpeg 的玩具模塊事實正好相反FFmpeg 的 dshow 是 libavdevice 里最“Win32 味兒”的一個設(shè)備后端?它不是 wrapper它是CoCreateInstance → FilterGraph → SampleGrabber 的手寫封裝這篇不教你怎么敲命令教你dshow 在 Windows 下到底在摸什么。先給一張“世界觀表”你以為實際-f dshow是 FFmpeg 專用協(xié)議? DirectShow Filter Graphvideo后面是設(shè)備名? FriendlyNameFFmpeg 直接讀驅(qū)動? 走系統(tǒng)注冊表 CLSID分辨率隨便寫? 只認 Pin 的 MediaType采集卡 免驅(qū)? 沒 AM_MEDIA_TYPE 就跪dshow 在 FFmpeg 里的真實鏈路avdevice_register_all() ↓ dshow_read_header() ↓ CoCreateInstance(CLSID_FilterGraph) ↓ FindCaptureDevice(FriendlyName) ↓ BindFilter → AddFilter ↓ SampleGrabber (視頻) / Audio Capture Source ↓ IMediaControl::Run() ↓ Callback → AVPacketFFmpeg 根本沒有“驅(qū)動層代碼”?它只是把 DS 回調(diào)里來的 Sample 打成AVPacket.data第一步永遠先從 list 開始別靠猜ffmpeg -list_devices true -f dshow -i dummy輸出長這樣DirectShow video devices: [0] HD Pro Webcam C920 [1] OBS Virtual Camera DirectShow audio devices: [0] Microphone (Realtek Audio) [1] C920 Microphone坑點中文名有空格 →一定要引號OBS Cam 是虛擬 Filter不支持某些 MEDIASUBTYPE第二步看設(shè)備“到底支持什么格式”90% 的黑屏是因為Pin 不接受 MJPEG / RGB24ffmpeg -f dshow -list_options true ^ -video_device_number 0 ^ -i videoHD Pro Webcam C920你會看到pin Capture subtype: {MJPG} 1280x720 30.00 fps subtype: {YUY2} 640x480 30.00 fps結(jié)論UVC 攝像頭 → 優(yōu)先 MJPGUSB2.0 硬扛 YUY2 → 必卡一個“能打”的音視頻同時采集命令ffmpeg -f dshow ^ -video_size 1280x720 ^ -framerate 30 ^ -pixel_format mjpeg ^ -i videoHD Pro Webcam C920:audioMicrophone (Realtek Audio) ^ -c:v libx264 -preset ultrafast -g 30 ^ -c:a aac ^ -y out.mp4為什么這樣寫才是“懂 dshow”的人參數(shù)意義pixel_format mjpeg繞開 USB 帶寬墻video_size framerate直接命中 Pin MediaType:audio拼同一個 graph少一個時鐘源ultrafast采集不做慢編碼攝像頭 獨立聲卡推薦寫法不要迷信 audiovideo 一個 dshowffmpeg -y ^ -f dshow -video_size 1280x720 -framerate 30 -pixel_format mjpeg ^ -i videoC920 ^ -f dshow -sample_rate 48000 -channels 2 ^ -i audioRME Babyface ^ -map 0:v -map 1:a ^ -c:v libx264 -c:a aac out.mkv好處兩個 graph 不打架音頻延遲可控錄屏軟件通用方案dshow 最反直覺的 5 件事血淚版1?. dshow 不支持“軟改分辨率”-video_size 1920x1080 # 攝像頭沒 Pin → 直接 failFFmpeg 不會 scale只會拒絕。2?. 延遲不是 FFmpeg 的鍋是 BufferTime-rtbufsize 1Mdshow 默認 buffer 很大推流時必加-f dshow -rtbufsize 50M -i videoxxx采集 OK推流越小越好10~30M3?. 音頻采樣率 ≠ 設(shè)備真實 clockWindows 混音器 44.1kFilter 實際 48k→ FFmpeg 報resample glitch強制一致-sample_rate 44100 -channel_layout stereo4?. 虛擬攝像頭基本都殘?zhí)摂M源dshow 兼容性O(shè)BS Cam? MJPG 不行ManyCam?? 只出 RGB24Unity Capture?NVIDIA Broadcast? 但獨占5?. 攝像頭被占用 ≠ 報錯而是 RUN 不起來DirectShow 返回VFW_E_NOT_RUNNINGFFmpeg 只給你一句Could not run filter graph關(guān) Zoom / Teams / Edge 再試C 代碼視角dshow 到底給你什么AVFormatContext* fmt avformat_alloc_context(); AVDictionary* opts NULL; av_dict_set(opts, video_size, 1280x720, 0); av_dict_set(opts, framerate, 30, 0); av_dict_set(opts, pixel_format, mjpeg, 0); avformat_open_input(fmt, videoHD Pro Webcam C920, av_find_input_format(dshow), opts);FFmpeg 內(nèi)部干了這些事你看不到ICreateDevEnumIMoniker::BindToObjectIGraphBuilder::ConnectSampleGrabberCB::SampleCBmemcpy→AVPacket所以dshow 是 FFmpeg 里極少數(shù)“COM 感”很重的模塊調(diào)試 dshow 的“作弊鍵”看 SampleGrabber 實際進了啥ffmpeg -debug dshow -f dshow -i videoxxx用 GraphEdit / GraphStudioNext 對照FFmpeg 打不開 → GraphStudio 也打不開GraphStudio 能跑 → FFmpeg 缺 subtype什么時候不該用 dshow場景建議游戲錄制? Desktop Duplication多路同采? Media Foundation超低延遲推流? 專用 SDKUSB 采集卡 4K?? MJPG 賭命工業(yè)相機? GenICam?dshow 的最佳定位“快速接入消費級攝像頭 麥克風(fēng)”總結(jié)FFmpeg libavdevice 在 Windows 上的音視頻采集后端本質(zhì)COM / DirectShow FilterGraph 的薄封裝數(shù)據(jù)路徑攝像頭/麥克風(fēng)驅(qū)動 → DS Filter → SampleGrabber → AVPacket不碰驅(qū)動、不解碼、不縮放、不混音