FFmpeg 8.0のmasterにWindows.Graphics.Captureに対応したウィンドウキャプチャがキター!!
やったー!!
全俺が歓喜!
FFmpegのキャプチャ機能
あまり知られていないかもしれませんが、FFmpegにはキャプチャ機能が実装されています。
Windows版では、これまでGDI、Desktop Duplication APIが実装されていましたが、この度、Windows.Graphics.Captureに対応したウィンドウキャプチャが実装されました!
最新のFFmpeg Windows masterバイナリで利用可能です!
既に上記のドキュメントやwikiにも使用方法が記載されています(仕事が早すぎる・・・
使い方
公式wikiの劣化翻訳にはなりますが。
- DirectXを利用したキャプチャなので、libx264などソフトウェアエンコーダを利用する場合、
hwdownloadでCPUメモリにダウンロードしてくる必要があります。nvencやamf、qsvなどのハードウェアエンコーダでは不要とのこと。 - キャプチャ対象は、
window_title='My Application'というようにウィンドウタイトルを指定する方法、monitor_idx=1としてモニターidを指定する方法、window_exe='firefox.exe'と実行ファイル名を指定する方法、hwndでWindowハンドルを直接指定する方法などがあります。
ffmpeg -filter_complex gfxcapture=window_title='(?i)My Application':max_framerate=60,hwdownload,format=bgra,format=yuv420p -c:v libx264 -crf 15 capture.mp4
ffmpeg -filter_complex gfxcapture=monitor_idx=1:width=1920:height=1080:resize_mode=scale_aspect:output_fmt=10bit -c:v hevc_nvenc -cq 15 capture.mp4
ffmpeg -filter_complex gfxcapture=window_exe='^firefox.exe$':display_border=1:scale_mode=point:max_framerate=60,fps=60 -rc qvbr -qvbr_quality_level 15 -c:v hevc_amf capture.mp4
昨日マージされたばかりなのに何で私は気づいたのか?
なぜなら私が要望したから!
どうして要望したの?
自作アプリは、現在はキャプチャした動画を処理する機能しかないのですが、リアルタイムにキャプチャして、処理し、仮想カメラに出力して、OBSから配信、とかできたらいいなー、と妄想してました。
キャプチャと仮想カメラの実装方法を調べていくと、次の記事を見つけました。
Windows.Graphics.Capture を利用すると良さそうだなーと。
今はFFmpegで動画を撮り込んでるけど、FFmpegでキャプチャできないのかなー?できたら簡単なんだけどなー
って検索してみると、できるじゃん!!
と思ったんですが、GDI、Desktop Duplication API しか実装されておらず。
機能追加のissueも見当たらなかったので、ダメ元で要望したのでした。
(あとでもうちょっと検索してみると、実は同じ内容のissueは存在した。)
どうも以前にもWindows.Graphics.Captureでの実装をトライしたようでしたがその時は実現できず、ちょうどmingwの相互運用ヘッダーが実装されたこともあって、以前よりも実現の可能性が上がっていたようです。
感想
- わたしが、どうやってWindows.Graphics.Captureを実装しようかなー?と考えているうちに、あっという間に実装してしまいました。すげぇ!
- issueのチケットでやり取りした方々は、ffmpegのwindowsビルドを配信されてる方々だったりして、この名前の人って存在するんだ・・・と感じました。神々との邂逅、みたいな。
- それに引き換え私のレベルの低さよ・・・
- FFmpegの神々がキャプチャ部分を作ってくれたので、わたしは仮想カメラ実装をがんばります!
