Powershell 如何从使用ffmpeg的时间戳命名的帧创建视频

Powershell 如何从使用ffmpeg的时间戳命名的帧创建视频,powershell,video,ffmpeg,mp4,strftime,Powershell,Video,Ffmpeg,Mp4,Strftime,我有一个文件夹,里面装满了帧,帧的名称中有时间戳,格式如下 im_u%H_%M_%S_%MS.png 我尝试在windows中使用-pattern\u 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 我明白了 后来我发现这在

我有一个文件夹,里面装满了帧,帧的名称中有时间戳,格式如下

im_u%H_%M_%S_%MS.png

我尝试在windows中使用
-pattern\u 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
我明白了

后来我发现这在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
我得到

我已经没有想法了。我拒绝相信在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上添加了
    编码
    ,因为默认值是
    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
    放入文件夹的原因。

    非常感谢!!很抱歉我迟了回答。那天我很忙,决定用斐济imageJ创建视频。但是,现在我需要创建很多视频,我发现有必要创建一个脚本。基于你的回答,我编写了我的完整解决方案。嘿,我正在尝试做一些类似于你这里所做的事情,它正在以某种方式读取我的文件名“myjpegile.jpg”。我收到一个错误“无法打开文件”dmyjpegile.jpg出于某种原因,它是在一个不存在的“D”上追加的。我猜这是一个格式问题,但我使用的是ASCII编码,所以我不确定是什么导致了它。
    $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
    
    $prependVar = "file "
    $lines      = get-content $outFile
    $newlines   = $lines | ForEach-Object{ "$prependVar$_"}
    $newlines | Out-File $outFile -Encoding ASCII
    
     cd $inFolder
     C:/ffmpeg/bin.\ffmpeg.exe -f concat -r 10 -i $outFile -c:v libx264 -r 30  -pix_fmt yuv420p out.mp4