我有一个图像文件夹和一个音频文件夹,我正在尝试创建一个脚本,从图像目录中获取图像,将其与音频目录中的音频合并并输出 mp4,但没有取得太大成功:
#!/bin/sh
for f in *.aac
do
{
aac=`basename $f.aac`
jpg="${name}.jpg"
output="${name}.mp4"
ffmpeg -loop 1 -i $jpg -i $aac -c:v libx264 -preset veryslow -tune stillimage -crf 18 -pix_fmt yuv420p -c:a aac -shortest -b:a 192k -shortest $aac
}
done;
任何帮助,将不胜感激。
答案1
让我们看一下你的脚本。
#!/bin/sh
bash
您使用和标记了该问题ubuntu
,因此您可能想要更改它:
#!/bin/bash
[...] 从图像目录中获取图像,将其与音频目录中的音频合并并输出 mp4
我没有看到任何目录名,所以找不到你的文件。通常,我会将目录设置为变量,这样可以更轻松地更改脚本。所以:
aacdir=/home/me/aac
jpgdir=/home/me/jpg
mp4dir=/home/me/mp4
然后你说,你从图像目录中获取“mage”。不,你没有。你获取一个声音文件(而不是从声音目录中获取)。因此,那个 for 循环实际上需要是:
for file in "$jpgdir"/*.jpg ; do
然后你开始修改文件名。要查看你在做什么,我假设你从$f
=开始/home/me/hoppa.aac
aac=`basename $f.aac`
aac
就是现在hoppa.aac.aac
jpg="${name}.jpg"
jpg
是现在.jpg
;因为名称是空的。
output="${name}.mp4"
output
现在也是.mp4
出于同样的原因。这肯定不是你想要的。
对于未来的项目:如果命令不起作用,请回显所有内容,这样您就知道变量包含什么。在这种情况下,我会添加:
echo "aac=$aac ; jpg=$jpg ; output=$output"
看看发生了什么事。
你可能想要的是:
base=$(basename "$file")
stripped=${base%.jpg}
aac="$aacdir/$stripped.aac"
jpg="$jpgdir/$stripped.jpg"
mp4="$mp4dir/$stripped.mp4"
再一次,如果您不确定或者您认为我可能犯了错误(确实会发生这种情况),只需回显脚本中的值即可。
我认为你的 ffmpeg 是正确的(大部分),但我想指出两点:
- 使用变量时引用它们
- 的最后一个参数
ffmpeg
应该是输出文件,而不是输入文件之一(我似乎记得)
那将会是:
ffmpeg -loop 1 -i "$jpg" -i "$aac" -c:v libx264 -preset veryslow -tune stillimage -crf 18 -pix_fmt yuv420p -c:a aac -shortest -b:a 192k -shortest "$mp4"