windowsでffmpegを使ってデスクトップ動画を保存

忘れがちな技としてデスクトップを動画保存するにはどうするか？ってのがある。
LINUXだとFFMPEGですぐできるのだが、WINDOWSで同じことをやってもできなかった。
それはWINDOWSだとX11と違うからだ。
その方法をあらためて調べた。ffmpegでデスクトップ動画保存する手法の調査結果となります。

まず動画だけ音声なしで保存はすぐできた。


```
ffmpeg -y -rtbufsize 100M -f gdigrab -t 00:00:30 -framerate 30 -probesize 10M -draw_mouse 1 -i desktop -c:v libx264 -r 30 -preset ultrafast -tune zerolatency -crf 25 -pix_fmt yuv420p 　video_comapre2.mp4
```

どうもgdigrabってのがキーらしい。
しかしながら、これ用のDIRECTSHOWのドライバーがあった。
それを入れるともっと便利
UScreenCaptureってやつ↓
http://www.umediaserver.net/components/index.html
http://www.umediaserver.net/bin/UScreenCapture.zip
http://www.umediaserver.net/bin/UScreenCapture(x64).zip
これをインストールすると

```shell-session
 
ffmpeg -f dshow -i video="UScreenCapture" out.mp4

```

でMP4で保存できる。便利だ。
なおできないときは

```shell

 ffmpeg -list_devices true -f dshow -i dummy

```
でデバイスリストがでるのでそれにUScreenCaptureが出るのを確認。
私の場合これが出力された。

```
ffmpeg started on 2018-12-08 at 20:56:30
Report written to "ffmpeg-20181208-205630.log"
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20181017
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
[dshow @ 00000000004b2400] DirectShow video devices (some may be both video and audio devices)
[dshow @ 00000000004b2400]  "HP HD Webcam [Fixed]"
[dshow @ 00000000004b2400]     Alternative name "@device_pnp_\\?\usb#vid_1bcf&pid_2888&mi_00#7&2497575&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 00000000004b2400]  "UScreenCapture"
[dshow @ 00000000004b2400]     Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\UScreenCapture"
[dshow @ 00000000004b2400]  "screen-capture-recorder"
[dshow @ 00000000004b2400]     Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{4EA69364-2C8A-4AE6-A561-56E4B5044439}"
[dshow @ 00000000004b2400] DirectShow audio devices
[dshow @ 00000000004b2400]  "集積マイク アレイ (2- IDT High Definiti"
[dshow @ 00000000004b2400]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\集積マイク アレイ (2- IDT High Definiti"
[dshow @ 00000000004b2400]  "virtual-audio-capturer"
[dshow @ 00000000004b2400]     Alternative name "@device_sw_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\{8E146464-DB61-4309-AFA1-3578E927E935}"
[dshow @ 00000000004b2400]  "ステレオ ミキサー (2- IDT High Definiti"
[dshow @ 00000000004b2400]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\ステレオ ミキサー (2- IDT High Definiti"
```
次に音付きでキャプチャの方法だが、それはドライバーを入れないとだめらしい。
”らしい”というのははっきり確認できないの意味
とりあえずそのドライバーはこれ
virtual-audio-capturer
https://ja.osdn.net/projects/sfnet_virtualaudiodev/

20200715追記：
　ドライバーなしでマイクを直接取れます。つまりこの記述は間違いです。すみません
　ただマイクにアクセスすると下のタスクバーにマイクにアクセス中のアイコンが出ます。ドライバーを入れるとそれが避けられます。（少なくとも私のWINDOWS10では）

例えばmp3で音だけ保存のときは

```
 ffmpeg -f dshow -i audio="virtual-audio-capturer"  "out.mp3"
```
うまく行かないときは
おなじく

```
  ffmpeg -list_devices true -f dshow -i dummy
```
で確認。

最後にmp4動画保存は

```
 ffmpeg -f dshow -i video="UScreenCapture":audio="virtual-audio-capturer"  output.mp4
```
で成功する。
rtmpとかにもつかえるはずです。

後日オフィシャルな説明を知りました
https://trac.ffmpeg.org/wiki/Capture/Desktop

さらに追記NvidiaのPCだとうまくいかない（色がおかしい）ことがある。そのときは

```
　ffmpeg -f dshow -i video="UScreenCapture":audio="virtual-audio-capturer" -c:v h264_nvenc -qp 0 output.mkv
```
もしくは

```
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v h264_nvenc -qp 0 output22.mkv
```

h264_nvencてマニアックな引数があるってのが上の公式に載っている。


追記
最近になってUScreenCaptureに代わってscreen　capture recorder to video windows free(長い！)
https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases
を使うようにした。メリットはメモリがキツイPCでも動くこととVIDEO,AUDIOが一括で入ることです。
ffmpeg -f dshow -i video=screen-capture-recorder:audio=virtual-audio-capturer" .....
みたいに使います。