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".

마지막으로 디버깅해야 할 마지막 문제가 하나 있습니다. set -x맨 위에 하나를 추가하는 것입니다. 이렇게 하면 실행 중인 명령이 먼저 에코되어 무슨 일이 일어나고 있는지 확인할 수 있습니다.

첨부된:당신의 모습을 보면원래 질문 코드, 그런 문제는 많지 않습니다. 그러므로 모든 혼란.

어디서나 곱슬 따옴표

둥근 따옴표를 보여주는 이미지

편집자에게 큰 따옴표 삽입을 중단하라고 알려야 합니다.

관련 정보