深堀
今回は、FFmpegとSRTとをトライしたときのメモの一部を記載。お題はいくつか。
SRTによるファイル転送時の受信側でのファイル保存
回線状況が細いときも含めて、今のところ下記状況がベストの組み合わせ(オプション)であった。
送信側
ffmpeg -re -i 送信ファイル -f mpegts "srt://192.168.10.202:8888?pkt_size=1316"
受信側
ffmpeg -fflags nobuffer -probesize 32k -analyzeduration 0 -i "srt://192.168.10.202:8888?mode=listener" -c copy -f mpegts output.ts(受信ファイル)
probesize(データの解析に必要なバッファ)、anlyzeduration(解析する最大時間) を指定する。あえて指定する必要はないかもしれないが、「その1」で記載したリアルタイム転送(特に回線が細い状況)では、これらのオプションを指定したほうがベターであった(ChatGPTにも聞いてトライした結果)。
ファイルフォーマット変換
オプション「-vf」の話。必要に迫られて、トライした記録。
すかし表示+再生
ffplay -i ファイル -vf "drawtext=text='HELLO':fontcolor=white:fontsize=80:x=(w-text_w)/2:y=(h-text_h)/2"
中央に「HELLO」を表示しながら、動画ファイルを再生する。
ffplay -i ファイル -vf "drawtext=text='こんにちは':fontfile='C\:/Windows/Fonts/msgothic.ttc':fontcolor=black:fontsize=80:x=(w-text_w)/2:y=(h-text_h)/2"
日本語を表示する場合、フォントを指定する(fontfile)必要がある。
すかし表示+保存
ffmpeg -i 入力ファイル -vf "drawtext=text='こんにちは':fontfile='C\:/Windows/Fonts/msgothic.ttc':fontcolor=black:fontsize=80:x=(w-text_w)/2:y=(h-text_h)/2" -c:v libx264 -preset ultrafast -c:a copy 出力ファイル
動画ファイルに「すかし」を入れて、ファイルを作成する。
解像度およびフレームレート変換
複数項目を変換するには、「""」内を「,」で区切って複数項目を指定。
ffmpeg -i ファイル -vf "scale=640:480,fps=30" -c:a copy 640x480_fps30.mp4
上記は、解像度「640x480」、フレームレート30fpsへの変換である。
フォーマット変換して表示 (Windows)
下記は、「ぼかし」を入れる(Windowsの場合、Linuxでは未調査)。
ffmpeg -i ファイル -vf "boxblur=5" -f sdl2 "Title"
他のフォーマット変換
他にも使えそうなものが多数あり。
- "vflip":垂直反転、"hflip":水平反転
- "setpts=PTS/2":2倍速
検索すれば、多数見つかる。
SRT
「その1」で書き足りなかったところ。
ACKの数
受信側
ffplay -fflags nobuffer -autoexit "srt://192.168.56.1:8888?mode=listener"
送信側
ffmpeg -re -i 送信ファイル -f mpegts srt://192.168.56.1:8888
上記を実行したときの、単なる気づき。全体に占めるACKの割合が、送信ファイルにより異なっていた。下記は、解像度「1920x1080」、フレームレート「60fps」のケース。ACKの割合は、14.4%。
下記は、解像度「320x240」、フレームレート「30fps」のケース。ACKの割合は、29.8%。
両方とも再生時間はほぼ同じなのだが、低レートの方がACK多し。理由まで深追いせず。
非常に厳しい環境でのイレギュラー
回線が細く&不安定な状況では、見慣れないControl Packetあり。
送信側のあきらめ(Drop Request)
「NAK (Loss Report)」により、受信していないデータを知らされているが、送信側にそれらのデータが存在していない場合に使われるようだ。上記では、赤枠のデータがもう存在せず、送れないという意味。
KeepAlive
受信側でパケット受信タイムアウトが発生すると、「KeepAlive」を送出する。
参考
SRTのプロトコルとしての詳細については下記参照。
EOF