FFMpeg zum manuellen Festlegen einer Dateidauer

FFMpeg zum manuellen Festlegen einer Dateidauer

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 properlyWarnungen und ich habe nie herausgefunden, wie ich sie entfernen kann, aber zumindest Dienste, die nach einer gültigen Dauer suchen, sehen sie jetzt.

verwandte Informationen