1

我有一个以目录为输入的 shell 脚本,读取其中的所有mp4文件并将它们转换为mp3with ffmpeg

#!/bin/bash

dir=$1

while read -rd "" file
do
  base=$(basename "$file")
  filename=${base%(*}".mp3"
  ffmpeg -i "$file" -vn -ar 44100 -ac 2 -ab 192000 -f mp3 "$filename" &
done < <(find $dir -maxdepth 1 -iname "*.mp4" -print0)

wait

exit 0

目前所有这些调用ffmpeg都是分叉的,因为当我&在最后省略第一个文件时,只有第一个文件被转换,其他文件被忽略。

但这是有问题的,因为某些文件错误消息会失败,如下所示:

路径/到/文件/文件名 - 带空格(信息)(临时信息).mp4:没有这样的文件或目录

所有文件名通常都包含空格,这可能是某些文件失败的原因。

因此,我有以下问题:

  1. 当我不分叉ffmpeg调用时,为什么只执行第一个文件?我希望循环一直等到过程完成,然后继续下一次迭代。
  2. 为什么脚本找不到某些文件(可能是 的问题ffmpeg)?
  3. 如何解决所有这些问题并使脚本正常工作?
4

1 回答 1

3

你不承认stdin

ffmpeg -i "$file" -blah -blah -nostdin "$filename" &

shell脚本ffmpeg在2个作业后停止

要回答评论:

无论如何,您不应该分叉,FFmpeg 已经在多个线程中运行以最大化 CPU,您甚至可能会因分叉而遭受 颠簸

于 2013-05-22T00:34:21.957 回答