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

Bash循环遍历目录中的文件,输出不存在的文件

  •  0
  • TheCodeNovice  · 技术社区  · 4 年前

    我正在从一系列图像制作mp4文件。这些图像应该运行大约1小时,但我无法获得完整的视频,因为FFMPEG查找的是一个不应该包含的文件。

    [image2 @ 0x55fe14bef700] Could not open file : /mnt/run/image-005437.jpeg
    

    令人困惑的是,我传递给ffmpeg的列表 应该 不包括那个文件。如果我的脚本不喜欢结果,它会将文件发送到目标文件夹中名为failed的子目录

    带有该编号的文件的位置

    $ pwd
    run/failed
    ]$ ls
    failed-005437.jpeg 
    

    我用来启动ffmpeg的命令如下

    image_folder=$1
    singularity exec --bind $work_dir:/mnt $work_dir/longleaf2.sif ffmpeg -f concat -safe 0 -y -i <(for f in /mnt/processed_images/$image_folder/image-%06d.jpeg; do echo "file '$f'";done) -vf "crop=trunc(iw/3)*2:trunc(ih/2)*2" -movflags +faststart /mnt/run/summary_files/${image_folder}.mp4
    

    我检查了处理过的图像,但它不在那里,那么ffmpeg为什么要找它呢?

    失败运行的一部分

    https://pastebin.com/pF5ZefLf

    我会检查文件是否不在for循环的文件夹引用中,这样就不会导致错误

    $ ls image-005437.*
    ls: cannot access image-005437.*: No such file or directory
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   llogan    4 年前

    问题

    当你跑步时:

    for f in /mnt/processed_images/$image_folder/image-%06d.jpeg; do echo "file '$f'";done
    

    它将输出:

    file '/mnt/processed_images/foo/image-%06d.jpeg'
    

    因此,ffmpeg将使用序列模式类型 image demuxer .这需要一个连续的序列。

    解决方案1:全球

    使用地球仪:

    for f in /mnt/processed_images/$image_folder/*.jpeg; do echo "file '$f'";done
    

    现在它将输出每个文件。在这个例子中 image-000003.jpeg 不存在,因此不会列出:

    file '/mnt/processed_images/foo/image-000001.jpeg'
    file '/mnt/processed_images/foo/image-000002.jpeg'
    file '/mnt/processed_images/foo/image-000004.jpeg'
    

    解决方案2:简化并跳过concat

    更好的方法是使用glob模式类型简化命令 图像解复用器 在ffmpeg内部,然后可以避免concat demuxer:

    image_folder=$1
    singularity exec --bind "$work_dir":/mnt "$work_dir"/longleaf2.sif ffmpeg -pattern_type glob -framerate 25 -i "/mnt/processed_images/$image_folder/*.jpeg" -vf "crop=trunc(iw/3)*2:trunc(ih/2)*2,format=yuv420p" -movflags +faststart /mnt/run/summary_files/${image_folder}.mp4
    
    • 映像解复用器全局模式不适用于Windows用户。
    • 补充道 -framerate 的输入选项 图像解复用器 .
    • 补充道 format filter 为了兼容性,进行YUV 4:2:0色度二次采样。
    • 变量已被引用。看见 shellcheck.net .
    • FFmpeg 4.1发布分支已过时。 Download compile 在做任何其他事情之前先做一个现代版本。