代码之家  ›  专栏  ›  技术社区  ›  CaribeGirl

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

  •  4
  • CaribeGirl  · 技术社区  · 6 年前

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

    im\u%H\u%M\u%S\u%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
    

    我尝试使用 -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 Error: Pattern type 'glob' was selected but globbing is not support ed by this libavformat build

    我也尝试

    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中无法做到这一点。 我真的很感激任何帮助!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gyan    6 年前

    您可以通过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的警告,但您可以忽略它们)

        2
  •  1
  •   CaribeGirl    6 年前

    在Mulvya解决方案的基础上,我编写了一个powershell脚本,该脚本将以建议的格式创建带有文件名的txt。

    1. 创建包含目录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
      

    我添加了 Encoding 在Out-File cmdlet上,因为默认值为 UTF-8-BOM ffmpeg 不喜欢它。

    1. 将字符串“file”预先附加到txt文件的每一行。

      $prependVar = "file "
      $lines      = get-content $outFile
      $newlines   = $lines | ForEach-Object{ "$prependVar$_"}
      $newlines | Out-File $outFile -Encoding ASCII
      
    2. 调用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 到文件夹。