
継続的にビデオをキャプチャしたい IP カメラがいくつかあります。さまざまな RTSP ソースからキャプチャするために ffmpeg をラップするスクリプトを作成しています。しかし、データをキャプチャして保存する方法に苦労しています。具体的には、シームレスなクリップをキャプチャするにはどうすればよいでしょうか。
明確にするために、次のようなコマンドを実行します。
ffmpeg -i rtsp://ip_cam file.mp4
これは、ハード ドライブがいっぱいになるまで (または ffmpeg またはファイル システムの上限に達するまで) 永久に実行されます。そこで、次のようなことをすることを考えました。
ffmpeg -i rtsp://ip_cam -fs 104857600 file-1.mp4
これにより、各ファイルは 100 MB に制限されます。ラッパー スクリプトは、このインスタンスが終了するとすぐに新しいインスタンスを開始できます。
ffmpeg -i rtsp://ip_cam -fs 104857600 file-2.mp4
などなど(必要に応じて古いファイルを消去してスペースを回復する別のプロセスを用意することもできます)。このアプローチの問題点は、ffmpegが起動するまでに1~2秒かかることです。つまりその間、問題のカメラは何も録画していないことになる。
考慮すべきもう 1 つの点は、各ファイルについて、開始および終了のタイムスタンプを知る必要があることです。たとえば、file-1.mp4
"2015-09-12 09:03:42" から "2015-09-12 11:24:21" を参照する場合があります。このようにして、ユーザーが特定のクリップを取得したい場合、その場所がわかります。また、各クリップに対して ffmpeg を開始し、各クリップの最後で終了する場合、その情報をキャプチャして保存できます。ただし、ffmpeg に、出力を個別のチャンクに保存しながら無期限に実行するように指示する (ffmpeg でそれが可能な場合) という提案されたアプローチの場合、この情報を収集できないため、うまくいかない可能性があります。
ご意見をいただければ幸いです。
答え1
試してみてくださいセグメントマルチプレクサー。
ffmpeg -i rtsp://ip_cam -c copy -f segment -segment_list out.list -segment_time 900 \
-segment_atclocktime 1 -strftime 1 "%Y-%m-%d_%H-%M-%S.mkv"
-segment_list
リストファイルを生成します。-segment_time
セグメントの継続時間を設定します。値は継続時間指定でなければなりません。デフォルト値は2です。指定された時間に参照ストリームのキーフレームを強制しない限り、分割は正確ではない可能性があることに注意してください。セグメントマルチプレクサーのドキュメント詳細については。-segment_atclocktime
「1」に設定すると、00:00 時から始まる一定の時間間隔で分割されます。 で指定された時間値は-segment_time
、分割間隔の長さを設定するために使用されます。たとえば、segment_time を「900」に設定すると、12:00 時、12:15 時、12:30 時などにファイルを作成できます。-strftime
これにより、ファイルの作成時刻に基づいてセグメントに名前を付けることができます。
出力ファイル名の例:
$ ls -m1
2015-09-12_14-10-02.mkv
2015-09-12_14-10-14.mkv
2015-09-12_14-10-24.mkv
2015-09-12_14-10-34.mkv
2015-09-12_14-10-44.mkv
2015-09-12_14-10-54.mkv
を参照してくださいドキュメントさらに多くのオプションと情報をご覧ください。