ffmpegでスクリーンキャスト&ウェブカメラ撮影
webcam
- TOP
- Old Archives
- ffmpegでスクリーンキャスト&ウェブカメラ撮影
ほぼArch wikiの通りではあるけれども
スクリーンキャスト
スクリーンキャストはPCの画面を録画する。
recordMyDesktopやIstanbulを使うことが多いかもしれないが、処理が遅くて録画した後が大変だし、音声に自由度がない。
とりあえずFullHDでキャストしてみた。
$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -f alsa -i pulse -acodec aac -vcodec libx264 -preset ultrafast -qp 0 tmp/test.mp4
これで左上から1920x1080の領域が録画される。音声はpulse経由であり、マイク保存することもできるし、モニターを保存することもできるし、特定のアプリケーション出力を保存することもできる。
特に音声を記録しないなら
$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -acodec aac -vcodec libx264 -preset ultrafast -qp 0 tmp/test.mp4
ALSAでやりたいなら
$ ffmpeg -f x11grab -video_size 1920x1080 -i $DISPLAY -f alsa -i default -acodec aac -vcodec libx264 -preset ultrafast -qp 0 tmp/test.mp4
特定のウィンドウを記録するにはxwininfoを使えばいける。
使い方としては、-w(ウィンドウモード)、-m(マイク有効)オプションを受け付ける。
ウェブカム録画
$ ffmpeg -f alsa -i pulse -f v4l2 -s 1280x720 -i /dev/video0 -acodec flac -vcodec libx264 -preset ultrafast tmp/test.mkv
意外ときつい。解像度を落とせばいける。
ただし、guvcviewなどで録画するよりはずっと快適。
PulseAudio応用
マイクから録る
単純にpavucontrolから録音しているアプリケーションのマイクデバイスを選択すれば良い
モニターを録る
入力装置をAll Expect Mintorsではなく、All Input Devicesにすればモニターも見える。 あとは録音しているアプリケーションでモニターを選択すれば良い
特定のアプリケーションだけ録る
$ pacmd load-module module-null-sink sink_name=MySink
$ pacmd update-sink-proplist MySink device.description=MySink
といった感じでSinkを作成、これがスピーカーとして入るのでアプリケーションの出力先にする。 これだけでは追加されるのはモニターだけでマイクロフォンはないが、Monitor of Null 出力を選択すればそのアプリケーションだけ取れる。
もちろん複数のアプリケーションをまとめて録音することも可能。
エンコード
ultrafastで録画したデータは非常に大きいので、圧縮する。
圧縮がしやすいように用意した~/.zshrc.d/40-zaliasesは以下の通り
## Video Conversion ##
videocomps() {
#WebM? H.264? H.265?
case $1 in
264)
case $2 in
best)
ffmpeg -i "$3" -vcodec libx264 -preset veryslow -crf 18 -strict -2 _comped_"${3:r}".mp4
;;
goodslow)
ffmpeg -i "$3" -vcodec libx264 -preset slow -crf 18 -strict -2 _comped_"${3:r}".mp4
;;
good)
ffmpeg -i "$3" -vcodec libx264 -crf 18 -strict -2 _comped_"${3:r}".mp4
;;
normal)
ffmpeg -i "$3" -vcodec libx264 -crf 23 -strict -2 _comped_"${3:r}".mp4
;;
light)
ffmpeg -i "$3" -vcodec libx264 -crf 28 -strict -2 _comped_"${3:r}".mp4
;;
mobile)
ffmpeg -i "$3" -vcodec libx264 -crf 36 -strict -2 _comped_"${3:r}".mp4
;;
esac
;;
265)
case $2 in
best)
ffmpeg -i "$3" -vcodec libx265 -preset veryslow -x265-params crf=18 -strict -2 _comped_"${3:r}".mp4
;;
verygoodslow)
ffmpeg -i "$3" -vcodec libx265 -preset slow -x265-params crf=18 -strict -2 _comped_"${3:r}".mp4
;;
verygood)
ffmpeg -i "$3" -vcodec libx265 -x265-params crf=18 -strict -2 _comped_"${3:r}".mp4
;;
good)
ffmpeg -i "$3" -vcodec libx265 -x265-params crf=23 -strict -2 _comped_"${3:r}".mp4
;;
normal)
ffmpeg -i "$3" -vcodec libx265 -x265-params crf=28 -strict -2 _comped_"${3:r}".mp4
;;
light)
ffmpeg -i "$3" -vcodec libx265 -x265-params crf=32 -strict -2 _comped_"${3:r}".mp4
;;
mobile)
ffmpeg -i "$3" -vcodec libx265 -x265-params crf=38 -strict -2 _comped_"${3:r}".mp4
;;
esac
;;
webm)
case $2 in
best)
ffmpeg -i "$3" -c:v libvpx-vp9 -b:v 0 -threads 8 -crf 10 -c:a libopus -f webm _comped_"${3:r}".webm
;;
verygood)
ffmpeg -i "$3" -c:v libvpx-vp9 -b:v 0 -threads 8 -crf 18 -c:a libopus -f webm _comped_"${3:r}".webm
;;
good)
ffmpeg -i "$3" -c:v libvpx-vp9 -b:v 0 -threads 8 -crf 23 -c:a libopus -f webm _comped_"${3:r}".webm
;;
normal)
ffmpeg -i "$3" -c:v libvpx-vp9 -b:v 0 -threads 8 -crf 28 -c:a libopus -f webm _comped_"${3:r}".webm
;;
light)
ffmpeg -i "$3" -c:v libvpx-vp9 -b:v 0 -threads 8 -crf 33 -c:a libopus -f webm _comped_"${3:r}".webm
;;
mobile)
ffmpeg -i "$3" -c:v libvpx-vp9 -b:v 0 -threads 8 -crf 48 -c:a libopus -f webm _comped_"${3:r}".webm
;;
esac
;;
esac
}
CRF値はH.264以外はちゃんとデータを出していない。 参考までにVP9 CRF33でエンコードするとこんな感じだった。
$ ls -lh
合計 50M
-rw------- 1 aki users 3.1M 3月 14 16:50 _comped_purebuilder.webm
-rw------- 1 aki users 47M 3月 14 16:46 purebuilder.mp4
シンプルなスクリーンキャストとはいえ、mobileはさすがにきつい。