Я пытаюсь выполнить партию из 3 видеороликов, чтобы оставить ее там до утренней обработки, но кажется, что в ней есть специальные символы ... Я пытаюсь сделать это «сырым» в терминале, и он работает, но в сценарии 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' not sure почему ... как я уже сказал, команда отлично работает в командной строке, а не в скрипте
/usr/local/bin/ffmpeg "$args1" "${file}" -vf "$args2" "$args3" "${args[0]}_${startingfrom}_0001_02.mp4"
Возможно, вам стоит попытаться определить ваш args таким образом:
args2='[in] scale= .....'
(обратите внимание на одинарную цитату, а не на двойную кавычку). Скажите, как вы это делаете.
Не помещайте в переменную несколько аргументов, она будет работать для очень простых случаев, но в противном случае вы получите только горю. Вместо этого используйте массивы. Например,
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
Похоже, что $ args1 и $ args12 содержат несколько опций, но $ args2 выглядит как одно значение для опции -vf. Поэтому вам следует опустить кавычки из $ args1 и $ args12, чтобы они были подвержены разбиению слов, но продолжайте цитировать $ args2.
Однако сообщение об ошибке, которое вы сообщаете «Невозможно найти подходящий формат вывода для 'scale = 580: 380' 'похоже, что он исходит из ffmpeg, а не оболочки.
В этом случае, когда вы хотите передать $ 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
Возможно, вам стоит попытаться определить ваш args таким образом:
args2='[in] scale= .....'
(обратите внимание на одинарную цитату, а не на двойную кавычку). Скажите, как вы это делаете.
Не помещайте в переменную несколько аргументов, она будет работать для очень простых случаев, но в противном случае вы получите только горю. Вместо этого используйте массивы. Например,
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
Похоже, что $ args1 и $ args12 содержат несколько опций, но $ args2 выглядит как одно значение для опции -vf. Поэтому вам следует опустить кавычки из $ args1 и $ args12, чтобы они были подвержены разбиению слов, но продолжайте цитировать $ args2.
Однако сообщение об ошибке, которое вы сообщаете «Невозможно найти подходящий формат вывода для 'scale = 580: 380' 'похоже, что он исходит из ffmpeg, а не оболочки.
В этом случае, когда вы хотите передать $ 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
Возможно, вам стоит попытаться определить ваш args таким образом:
args2='[in] scale= .....'
(обратите внимание на одинарную цитату, а не на двойную кавычку). Скажите, как вы это делаете.
Не помещайте в переменную несколько аргументов, она будет работать для очень простых случаев, но в противном случае вы получите только горю. Вместо этого используйте массивы. Например,
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
Похоже, что $ args1 и $ args12 содержат несколько опций, но $ args2 выглядит как одно значение для опции -vf. Поэтому вам следует опустить кавычки из $ args1 и $ args12, чтобы они были подвержены разбиению слов, но продолжайте цитировать $ args2.
Однако сообщение об ошибке, которое вы сообщаете «Невозможно найти подходящий формат вывода для 'scale = 580: 380' 'похоже, что он исходит из ffmpeg, а не оболочки.
В этом случае, когда вы хотите передать $ 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
Возможно, вам стоит попытаться определить ваш args таким образом:
args2='[in] scale= .....'
(обратите внимание на одинарную цитату, а не на двойную кавычку). Скажите, как вы это делаете.
Не помещайте в переменную несколько аргументов, она будет работать для очень простых случаев, но в противном случае вы получите только горю. Вместо этого используйте массивы. Например,
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
Похоже, что $ args1 и $ args12 содержат несколько опций, но $ args2 выглядит как одно значение для опции -vf. Поэтому вам следует опустить кавычки из $ args1 и $ args12, чтобы они были подвержены разбиению слов, но продолжайте цитировать $ args2.
Однако сообщение об ошибке, которое вы сообщаете «Невозможно найти подходящий формат вывода для 'scale = 580: 380' 'похоже, что он исходит из ffmpeg, а не оболочки.
В этом случае, когда вы хотите передать $ 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
В этом случае, когда вы хотите передать $ 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]} _ $ {startfrom} _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 ...
[ ! d16]Так как ffmpeg не имеет единственной опции,
-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i
он по праву жалуется.Если вы хотите поиграть с возможностью увидеть, как именно передаются ваши аргументы, вы можете использовать этот простой сценарий оболочки, который печатает каждый переданный ему аргумент в отдельной строке:
#! / bin / bash echo "0: $ 0" i = 1 для аргумента в "$ @"; do echo "$ {i}: $ argument" ((i ++)) done
Похоже, что $ args1 и $ args12 содержат несколько опций, но $ args2 выглядит как одно значение для опции -vf. Поэтому вам следует опустить кавычки из $ args1 и $ args12, чтобы они были подвержены разбиению слов, но продолжайте цитировать $ args2.
Однако сообщение об ошибке, которое вы сообщаете «Невозможно найти подходящий формат вывода для 'scale = 580: 380' 'похоже, что он исходит из ffmpeg, а не оболочки.
Не помещайте в переменную несколько аргументов, она будет работать для очень простых случаев, но в противном случае вы не получите ничего, кроме скорби. Вместо этого используйте массивы. Например:
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"
(Кавычки важны)
В этом случае, возможно, вам понадобится функция. Трудно сказать, так как ваш вопрос немного расплывчатый.
См. [D0] BashFAQ 50
Возможно, вам стоит попытаться определить ваш args
таким образом:
args2 = '[in] scale = .....'
(обратите внимание на одинарную цитату, а не на двойную кавычку). Скажите, как вы это делаете.
Похоже, что $ args1 и $ args12 содержат несколько опций, но $ args2 выглядит как одно значение для опции -vf. Поэтому вам следует опустить кавычки из $ args1 и $ args12, чтобы они были подвержены разбиению слов, но продолжайте цитировать $ args2.
Однако сообщение об ошибке, которое вы сообщаете «Невозможно найти подходящий формат вывода для 'scale = 580: 380' 'похоже, что он исходит из ffmpeg, а не оболочки.
В этом случае, когда вы хотите передать $ 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]} _ $ {startfrom} _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 ...
[ ! d16]Так как ffmpeg не имеет единственной опции,
-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i
он по праву жалуется.Если вы хотите поиграть с возможностью увидеть, как именно передаются ваши аргументы, вы можете использовать этот простой сценарий оболочки, который печатает каждый переданный ему аргумент в отдельной строке:
#! / bin / bash echo "0: $ 0" i = 1 для аргумента в "$ @"; do echo "$ {i}: $ argument" ((i ++)) done
Не помещайте в переменную несколько аргументов, она будет работать для очень простых случаев, но в противном случае вы не получите ничего, кроме скорби. Вместо этого используйте массивы. Например:
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"
(Кавычки важны)
В этом случае, возможно, вам понадобится функция. Трудно сказать, так как ваш вопрос немного расплывчатый.
См. [D0] BashFAQ 50
Возможно, вам стоит попытаться определить ваш args
таким образом:
args2 = '[in] scale = .....'
(обратите внимание на одинарную цитату, а не на двойную кавычку). Скажите, как вы это делаете.
Возможно, вам стоит попытаться определить ваш args
таким образом:
args2 = '[in] scale = .....'
(обратите внимание на одинарную цитату, а не на двойную кавычку). Скажите, как вы это делаете.
Не помещайте в переменную несколько аргументов, она будет работать для очень простых случаев, но в противном случае вы не получите ничего, кроме скорби. Вместо этого используйте массивы. Например:
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"
(Кавычки важны)
В этом случае, возможно, вам понадобится функция. Трудно сказать, так как ваш вопрос немного расплывчатый.
См. [D0] BashFAQ 50
Похоже, что $ args1 и $ args12 содержат несколько опций, но $ args2 выглядит как одно значение для опции -vf. Поэтому вам следует опустить кавычки из $ args1 и $ args12, чтобы они были подвержены разбиению слов, но продолжайте цитировать $ args2.
Однако сообщение об ошибке, которое вы сообщаете «Невозможно найти подходящий формат вывода для 'scale = 580: 380' 'похоже, что он исходит из ffmpeg, а не оболочки.
В этом случае, когда вы хотите передать $ 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]} _ $ {startfrom} _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 ...
[ ! d16]Так как ffmpeg не имеет единственной опции,
-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i
он по праву жалуется.Если вы хотите поиграть с возможностью увидеть, как именно передаются ваши аргументы, вы можете использовать этот простой сценарий оболочки, который печатает каждый переданный ему аргумент в отдельной строке:
#! / bin / bash echo "0: $ 0" i = 1 для аргумента в "$ @"; do echo "$ {i}: $ argument" ((i ++)) done
Похоже, что $ args1 и $ args12 содержат несколько опций, но $ args2 выглядит как одно значение для опции -vf. Поэтому вам следует опустить кавычки из $ args1 и $ args12, чтобы они были подвержены разбиению слов, но продолжайте цитировать $ args2.
Однако сообщение об ошибке, которое вы сообщаете «Невозможно найти подходящий формат вывода для 'scale = 580: 380' 'похоже, что он исходит из ffmpeg, а не оболочки.
В этом случае, когда вы хотите передать $ 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]} _ $ {startfrom} _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 ...
[ ! d16]Так как ffmpeg не имеет единственной опции,
-r 29.97 -t 00:13:30 -vsync 0 -vpre libx264-medium -i
он по праву жалуется.Если вы хотите поиграть с возможностью увидеть, как именно передаются ваши аргументы, вы можете использовать этот простой сценарий оболочки, который печатает каждый переданный ему аргумент в отдельной строке:
#! / bin / bash echo "0: $ 0" i = 1 для аргумента в "$ @"; do echo "$ {i}: $ argument" ((i ++)) done
args2 = "\" [in] scale = 580: 380 [T1], [T1] pad = 720: 530: 0: 50 \ ""
Я попытался использовать обратную косую черту, несколько вещей, ничего не работает, аргументы находятся внутри сценария bash, а не снаружи :( действительно хлопотно, я также добавил, что строка ffmpeg, которую вы ее отредактировали, не работала
– allenskd
23 April 2011 в 21:01