ffmpeg:使用过滤器提取两个 PTS 值之间的视频

ffmpeg:使用过滤器提取两个 PTS 值之间的视频

我正在尝试提取视频并在两个 PTS 值之间生成延时摄影(“对上午 8 点到下午 6 点之间的所有视频进行延时摄影”)。

原始视频来自网络摄像机并包含-initial_offset与 unix 挂钟等效的功能:

ffprobe  -i camera01-20200312-092453.mkv -show_frames -select_streams v:0 -print_format flat | grep pkt_pts=

Input #0, matroska,webm, from '/srv/video/netcams/archive/recordall/camera01-20200312-092453.mkv':
  Metadata:
    ENCODER         : Lavf58.29.100
  Duration: 440024:24:42.97, start: 1584001479.967000, bitrate: 0 kb/s
    Stream #0:0: Video: hevc (Main), yuv420p(tv), 2048x1536, 1 fps, 1 tbr, 1k tbn, 1 tbc (default)
    Metadata:
DURATION        : 440024:24:42.967000
frames.frame.0.pkt_pts=1584001479967
frames.frame.1.pkt_pts=1584001480967
frames.frame.2.pkt_pts=1584001481967
frames.frame.3.pkt_pts=1584001482967
frames.frame.4.pkt_pts=1584001483967
frames.frame.5.pkt_pts=1584001484967
...

我已经尝试过-ss-t但是这些似乎假设文件从 0 开始。

一些背景知识:我使用来-initial_offset确保每个帧的 PTS 都设置为 unix 时间戳:

... -f segment                      \
        -segment_time 86400         \
        -initial_offset "$(date +%%s.%%N)" \
        -segment_format matroska    \
        -strftime 1                 \
        "camera01-%%Y%%m%%d-%%H%%M%%S.mkv" \

我目前的方法是查找过去一天的视频,将它们连接起来,然后提取两个已知时间之间的视频:

find /srv/video/netcams/archive/recordall -newermt $(date +%Y-%m-%d -d '1 days ago') -type f -print | \ 
  sed -e "s/^/file '/"  -e "s/$/'/" | \
  ffmpeg -f concat -safe 0  -protocol_whitelist file,pipe,crypto -i - -c:v libx264 -r 30 -filter:v "trim=start_pts=1584001492967:end_pts=1584001514967000,setpts=PTS/500," -preset ultrafast

最好的解决方法是什么?我想我遗漏了与过滤器排序有关的内容?

相关内容