Rheomeshで録画機能をサポートする

h3poteto.hatenablog.com

ここで作っていたOSSに録画機能を入れた.

github.com

それと,ドキュメントサイトを作っておいたので,こちらに詳しい機能説明を載せてある.

h3poteto.github.io

録画機能と言ってもRTPパケットを転送するだけ

関数一つで録画ファイルまで生成してしまうのも悪くはないんだけれど,サーバとして稼働することを考えるとあんまり自由度がない. むしろもっとシンプルにして,エンコード等は外でやってもらうほうがいいかと思い,単にRTPパケットを転送するだけにした. ちなみにffmpegもGStreamerも,送られてきた生RTPパケットから動画ファイルを作り出せるので,録画自体はそれらにお任せする設計にしておく.

ただ,一部SDPはほしいかと思ったので,SDPを生成できるようにしておく.特にffmpegあたりはSDPを元に録画をするので,これがないと話にならない.

docs.rs

generate_sdp で,SDPの文字列が得られる.あとは,これを指定してffmpegを起動しておいて,

$ ffplay -protocol_whitelist file,rtp,udp -analyzeduration 10000000 -probesize 50000000 -f sdp -i stream.sdp

で,受信を待機させる. この状態で

docs.rs

start_recording すれば,生RTP転送が始まるので,ffplayで映像が確認できる.

録画したものをファイルに保存しておきたい場合は,

$ ffmpeg -protocol_whitelist file,rtp,udp -i stream.sdp -c copy output.mkv

こういうコマンドにしておくと output.mkv に録画されることになる.

GStreamerであれば,コマンドライン引数でこういうのを指定するので,SDPを読んだうえで

$ gst-launch-1.0 udpsrc port=30001 ! \
  application/x-rtp,payload=103,encoding-name=H264 ! \
  rtph264depay ! \
  h264parse ! \
  avdec_h264 ! \
  videoconvert ! \
  autovideosink

こんな感じのコマンドで待機しておく.使ってるエンコーディングによって多少パラメータは変わるが,そのへんは公式のドキュメントで,

gstreamer.freedesktop.org

gstreamer.freedesktop.org

このへんを調べてもらって,SDPにかかれているエンコーディングと合致したものを指定してもらいたい.

Exampleもあるよ

h3poteto.github.io

cameraのexampleに録画機能のexampleも付属させておいた.

これは画面上にSDPを出力するので,それをコピーしてffmpegなりGStreamerで受信してもらえれば良い.

次はrelayをもうちょっと改善しようと思っている.