ffmpeg streamingとかの話
RTMPサーバー建て&配信
code:sh
docker run --rm -it -p 1935:1935 -p 8080:80 tiangolo/nginx-rtmp
で rtmp://localhost:1935/live/stream に建つ
あとはobsでもtdでもなんでも
tdでやったら遅延は0.85sec程だった
code:sh
ffmpeg -re -i input.mp4 -c:v libx264 -f flv rtmp://localhost:1935/live/stream
これでそこに配信できる
-reオプションは、FFmpegが入力を「リアルタイム速度」で読み込むようにするためのものです。
通常、FFmpegは可能な限り高速に入力データを処理しようとするため、ファイル入力などではソースがとても速く処理されてしまいます。しかし、-reを指定すると、入力ソースを再生速度と同等のスピードで読み込むようになります。
主な用途としては、ライブ配信をエミュレーションするときや、ファイルからの入力をあたかもリアルタイムストリームであるかのように扱いたい場合に用いられます。
-f flvは、FFmpegで出力フォーマットを「FLV(Flash Video)」形式に指定するオプションです。
FLV形式はもともとAdobe Flashで動画を再生するためのコンテナフォーマットで、現在ではRTMP(Real-Time Messaging Protocol)配信と組み合わせて使われることが多いです。たとえば、TwitchやYouTube Liveなどのライブ配信サービスはRTMPを使って配信サーバーに映像を送信する際、FLVコンテナを使うのが一般的です。
FLVはRTMP配信との相性が良いため、このような組み合わせがよく用いられます。
code:sh
ffmpeg -re -i rtmp://localhost:1935/live/stream -c copy out.mp4
あとこれで無限に録画できる感じ
directshow
code:sh
ffmpeg -list_devices true -f dshow -i dummy
これでデバイス一覧
code:sh
ffmpeg -f dshow -i video="Integrated Camera" -c:v libx264 output.mp4
これで入力
code:sh
ffmpeg -f dshow -i video="Integrated Camera":audio="Microphone (Realtek Audio)" -c:v libx264 -c:a aac output.mp4
音声付き
dshowでは出力できない
linuxだとv4l2loopback で仮想デバイス/dev/video0とかを入出力として使えるが、これはwsl2から使えない
MPEG-TS
code:sh
ffmpeg -re -i input.mp4 -c:v libx264 -f mpegts output.ts
こうしてobsからメディアソースで取れる 遅延ひどくなる
無限にファイルがデカくなるのは
code:sh
ffmpeg -i input -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_segment_filename "seg%03d.ts" playlist.m3u8
HLS (HTTP Live Streaming) 用のセグメントを出力する方法もあります。HLS用のm3u8プレイリストと複数のTSファイルを生成することで、ファイルが一つの巨大ファイルにならず、一定時間またはサイズごとに分割されます。
こういうのでファイル分割して回避するらしい
Named Pipe
windowsでできるのか分からん できるらしい
linuxだと簡単(WSLは無理)
Spout
対応してないがspoutを仮想webcamとして使えるやつがある(ffmpegはspout使えない)
NDI
NewTekがnon-freeのFFmpegをバイナリで配布したため打ち切られたみたい
なんか色々あるよ