Unix ffmpegシェルスクリプトは.aifと.mp4をマージします。

Unix ffmpegシェルスクリプトは.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

まず、「直線引用符」と「ではなく、丸い引用符」、「、」です。使用するフォントによっては区別が難しい場合があります。シェルいつも直線引用符を使用してください。第二に、*.mp4絶対引用しないでください。引用符は拡張を防ぎ、ディレクトリ内のすべてのファイル*.mp4に拡張しようとします。.mp4

次の行にもエラーがあります。これはシェルが文句を言うものです:

name="{video%.*}

そこに近い引用を逃した。

エラーメッセージを読み取る方法がわかったら、シェルはそれを知らせます。まず行番号を付ける必要があります。行番号を表示したり、番号別に行に移動したりするためのオプションをエディタで見つけることをお勧めします。便宜上、下に入れておきました。

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」が「ファイルの終わり」を意味することを知っていることです。したがって、デフォルトでは、シェルは"8行目でaを見つけました。 (引用符を終了するために)一致を探し続けますが、一致を見つけるのではなく"ファイルの終わりを探します。

まだ質問があります:

combine $audio $video $output

ここでは、これらのファイル名を渡したいと思います。いいえ追加の拡張または単語の分離(そうしないと、スペースを含むファイル名は失敗します)。したがって、以下を引用する必要がありますcombine "$audio" "$video" "$output"

最後に、デバッグする必要がある最後の問題が1つあります。set -x一番上のものを追加することです。これにより、実行中のコマンドが最初にエコーされ、何が起こっているかを確認できます。

添付:あなたの姿を見ると元の質問コード、そのような問題はあまりありません。したがって、すべての混乱。

どこでもカール引用符

丸い引用符を示す画像

編集者に二重引用符の挿入を中止するように指示する必要があります。

関連情報