파일 기간을 수동으로 설정하는 FFMpeg

파일 기간을 수동으로 설정하는 FFMpeg

생성된 mkv 컨테이너(h265 비디오 포함)에 비디오 길이가 없습니다. 파이프 입력이 닫히기 전에 이를 설정하는 방법이 있습니까?

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)

현재 파일은 다음 명령을 사용하여 생성됩니다. (덕분에기얀이를 도와주셔서):

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"

mkv 작성 중에 파일 길이를 지정하거나 파일 세그먼트를 닫기 전에 ffmpeg가 파일 길이를 삽입하도록 하는 간단한 방법이 있습니까?

답변1

이제 솔루션에 어느 정도 가까워졌습니다.
ffmpeg -f hevc -i - -c copy -f segment -segment_time 30 -segment_format matroska -strftime 1 camera01-%Y%m%d-%H%M%S.mkv(reserve_index_space 옵션 제거)

지속 시간 데이터를 파일에 제공합니다. 그러나 이는 각 세그먼트가 시작될 때 재설정되지 않습니다. 대신 각 세그먼트의 지속 시간에는 이전 세그먼트의 지속 시간이 포함됩니다.

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

"각 파일에 대한 타이밍 데이터 재설정" 플래그와 동등한 것이 있는지 궁금합니다.... 또는 이에 상응하는 것이 있습니까?

네, 그렇습니다. 최종 명령은 다음과 같습니다.

    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"

( [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제거 방법을 생각해 본 적이 없는 가짜 경고가 여전히 표시되지만 적어도 유효한 기간을 찾는 서비스에서는 이제 경고가 표시됩니다.

관련 정보