Unix ffmpeg Shell Script mescla .aif e .mp4

2

Eu preciso de um script que mescle vários arquivos (.aif e .mp4) na mesma pasta com o mesmo nome para uma nova pasta chamada [original_name] _new.mp4

Código:

#!/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

E a saída que recebo:

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

[Processo concluído]

(Reedição completa em 18-10-2015)

Editar para @derobert: Agora eu tenho isso como meu código:

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

E isso como a saída:

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]
    
por tjallo 15.10.2015 / 19:00

1 resposta

1

Você tem alguns problemas no script:

Como foi apontado nos comentários:

#!/usr/bin/env bash -e

provavelmente não passa a opção -e para bash. Em vez disso, se você quiser, coloque set -e abaixo dessa linha.

Próximo:

for video in ‘“*.mp4’; do

Primeiro, são aspas curvas ',' e 'em vez de aspas direitas' e '. Dependendo da fonte que você estiver usando, isso pode ser muito difícil de dizer. O Shell sempre usa Em segundo lugar, *.mp4 não deve ser cotado. A cotação impede a expansão e você deseja que *.mp4 seja expandido para todos os arquivos .mp4 no diretório.

A próxima linha também tem um erro, e esta é a que o shell está reclamando:

name="{video%.*}

Você está perdendo uma citação próxima.

O shell lhe disse isso, depois que você sabe ler as mensagens de erro. Primeiro, você precisa ter linhas numeradas - sugiro procurar uma opção no editor que mostre números de linha ou pule para uma linha por número. Para facilitar, vou colocá-los abaixo:

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

A chave para entender essa mensagem é saber que "EOF" significa "fim do arquivo". Então, basicamente, o shell encontrou um " na linha 8. Ele continuou procurando pelo " correspondente (para fechar a citação), mas em vez de encontrar um, encontrou o final do arquivo.

Existe outro problema:

combine $audio $video $output

Aqui, você deseja passar esses nomes de arquivos sem nenhuma expansão adicional ou divisão de palavras (caso contrário, os nomes de arquivos com espaços neles falharão). Então você precisa citar aqueles: combine "$audio" "$video" "$output" .

Por fim, para depurar seu último problema: adicione um set -x no topo. Isso fará com que os comandos que estão sendo executados sejam primeiro ecoados, para que você possa ver o que está acontecendo.

PS: Se você olhar para o seu código original da pergunta , ele não muitos desses problemas. Daí toda a confusão.

Encaracolado cita em todos os lugares

Você precisa que seu editor pare de inserir aspas inglesas para você.

    
por 18.10.2015 / 20:51

Tags