我正在尝试提取视频并在两个 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
最好的解决方法是什么?我想我遗漏了与过滤器排序有关的内容?