Como escapar disso no script bash?

0

Estou tentando completar um lote de 3 vídeos para deixá-lo lá até o processamento da manhã, mas parece que há caracteres especiais nele ... Eu tento "raw" no terminal e funciona, mas no script bash ele pára de funcionar

Exemplo:

args1="-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i"
args12="-r 29.97 -ss 00:40:30 -vsync 0 -vpre libx264-medium -i"
args2="[in] scale=580:380 [T1],[T1] pad=720:530:0:50 (other arguments with lots of [ and ]"

Na saída, diz

Incapaz de encontrar um formato de saída adequado para 'scale = 580: 380' não sei por que ... como eu disse, o comando roda bem na linha de comando, mas não no script

/usr/local/bin/ffmpeg "$args1" "${file}"  -vf "$args2" "$args3" "${args[0]}_${startingfrom}_0001_02.mp4"
    
por allenskd 23.04.2011 / 06:07

4 respostas

5

Não coloque mais de um argumento em uma variável, ele funcionará para casos muito simples, mas, de outra forma, não lhe dará nada além de pesar. Use matrizes em vez disso. Por exemplo,

infile=video.avi
outfile=${infile%.*}.mp4  # video.mp4
args=(
    -r 29.97 
    -t 00:13:30 
    -vsync 0 
    -vpre libx264-medium 
    -vf "[in] scale=580:380 [T1],[T1] pad=720:530:0:50"
)
#...
ffmpeg -i "$infile" "${args[@]}" "$outfile"

(as aspas são importantes)

Nesse caso, você pode querer uma função. É difícil dizer, já que sua pergunta é um pouco vaga.

Veja BashFAQ 50

    
por geirha 26.04.2011 / 23:49
1

Neste caso, onde você deseja que $ argsN seja passado para o ffmpeg como vários argumentos que você realmente não deseja citá-lo. Para ser claro, você quer citar a linha onde você está configurando, então:

args1="-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i" 

Está correto. Mas a linha ffmpeg deve ser algo como isto:

/usr/local/bin/ffmpeg $args1 "${file}"  -vf $args2 $args3 "${args[0]}_${startingfrom}_0001_02.mp4"

O problema aqui é que o ffmpeg está esperando uma série de argumentos como este:

0: /usr/local/bin/ffmpeg
1: -r
2: 29.97
3: -t
...

Quando você cita a variável que contém os argumentos, todos eles são enviados como um único argumento como este:

0: /usr/local/bin/ffmpeg
1: -r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i
...

Como o ffmpeg não tem uma única opção, -r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i reclama corretamente.

Se você quer brincar com a capacidade de ver exatamente como seus argumentos estão sendo passados, você pode usar este simples shell script que imprime cada argumento passado para ele em uma linha separada:

#!/bin/bash
echo "0: $0"
i=1
for argument in "$@"; do
    echo "${i}: $argument"
    ((i++))
done
    
por Jordan Uggla 23.04.2011 / 10:28
0

Talvez você deva tentar definir seu args assim:

args2='[in] scale= .....'

(observe a aspa simples em oposição às aspas duplas). Diga como você se sai.

    
por asoundmove 23.04.2011 / 06:52
0

Parece que $ args1 e $ args12 contêm várias opções, mas $ args2 parece que deve ser um valor único para a opção -vf. Portanto, você deve omitir as aspas de $ args1 e $ args12, de modo que elas estejam sujeitas à divisão de palavras, mas continuem citando $ args2.

No entanto, a mensagem de erro que você relata "Não é possível encontrar um formato de saída adequado para 'scale = 580: 380'" parece que vem do ffmpeg e não do shell.

    
por glenn jackman 23.04.2011 / 19:17