如何从使用 ffmpeg 时间戳命名的帧创建视频
How to create a video from frames named using timestamp with ffmpeg
我有一个文件夹,里面装满了名称中包含时间戳的帧,格式如下
im_%H_%M_%S_%MS.png
im_08_05_09_007324.png
im_08_05_09_532857.png
im_08_05_10_059340.png
im_08_05_10_575862.png
im_08_05_11_118361.png
im_08_05_11_596814.png
im_08_05_12_148340.png
im_08_05_12_665838.png
我尝试在 windows 中使用 -pattern_type glob
但它不起作用。
ffmpeg.exe -framerate 10 -pattern_type glob -i im_*.png -c:v libx264 -r 30 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p $videoName
我明白了
Pattern type 'glob' was selected but globbing is not supported by this libavformat build im_*.png: Function not implemented
后来我发现这对 windows 不起作用 :( 这就是我正在使用的。
我也试试
ffmpeg.exe -framerate 10 -pattern_type glob -i im_%02d_%02d_%02d_%06d.png -c:v libx264 -r 30 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p $videoName
我得到了
im_%02d_%02d_%02d_%06d.png: No such file or directory
我 运行 没主意了。我拒绝相信在 ffmpeg 和 powershell 中没有办法做到这一点。
非常感谢任何帮助!
您可以使用变通方法,通过 concat demuxer
按顺序创建一个包含文件名列表的文本文件
file im_08_05_09_007324.png
file im_08_05_09_532857.png
file im_08_05_10_059340.png
file im_08_05_10_575862.png
file im_08_05_11_118361.png
然后是运行
ffmpeg -f concat -r 10 -i list.txt -c:v libx264 ...
(这将产生有关无效 DTS 的警告,但您可以忽略它们)
在 Mulvya 解决方案的基础上,我编写了一个 powershell 脚本,它将以建议的格式创建带有文件名的 txt。
创建一个包含目录png内容的txt文件
$inFolder = "C:\my_folder_with_Png_frames\"
$inSearch = $inFolder+"*.png"
$outFile = $inFolder + "framenames.txt"
Get-childitem -path $inSearch -recurse -name | Out-File $outFile -Encoding ASCII
我在 Out-File cmdlet 上添加了 Encoding
,因为默认值是 UTF-8-BOM
而 ffmpeg
不喜欢它。
将字符串 "file " 预先附加到 txt 文件的每一行。
$prependVar = "file "
$lines = get-content $outFile
$newlines = $lines | ForEach-Object{ "$prependVar$_"}
$newlines | Out-File $outFile -Encoding ASCII
调用 FFMPEG
cd $inFolder
C:/ffmpeg/bin.\ffmpeg.exe -f concat -r 10 -i $outFile -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
第 1 步和第 2 步不会生成具有完整路径名的 txt 文件。只有名字。这就是为什么我们需要cd
到文件夹。
我有一个文件夹,里面装满了名称中包含时间戳的帧,格式如下
im_%H_%M_%S_%MS.png
im_08_05_09_007324.png
im_08_05_09_532857.png
im_08_05_10_059340.png
im_08_05_10_575862.png
im_08_05_11_118361.png
im_08_05_11_596814.png
im_08_05_12_148340.png
im_08_05_12_665838.png
我尝试在 windows 中使用 -pattern_type glob
但它不起作用。
ffmpeg.exe -framerate 10 -pattern_type glob -i im_*.png -c:v libx264 -r 30 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p $videoName
我明白了
Pattern type 'glob' was selected but globbing is not supported by this libavformat build im_*.png: Function not implemented
后来我发现这对 windows 不起作用 :( 这就是我正在使用的。
我也试试
ffmpeg.exe -framerate 10 -pattern_type glob -i im_%02d_%02d_%02d_%06d.png -c:v libx264 -r 30 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -pix_fmt yuv420p $videoName
我得到了
im_%02d_%02d_%02d_%06d.png: No such file or directory
我 运行 没主意了。我拒绝相信在 ffmpeg 和 powershell 中没有办法做到这一点。 非常感谢任何帮助!
您可以使用变通方法,通过 concat demuxer
按顺序创建一个包含文件名列表的文本文件
file im_08_05_09_007324.png
file im_08_05_09_532857.png
file im_08_05_10_059340.png
file im_08_05_10_575862.png
file im_08_05_11_118361.png
然后是运行
ffmpeg -f concat -r 10 -i list.txt -c:v libx264 ...
(这将产生有关无效 DTS 的警告,但您可以忽略它们)
在 Mulvya 解决方案的基础上,我编写了一个 powershell 脚本,它将以建议的格式创建带有文件名的 txt。
创建一个包含目录png内容的txt文件
$inFolder = "C:\my_folder_with_Png_frames\" $inSearch = $inFolder+"*.png" $outFile = $inFolder + "framenames.txt" Get-childitem -path $inSearch -recurse -name | Out-File $outFile -Encoding ASCII
我在 Out-File cmdlet 上添加了 Encoding
,因为默认值是 UTF-8-BOM
而 ffmpeg
不喜欢它。
将字符串 "file " 预先附加到 txt 文件的每一行。
$prependVar = "file " $lines = get-content $outFile $newlines = $lines | ForEach-Object{ "$prependVar$_"} $newlines | Out-File $outFile -Encoding ASCII
调用 FFMPEG
cd $inFolder C:/ffmpeg/bin.\ffmpeg.exe -f concat -r 10 -i $outFile -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
第 1 步和第 2 步不会生成具有完整路径名的 txt 文件。只有名字。这就是为什么我们需要cd
到文件夹。