
In meinen generierten MKV-Containern (die H265-Videos enthalten) fehlt die Videolänge. Gibt es eine Möglichkeit, dies festzulegen, bevor der Pipe-Eingang geschlossen wird?
Input #0, matroska,webm, from 'camera01-20190815-203646.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
Derzeit werden Dateien mit den folgenden Befehlen erstellt. (Dank anGyanfür die Hilfe dabei):
ffmpeg \
-hide_banner \
-loglevel error \
-nostdin \
-nostats \
-xerror \
-stimeout 5000000 \
-thread_queue_size 2048 \
-reorder_queue_size 16000 \
-rtsp_transport tcp \
-i rtsp://xxx \
-c:v copy -an -sn -dn \
-bsf:v hevc_metadata=tick_rate=1 \
-f hevc - \
| \
ffmpeg \
-hide_banner \
-loglevel info \
-nostats \
-nostdin \
-xerror \
-f hevc \
-i - \
-c copy \
-f segment \
-segment_time 3600 \
-segment_format matroska \
-segment_format_options live=1:reserve_index_space=100k \
-strftime 1 \
"/srv/video/netcams/archive/recordall/camera01-%%Y%%m%%d-%%H%%M%%S.mkv"
Gibt es eine einfache Möglichkeit, die Dateilänge entweder während des MKV-Schreibens anzugeben oder sie von ffmpeg einfügen zu lassen, bevor das Dateisegment geschlossen wird?
Antwort1
Damit komme ich einer Lösung nun ein Stück näher:
ffmpeg -f hevc -i - -c copy -f segment -segment_time 30 -segment_format matroska -strftime 1 camera01-%Y%m%d-%H%M%S.mkv
(Option „reserve_index_space“ entfernt).
gibt Dauerdaten an die Datei weiter. Dies wird jedoch nicht am Anfang jedes Segments zurückgesetzt - stattdessen umfasst die Dauer jedes Segments die Dauer der vorherigen Segmente.
find . -exec ffmpeg -hide_banner -i {} -f ffmetadata \; > /tmp/out.txt
Input #0, matroska,webm, from './camera01-20190819-212041.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: 00:00:32.00, start: 0.000000, bitrate: 694 kb/s
Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
Metadata:
DURATION : 00:00:32.000000000
Input #0, matroska,webm, from './camera01-20190819-212102.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: 00:01:00.00, start: 32.000000, bitrate: 401 kb/s
Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
Metadata:
DURATION : 00:01:00.000000000
Input #0, matroska,webm, from './camera01-20190819-212130.mkv':
Metadata:
ENCODER : Lavf58.20.100
Duration: 00:01:32.00, start: 60.000000, bitrate: 287 kb/s
Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
Metadata:
DURATION : 00:01:32.000000000
Ich frage mich, ob es ein Äquivalent zum Flag „Zeitdaten für jede Datei zurücksetzen“ gibt … oder etwas Entsprechendes?
Ja, das gibt es. Der endgültige Befehl sieht folgendermaßen aus:
ffmpeg \
-hide_banner \
-loglevel info \
-nostats \
-nostdin \
-xerror \
-f hevc \
-i - \
-c copy \
-f segment \
-reset_timestamps 1 \
-segment_time 30 \
-segment_format matroska \
-strftime 1 \
"/srv/video/netcams/archive/recordall/camera01-%%Y%%m%%d-%%H%%M%%S.mkv"
(Ich sehe immer noch falsche [segment @ 0x5652b57e1500] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
Warnungen und ich habe nie herausgefunden, wie ich sie entfernen kann, aber zumindest Dienste, die nach einer gültigen Dauer suchen, sehen sie jetzt.