使用 FFMPEG 和每个图像时间戳变量从 PNG 创建视频
Create video from PNGs with FFMPEG and variable per image timestamps
我正在尝试拍摄一堆 PNG 截图和每个截图的时间戳,然后用 ffmpeg
创建一个视频来重现截图的时间。
根据ffmpeg
帮助,-vsync 0
好像是我需要的,
-vsync parameter
0, passthrough Each frame is passed with its timestamp from the
demuxer to the muxer.
有谁知道如何将此时间戳信息传递给 ffmpeg
?目前每个截图都有以毫秒为单位的录制时间作为文件名。
下面的例子不接受任何我能知道的时间信息,所以我正在寻找正确的格式来传递给命令。
ffmpeg -vsync 0 -pattern_type glob -i '*.png' -c:v libx264 output.mp4
脚本:从文件名中获取时间,减去之前的文件时间 = 临时视频的持续时间,然后连接视频
#!/bin/bash
LST=($(ls -1tr Screenshot*.png))
TOT=${#LST[*]}
f="${LST[0]}"
#Screenshot_20201115_135335.png
FNM="${f%.*}"
SEC="${FNM:24:2}"
MIN="${FNM:22:2}"
HOU="${FNM:20:2}"
echo $f $HOU $MIN $SEC
BEG=$(echo "$HOU * 3600 + $MIN * 60 + $SEC" | bc -l)
echo $f $BEG
INP=("-i" "$f")
OUT="${f%.*}.mkv"
TXT=list.txt
echo "#png to mkv" > $TXT
for (( i=1; i<=$(( $TOT -1 )); i++ )); do
f="${LST[$i]}"
FNM="${f%.*}"
SEC="${FNM:24:2}"
MIN="${FNM:22:2}"
HOU="${FNM:20:2}"
TIM=$(echo "$HOU * 3600 + $MIN * 60 + $SEC" | bc -l)
DUR=$(echo "$TIM - $BEG" | bc -l)
echo $f $TIM $DUR
ffmpeg -y -hide_banner -loop 1 "${INP[@]}" -t $DUR "/tmp/${OUT}"
echo "file '/tmp/${OUT}'" >> $TXT
BEG=$TIM
INP=("-i" "$f")
OUT="${f%.*}.mkv"
done
ffmpeg -y -hide_banner -loop 1 "${INP[@]}" -t 5 "/tmp/${OUT}"
echo "file '/tmp/${OUT}'" >> $TXT
cat "$TXT"
ffmpeg -hide_banner -f concat -safe 0 -i "$TXT" -c:v h264_nvenc -cq 20 -y /tmp/output.mkv
ffplay /tmp/output.mkv
我正在尝试拍摄一堆 PNG 截图和每个截图的时间戳,然后用 ffmpeg
创建一个视频来重现截图的时间。
根据ffmpeg
帮助,-vsync 0
好像是我需要的,
-vsync parameter
0, passthrough Each frame is passed with its timestamp from the demuxer to the muxer.
有谁知道如何将此时间戳信息传递给 ffmpeg
?目前每个截图都有以毫秒为单位的录制时间作为文件名。
下面的例子不接受任何我能知道的时间信息,所以我正在寻找正确的格式来传递给命令。
ffmpeg -vsync 0 -pattern_type glob -i '*.png' -c:v libx264 output.mp4
脚本:从文件名中获取时间,减去之前的文件时间 = 临时视频的持续时间,然后连接视频
#!/bin/bash
LST=($(ls -1tr Screenshot*.png))
TOT=${#LST[*]}
f="${LST[0]}"
#Screenshot_20201115_135335.png
FNM="${f%.*}"
SEC="${FNM:24:2}"
MIN="${FNM:22:2}"
HOU="${FNM:20:2}"
echo $f $HOU $MIN $SEC
BEG=$(echo "$HOU * 3600 + $MIN * 60 + $SEC" | bc -l)
echo $f $BEG
INP=("-i" "$f")
OUT="${f%.*}.mkv"
TXT=list.txt
echo "#png to mkv" > $TXT
for (( i=1; i<=$(( $TOT -1 )); i++ )); do
f="${LST[$i]}"
FNM="${f%.*}"
SEC="${FNM:24:2}"
MIN="${FNM:22:2}"
HOU="${FNM:20:2}"
TIM=$(echo "$HOU * 3600 + $MIN * 60 + $SEC" | bc -l)
DUR=$(echo "$TIM - $BEG" | bc -l)
echo $f $TIM $DUR
ffmpeg -y -hide_banner -loop 1 "${INP[@]}" -t $DUR "/tmp/${OUT}"
echo "file '/tmp/${OUT}'" >> $TXT
BEG=$TIM
INP=("-i" "$f")
OUT="${f%.*}.mkv"
done
ffmpeg -y -hide_banner -loop 1 "${INP[@]}" -t 5 "/tmp/${OUT}"
echo "file '/tmp/${OUT}'" >> $TXT
cat "$TXT"
ffmpeg -hide_banner -f concat -safe 0 -i "$TXT" -c:v h264_nvenc -cq 20 -y /tmp/output.mkv
ffplay /tmp/output.mkv