FFmpeg/AVconc – Nahtlose Videoaufnahme

FFmpeg/AVconc – Nahtlose Videoaufnahme

Ich habe mehrere IP-Kameras, von denen ich kontinuierlich Videos aufnehmen möchte. Ich erstelle ein Skript, das ffmpeg umschließt, um von den verschiedenen RTSP-Quellen aufzunehmen. Aber ich habe Probleme damit, die Daten aufzunehmen und zu speichern. Genauer gesagt, wie nehme ich nahtlose Clips auf?

Zur Verdeutlichung: Wenn ich einfach einen Befehl wie diesen ausführe:

ffmpeg -i rtsp://ip_cam file.mp4

Das wird ewig laufen, bis meine Festplatte voll ist (oder bis ich eine Obergrenze von ffmpeg oder dem Dateisystem erreiche). Also dachte ich mir, ich könnte so etwas machen:

ffmpeg -i rtsp://ip_cam -fs 104857600 file-1.mp4

Dies würde die Größe der Dateien auf jeweils 100 MB begrenzen. Mein Wrapper-Skript kann eine neue Instanz starten, sobald dieses fertig ist:

ffmpeg -i rtsp://ip_cam -fs 104857600 file-2.mp4

Und so weiter (ich kann einen separaten Prozess haben, der sicherstellt, dass die alten Dateien nach Bedarf gelöscht werden, um Speicherplatz freizugeben). Das Problem bei diesem Ansatz ist, dass es 1-2 Sekunden dauert, bis ffmpeg startet.Das heißt, während dieser Zeit zeichnet die betreffende Kamera nichts auf.

Ein weiterer zu berücksichtigender Punkt ist, dass ich für jede Datei den Start- und Stoppzeitstempel kennen muss, der sich beispielsweise file-1.mp4auf „2015-09-12 09:03:42“ bis „2015-09-12 11:24:21“ beziehen kann. Auf diese Weise weiß ich, wo ein Benutzer einen bestimmten Clip abrufen kann, wenn er ihn abrufen möchte. Und wenn ich ffmpeg für jeden Clip starte und es dann am Ende jedes Clips beende, kann ich diese Informationen erfassen und speichern. Wenn jedoch ein empfohlener Ansatz darin besteht, ffmpeg anzuweisen, unbegrenzt zu laufen und die Ausgabe in separaten Blöcken zu speichern (falls ffmpeg das kann), funktioniert dies möglicherweise nicht, da ich diese Informationen nicht erfassen kann.

Ich wäre für jede Einsicht dankbar.

Antwort1

Probieren Sie dieSegment-Multiplexer.

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_listErstellen Sie eine Listendatei.

  • -segment_timeSegmentdauer festlegen. Der Wert muss eine Dauerangabe sein. Der Standardwert ist 2. Beachten Sie, dass die Aufteilung möglicherweise nicht genau ist, es sei denn, Sie erzwingen die Referenz-Stream-Keyframes zum angegebenen Zeitpunkt. Siehe dieSegment-Multiplexer-DokumentationFür mehr Information.

  • -segment_atclocktimeWenn der Wert auf „1“ gesetzt ist, erfolgt die Teilung in regelmäßigen Zeitintervallen beginnend bei 00:00 Uhr. Der in angegebene Zeitwert -segment_timewird zum Einstellen der Länge des Teilungsintervalls verwendet. Wenn segment_time beispielsweise auf „900“ gesetzt ist, ist es möglich, Dateien um 12:00 Uhr, 12:15, 12:30 usw. zu erstellen.

  • -strftimeDadurch können Segmente nach dem Zeitpunkt der Dateierstellung benannt werden.

Beispiele für Ausgabedateinamen:

$ 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

Sehen Sie sich dieDokumentefür viele weitere Optionen und Informationen.

verwandte Informationen