我有几个不同系列的广播剧。有些已经是单轨,有些是多轨。我希望所有人都是单轨的。我不介意重新编码;实际上,我想将它们传输到我的移动设备上,并且更喜欢opus输出。
从单个有声读物的文件夹内部,这似乎可以解决问题,将mp3转换为作品:
ffmpeg -i "concat:$(ls *.mp3 | tr '\n' '|')" -acodec opus test.opus
现在,我确实有很多想要转换的多轨广播剧。我想定义一个可以与我一起使用的函数,也可以find
将结果通过它传递给ls
。
我无意中发现了这样的变体:
function audioconcat { folder=$1; iformat=$2; oformat=$3; echo $folder; echo $iformat; echo $oformat; ffmpeg -i \'concat:$(find "$folder" -name *.$iformat | tr '\n' '|' | tr ' ' '\ ' | head -c -1)\' -acodec $oformat \'$folder.$oformat\'; }
因此,其想法是在文件夹内查找具有给定输入格式的文件,将它们放入ffmpeg并置,将流编码为给定的输出格式,并使用文件夹名称将其保存为单个文件。
但是,我似乎总是在空格和/或嵌套函数调用方面遇到问题。
我该怎么做才能修复我的功能?或者,如上所述,有什么更好的方法可以进行转换?
您已经在代码中演示了多个反模式,可以对其进行改进。请参阅为什么不应该解析ls(1)的输出。您无需解析ls
command的输出,并避免将多条shell管道与tr
command和一起使用find
。
建议更好地使用本机外壳程序提供的glob选项,在您的情况下应为bash
外壳程序。
这段代码$(ls *.mp3 | tr '\n' '|')
可以很好地用bash
它提供的文件遍历选项来编写,如下所示:
shopt -s nullglob
mp3FileList=(*.mp3)
启用此扩展外壳程序选项可确保在填充到数组中时跳过空的glob结果,而不是对其进行处理。您应该cd
进入该文件夹,然后在下面执行。请注意|
数组后的最后一个,因为您最初也将其包含在列表中。如果不需要,将其删除。
fileString=$( IFS='|'; echo "${mp3FileList[*]}|" )
现在,上面的变量将包含一个|
单独格式的文件列表,|
最后一个带有,然后可以ffmpeg
作为以下形式传递给您的命令
ffmpeg -i "concat:${fileString}" -acodec opus test.opus
关于将脚本的多个选项传递给您的第二个要求。您可以扩展此脚本来执行
audioConcat() {
(( "$#" < 3 )) && { printf 'insufficient arguments supplied' >&2; exit 1 ; }
cd "$1" || { printf 'unable to navigate to target\n' >&2; exit 2 ; }
shopt -q nullglob; nullglob_set=$?
((nullglob_set)) && shopt -s nullglob
local fileList
local fileString
fileList=(*."${2}")
if (( ${#fileList[@]} )); then
fileString=$( IFS='|'; echo "${fileList[*]}" )
ffmpeg -i "concat:${fileString}" -acodec "$3" "$1.$3"
else
printf 'unable to find files of extension %s\n' "$2" >&2
exit 3
fi
((nullglob_set)) && shopt -u nullglob
}
请记住,在调用函数时,将您的参数传递为
audioConcat '/path/to/mp3files/' 'mp3' 'opus'
强烈建议您ffmpeg
在上面的函数中注释掉该行,并在调用实际命令之前查看是否根据需要创建了变量。还要确认您是否需要|
文件列表中的结尾。
功能中使用的构造的快速摘要
nullglob
在路径名扩展过程中设置的选项将避免扩展空的glob,即,在未.mp3
找到文件的情况下,扩展时数组将为空,而不是未扩展的glob$(IFS='|'; echo "${mp3FileList[*]})
这是一个精巧的技巧,可以产生以|
单独的格式打印输出。我们正在IFS
子外壳(输入字段分隔符)中修改,因此不会在全局范围内对其进行修改。数组扩展使用[*]
将字符串与IFS
设置的值连接在一起。一些杂项。需要考虑的注意事项:-exit
在函数中使用from实际上会退出您正在运行该函数的当前shell。从命令行使用时,建议不要使用它,而从带有适当解释器she-bang设置的脚本运行时,则不建议使用它,在这种情况下,它将退出为运行脚本而启动的子外壳。如果您打算更频繁地从命令行使用该命令,请用替换这些exit
调用return
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句