Как избежать этого в скрипте bash?

Я пытаюсь завершить пакет из 3 видео, чтобы оставить его там до утренней обработки, но кажется, что в нем есть специальные символы ... Я пытаюсь использовать его в терминале "raw", и это работает, но в сценарии bash это перестает работать

Пример:

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

В выводе говорится

Невозможно найти подходящий формат вывода для «scale = 580: 380», не знаю почему .. Как я уже сказал, команда отлично работает в командной строке, но не в сценарии

/usr/local/bin/ffmpeg "$args1" "${file}"  -vf "$args2" "$args3" "${args[0]}_${startingfrom}_0001_02.mp4"
0
задан 23 April 2011 в 08:27

4 ответа

Похоже, что $ args1 и $ args12 содержат несколько параметров, но $ args2 выглядит так, как будто это должно быть одно значение для параметра -vf. Поэтому вы должны опустить кавычки в $ args1 и $ args12, чтобы они могли быть разбиты на слова, но продолжайте заключать в кавычки $ args2.

Однако сообщение об ошибке «Невозможно найти подходящий формат вывода для« scale = 580: 380 »» выглядит так, как будто оно исходит от ffmpeg, а не от оболочки.

0
ответ дан 23 April 2011 в 08:27

Не помещайте более одного аргумента в переменную, это будет работать для очень простых случаев, но в остальном не даст вам ничего, кроме горя. Вместо этого используйте массивы. Например,

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"

(важны кавычки)

В этом случае, возможно, вы захотите использовать функцию. Трудно сказать, так как ваш вопрос немного расплывчатый.

См. BashFAQ 50

.
0
ответ дан 23 April 2011 в 08:27

В этом случае, где Вы хотите, чтобы $argsN был передан ffmpeg как несколько аргументов, Вы на самом деле не хотите заключать его в кавычки. Чтобы быть ясными, Вы действительно хотите заключить строку в кавычки, где Вы устанавливаете ее, таким образом:

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

Корректно. Но ffmpeg строка должна выглядеть примерно так:

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

Проблема здесь состоит в том, что ffmpeg ожидает массив аргументов как это:

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

Когда Вы заключаете в кавычки переменную, содержащую аргументы, они все представляются как отдельный аргумент как это:

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

Так как ffmpeg не имеет никакой единственной опции, -r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i это законно жалуется.

Если Вы хотите играть вокруг со способностью видеть, как точно Ваши аргументы передаются, можно использовать этот простой сценарий оболочки, который печатает каждый аргумент, переданный ей на отдельной строке:

#!/bin/bash
echo "0: $0"
i=1
for argument in "$@"; do
    echo "${i}: $argument"
    ((i++))
done
0
ответ дан 23 April 2011 в 08:27

Может быть, вам следует попытаться определить свой args так:

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

(обратите внимание на одинарную кавычку, а не двойную кавычку). Скажите, как вы поживаете.

0
ответ дан 23 April 2011 в 08:27

Другие вопросы по тегам:

Похожие вопросы: