使用 find 和 xargs 时从 ffmpeg 重命名输出文件名

Renaming the output file name from ffmpeg when using find and xargs

我正在尝试重命名来自我使用 find 和 xargs 生成的 ffmpeg 进程的输出文件。我有一个文件目录,我想将其转换为某种格式,所有这些文件最终都应命名为 .mov。所以我过滤掉 .mp4 和 .mov 文件,然后使用 xargs 将其传递给 ffmpeg。

假设当前工作目录中有 abc.mp4、abcd.mp4、abcde.mp3、bcd.mov 等文件,然后我正在做类似的事情来过滤掉 mp4 和 mov文件并将其传递给 ffmpeg 进行编码:

find . -type f -name "*.mp4" -o -name "*.mov" | xargs -n 1 -p 5 -I '{}' ffmpeg -i '{}' ....... $PWD/{}"_h264.mov"

这将执行我希望 ffmpeg 执行的操作,但它会将文件命名为

abc.mp4_h264.mov,abcd.mp4_h264.mov,bcd.mov_h264.mov

我理想中想要实现的是将输出文件命名为

abc_h264.mov,abcd_h264.mov,bcd_h264.mov

在我指定 ffmpeg 的输出文件的地方,我没有想到如何做到这一点。我知道我可以像这样使用 xargs 调用 basename 命令

find . -type f -name "*.mp4" -o -name "*.mov" | xargs -n 1 basename | rev | cut -d . -f 2 | rev

并提取不带扩展名的文件名,但如果我使用它,那么我如何将它作为输入文件传递给 ffmpeg,因为当它从 xargs 出来时它会丢失扩展名,而 ffmpeg 将抛出错误。

任何人都可以帮助我一次性实现这一点,我可以指定 'basename' 在做什么,但我在哪里指定 ffmpeg 的输出文件名?

非常感谢您提供的任何帮助。非常感谢社区。

请您尝试以下操作:

find . -type f -name "*.mp4" -o -name "*.mov" | xargs -I {} -n 1 -P 5 bash -c 'org="{}"; new="$PWD/${org%.*}_h264.mov"; ffmpeg -i "$org" {options} "$new"'

但是生成 bash 命令作为子进程效率不高 多次。如果您没有特定理由使用 findxargs,这样说会更简单:

for org in *.mp4 *.mov; do
    new="$PWD/${org%.*}_h264.mov"
    ffmpeg -i "$org" {options} "$new"
done