bash - ffmpeg使用子文件夹批量重新编码

标签 bash batch-file ffmpeg re-encoding

我正在尝试将数百个视频重新编码为 X265,但有许多目录的文件名中包含空格,某些文件也是如此。我查看了一堆脚本,正在努力寻找一个适用于空间和不同目录级别的脚本。

只要没有子目录,这个就可以工作:

#!/bin/bash
for i in *.avi;
do 
    ffmpeg -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

我一直在尝试使用这个 bash 脚本,但它因我猜测的空格而失败。

#!/bin/bash
inputdir=$PWD
outputdir=$PWD
while IFS= read -r file ; do
  video=`basename "$file"`
  dir=`dirname "$file"`
 ffmpeg -fflags +genpts -i "$file" -c:v libx265 -c:a copy "$dir"/X265_"$video"
done < <(find "$inputdir" -name "*.avi" | head -100)

在这个线程上,它看起来对于 Windows 用户来说是一个很好的解决方案,但对于 Linux 用户来说却不是。 FFMPEG - Batch convert subfolders

FOR/r %%i in (*.mp4) DO ffmpeg32 -i "%%~fi"-map 0:0 -map 0:1 -map 0:1 -c:v copy -c :a:0 aac -b:a 128k -ac 2 -strict -2 -cutoff 15000 -c:a:1 复制“%%~dpni(2)%%~xi”

如果您能为我指出适合 bash 的正确解决方案,我将不胜感激。

最佳答案

这是 find 的典型场景和 xargs

find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh

其中 -print0-0 确保正确处理带有空格的名称。

在convert.sh中,您有for循环,几乎与第一个脚本中的相同

#!/bin/bash

for i; do
    d=$(dirname "$i")
    b=$(basename "$i")
    ffmpeg -i "$i" -c:v libx265 -c:a copy "$d/X265_$b"
done

for i 不带任何内容与“对于给定的所有参数”含义相同,即 xargs 传递的文件。

要在文件名前面添加字符串,您必须将名称拆分为目录和基本部分,然后再次将其组合在一起。

关于bash - ffmpeg使用子文件夹批量重新编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39861885/

相关文章:

linux - 如何在通过中间服务器连接的本地服务器和远程服务器之间传输数据?

batch-file - 如何创建字符串变量并使用批处理

python - 使用 Python 打开 .bat 文件 - 不起作用

video - ffmpeg:录制/捕获流并同时进行场景检测

git - 仅压缩最新提交的更改

linux - 几秒钟后终止作业并处理循环中的下一步

linux - 多个awk在同一行打印

使用 CALL 命令的 FOR 循环中的 Windows 批处理脚本行为意外

ffmpeg - 如何在 ffmpeg -filter_complex 中使用本地时间绘制文本冒号?

c++ - 如何使用 ffmpeg 解码 AAC 网络音频流