批处理脚本将图像目录和音频目录中的 1 幅图像和 1 个音频转换为 mp4

批处理脚本将图像目录和音频目录中的 1 幅图像和 1 个音频转换为 mp4

我有一个图像文件夹和一个音频文件夹,我正在尝试创建一个脚本,从图像目录中获取图像,将其与音频目录中的音频合并并输出 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"

相关内容