コマンドライン構文
ffmpeg -f [format] 入力 -f [format] 出力
出力は複数あってもいい
muxとdemux
光通信関連でよく見るが、ffmpegのドキュメントでもよく出てくる。複数のストリームを一つにまとめるのがmux
、逆がdemux
-list_devices true
カメラを一覧で出すときに使う
ffmpeg -list_devices true -f dshow -i dummy
-list_options true
ffmpeg -f dshow -list_options true -i video="USB Camera"
[dshow @ 00000299226cdf40] DirectShow video device options (from video devices)
[dshow @ 00000299226cdf40] Pin "キャプチャ" (alternative pin name "0")
[dshow @ 00000299226cdf40] vcodec=mjpeg min s=1920x1080 fps=15 max s=1920x1080 fps=30
[dshow @ 00000299226cdf40] pixel_format=yuyv422 min s=640x480 fps=15 max s=640x480 fps=30
[dshow @ 00000299226cdf40] Pin "キャプチャ" (alternative pin name "1")
[dshow @ 00000299226cdf40] vcodec=h264 min s=1920x1080 fps=15 max s=1920x1080 fps=30
ここではvcodec
にmjpegとh264があり、このUSBカメラはh264のハードウェアエンコードに対応していることがわかる。
pixel_format=yuyv422
は無圧縮のrawデータに対応していることを示している。422は色情報を意味する
444>420のように数字が大きいほど色再現性が高い。
Pin "キャプチャ" の行は入力コーデックを選択するときに使う-video_pin_name
の値を指定するときに使う
ffprobe -f dshow -video_pin_name 1 -i video="USB Camera"
-re || -readrate 1
ファイルをストリームするときとかに使う
ffmpegはCPUが可能な限り最大の速度で次のフレームを読み取ろうとするので、このオプションなしでストリームを作ると早送りされた動画みたいになる
ffmpeg -re -i .\sample.mp4 -an -c:v hevc_qsv -f rtp rtp://localhost:6004
stream_loop -1
一つのファイルを無限にループして処理する。指定しないと最後のフレームを処理してffmpegが終了する
ffmpeg -re -stream_loop -1 -i .\sample.mp4 -an -c:v hevc_qsv -f rtp rtp://localhost:6004
-rtbufsize
バッファサイズを指定する。バッファが大きいとストリーミングで遅延する。小さいと溢れてパケロスする。良い塩梅が難しい
ffmpeg -rtbufsize 2048M -f dshow -i video="Game Capture 4K60 S+" -f rtp rtp://localhost:5004
-r
入力および出力でのフレームレート指定。
ffmpeg -f dshow -i video="Game Capture 4K60 S+" -r 10 -f rtp rtp://localhost:5004
-s
解像度指定。入力と出力両方で使える
ffmpeg -f dshow -i video="Game Capture 4K60 S+" -s 1920x1080 -c:v h264_nvenc -f rtp rtp://localhost:5004
-f dshow
windowsで使うやつ。directshowのデバイスが扱える
-codec:v (== -c:v) -codec:a (== -c:a)
出力用
指定したのコーデックにトランスパイルする。copyにするとそのまま出力される
ffmpeg -f dshow -i video="Game Capture 4K60 S+" -vcodec copy -an
-g
Iフレーム間のフレーム枚数が決まります。I/B/PフレームのまとまりをGOPといいます。シーンチェンジが少ない動画では値を大きくすると圧縮率があがります
-sdp_file
SDPファイルを出力する。SDPファイルはストリームのコーデックやフレームレート等を相手に伝えるためのファイルです。WebRTCでも使われるやつですね。
v=0
o=- 0 0 IN IP6 ::1
s=柔道トップ選手のトレーニングが過激すぎた
c=IN IP6 ::1
t=0 0
a=tool:libavformat 58.51.101
m=audio 3000 RTP/AVP 97
b=AS:768
a=rtpmap:97 PCMU/48000/2
ffmpeg -i .\Videos\Captures\sample.mp4 -vn -f rtp rtp://localhost:3000 -sdp_file sdp.file
ffprobe
ストリーム入力のコーデックを調べるときに使う
ffprobe -i rtsp://192.168.80.242:8554/video
Input #0, rtsp, from 'rtsp://192.168.80.242:8554/video':
Metadata:
title : Session streamed with GStreamer
comment : rtsp-server
Duration: N/A, start: -0.033333, bitrate: N/A
Stream #0:0: Video: h264 (High), yuvj420p(pc, smpte170m, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 60 fps, 60 tbr, 90k tbn, 120 tbc