encoding - 使用 FFMPEG 和可变每个图像时间戳从 PNG 创建视频

标签 encoding ffmpeg screenshot frame-rate vsync

我正在尝试获取一堆截图 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

关于encoding - 使用 FFMPEG 和可变每个图像时间戳从 PNG 创建视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64838541/

相关文章:

javascript - 如何在 JavaScript 客户端截取网站/谷歌是如何做到的? (无需访问硬盘)

c# - FFMPEG 视频缩放和添加图像背景

video - 如何使用 ffmpeg 从网络摄像头访问压缩流

java - java中如何将Base64编码的字符串转换为UUID

python - python 在计算机中如何存储字符串?

android - FFmpeg 支持 libstagefright 硬件解码

javascript - 捕获 Internet Explorer 中当前事件选项卡的图像并将其传递给 Flex 应用程序

ios - 有没有办法在 MPMoviePlayerController 播放时截图

matlab - 如何在 MATLAB 中有效地编码位串?

php - 整个网站显示为怪异字符