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

标签 bash ffmpeg directory io

我正在从一系列图像制作 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 正在寻找它?
失败运行的 pastebin
https://pastebin.com/pF5ZefLf
我检查该文件是否不在 for 循环引用的文件夹中,以便它永远不会导致错误
$ ls image-005437.*
ls: cannot access image-005437.*: No such file or directory

最佳答案

问题
当你运行时:

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
更好的是通过使用 image demuxer 的 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
  • 图像分离器 glob 模式不适用于 Windows 用户。
  • 添加了-framerate image demuxer 的输入选项.
  • 添加了format filter制作 YUV 4:2:0 色度子采样以实现兼容性。
  • 变量已被引用。见 shellcheck.net .
  • FFmpeg 4.1 发布分支是旧的。 Downloadcompile在做任何其他事情之前的现代版本。
  • 关于Bash遍历目录中的文件输出不存在的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69635057/

    相关文章:

    windows - 安装 cygwin 后 Git Bash 损坏

    C++ recursive_directory_iterator 遗漏一些文件

    ffmpeg - 使用 ffmpeg 覆盖多个视频

    C# 批处理文件未正确运行

    R 包 : use a custom file/directories structure in pkg/R and pkg/src folders

    Applescript:在 Finder 中打开文件夹

    linux - 如何在不同的源目录中复制同名文件并在目标目录中重命名?

    html - 使用BeautifulSoup清除html文档和多个段落

    bash - 一行文件的 "$(cat file)"、 "$(<file)"和 "read ... < file"有什么区别?

    flutter - 生成的 ffmpeg 视频似乎不是真正的视频文件