编辑:
解决方案是将下面的原始ffmpeg调用更改为以下内容:
ffmpeg -nostdin -loglevel 16 -i "$dir/$var" -map_channel 0.0.0 "$left" -map_channel 0.0.1 "$right"
-nostdin
至关重要的地方。
有关参考,请参阅apply ffmpeg to many files(macmichael01评论)
我正在尝试将给定目录中的所有.wav文件及其子目录转换为两个单文件,每个文件都带有以下bash脚本。关键部分几乎在底部 - ffmpeg电话:
#!/bin/bash
# "[One] Stereo [file] to two mono [files] - stereo22mono"
# Syntax ffmpeg siehe: https://trac.ffmpeg.org/wiki/AudioChannelManipulation
ls -R $1 > .s22mtmp.txt
while read -r line || [[ -n "$line" ]]; do
var=$line
tst=$var
tst="${tst%:}"
if [ -d "${tst%./}" ] # is directory name
then
dir=$tst
elif [ -f "$dir/$var" ] # is file name
then
left=$dir/left_$var
right=$dir/right_$var
#loglevel 16 = only errors
# -i ...-> input file
# ffmpeg ... [SOURCE] ... [TARGET1] ... [TARGET2]
ffmpeg -loglevel 16 -i "$dir/$var" -map_channel 0.0.0 "$left" -map_channel 0.0.1 "$right"
fi
done < .s22mtmp.txt
rm .s22mtmp.txt
它几乎可以工作 - 除了事实之外,它只对每个第二个文件起作用,尽管for循环正确地遍历所有文件(用echo监视它)并调用ffmpeg。 我认为可能是ffmpeg在被要求处理下一个文件时没有完成它的分配工作,因此只是拒绝,这似乎是真的。 因为我做了一次尝试,不同意ffmpeg的每次调用都是这样的:
ffmpeg -loglevel 16 -i "$dir/$var" -map_channel 0.0.0 "$left" -map_channel 0.0.1 "$right" & disown
这几乎起作用,问题只是数百个进程和多次线程开始运行并且无法在合理的时间内完成,所以我坚持说。 :d 但至少它不再通过这种呼叫跳过每一个文件。
任何人都可以给我一个提示,如何完成这项工作?非常感谢..这实际上是我第一次尝试使用bash脚本。 提前谢谢!