Unix ffmpeg Shell 脚本合并.aif 和.mp4

Unix ffmpeg Shell 脚本合并.aif 和.mp4

我需要一个脚本,将同一文件夹中同名的多个文件(.aif 和 .mp4)合并到一个名为 [original_name]_new.mp4 的新文件夹

代码:

#!/usr/bin/env bash -e

function combine(){
    ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
}

for video in ‘“*.mp4’; do
    name="{video%.*}
    audio=${name}.aif
    output=${name}_new.mp4
    combine $audio $video $output
done

我得到的输出:

Last login: Sun Oct 18 20:31:10 on ttys000
Tjalles-Mac-Pro:~ tjallo$ /Users/tjallo/Desktop/Christof/try1\ copy.command ; exit;
/Users/tjallo/Desktop/Christof/try1 copy.command: line 8: unexpected EOF while looking for matching `"'
logout

[流程完成]

(于2015年10月18日完成重新编辑)

编辑@derobert: 现在我将其作为我的代码:

set -x
#!/usr/bin/env bash
set -e 
function combine(){
    ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
}

for video in *.mp4; do
    name=“${video%.*}”
    audio=“${name}.aif”
    output=“${name}_new.mp4”
    combine "$audio" "$video" "$output"
done

这是输出:

Last login: Sun Oct 18 21:13:27 on ttys001
Tjalles-Mac-Pro:~ tjallo$ /Users/tjallo/Desktop/Christof/try1\ copy.command ; exit;
++ set -e
++ for video in '*.mp4'
++ name='“*”'
++ audio='““*”.aif”'
++ output='““*”_new.mp4”'
++ combine '““*”.aif”' '*.mp4' '““*”_new.mp4”'
++ ffmpeg -i '““*”.aif”' -i '*.mp4' -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest '““*”_new.mp4”'
ffmpeg version 2.8 Copyright (c) 2000-2015 the FFmpeg developers
  built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
““*”.aif”: No such file or directory
logout

[Process completed]

答案1

您在脚本中遇到了一些问题:

正如评论中指出的:

#!/usr/bin/env bash -e

可能实际上并没有将-e选项传递给 bash。相反,如果您想要的话,请将其放在set -e该线下方。

下一个:

for video in ‘“*.mp4’; do

首先,这些是弯引号 '、' 和“,而不是直引号 ' 和 "。根据您使用的字体,这可能很难分辨。Shell总是使用直引号。其次,*.mp4根本不应该被引用。引用会阻止扩展,并且您希望*.mp4扩展到.mp4目录中的所有文件。

下一行也有一个错误,这就是 shell 抱怨的错误:

name="{video%.*}

你在那里错过了一个密切的报价。

一旦您知道如何阅读其错误消息,shell 就会告诉您这一点。首先,您需要对行进行编号 - 我建议在编辑器中寻找一个显示行号的选项,或者可以按编号跳转到行。为了方便起见,我将它们放在下面:

1    #!/usr/bin/env bash -e
2
3    function combine(){
4        ffmpeg -i "$1" -i "$2" -map 0:0 -map 1:0 -acodec libfdk_aac -b:a 192k -vcodec copy -shortest "$3"
5    }
6    
7    for video in ‘“*.mp4’; do
8        name="{video%.*}
9        audio=${name}.aif
10       output=${name}_new.mp4
11       combine $audio $video $output
12   done

理解该消息的关键是知道“EOF”意味着“文件结束”。所以基本上,shell"在第 8 行找到了 a。它一直在寻找匹配项"(以结束引用),但它没有找到匹配项,而是找到了文件末尾。

还有一个问题:

combine $audio $video $output

在这里,您要传递这些文件名没有任何额外的扩展或分词(否则包含空格的文件名将失败)。所以你需要引用那些:combine "$audio" "$video" "$output"

最后,要调试最后一个问题:set -x在顶部添加一个。这将导致正在执行的命令首先被回显,这样您就可以看到发生了什么。

附:如果你看看你的原问题代码,它没有很多这样的问题。因此所有的混乱。

到处都是弯引号

显示卷曲引号的图片

您需要让编辑器停止为您插入大引号。

相关内容