Используйте matlab главный режим или режим октавы.
Так или иначе то, что Вы получаете, является интерактивным буфером, где можно ввести команды matlab и возвратить результаты, а также передающие регионы текста, определений целой функции или целых файлов к выполнению matlab процесс.
Вашим вопросом является на самом деле Bash FAQ № 89: просто добавьте </dev/null
предотвратить ffmpeg
от чтения его стандартного входа.
Я брал на себя смелость согласовывания Вашего сценария для Вас, потому что это содержит много потенциальных ошибок. Несколько важных моментов:
Имена файлов хитры для обработки, потому что большинство файловых систем позволяет им содержать все виды непечатных символов, которые нормальные люди рассматривали бы как мусор. Создание упрощения предположений как "имена файлов содержит только 'нормальные' символы", имеет тенденцию заканчиваться хрупкие сценарии оболочки, которые, кажется, работают над "нормальными" именами файлов и затем повреждают день, они сталкиваются с особенно противным именем файла, которое не следует за предположениями сценария. С другой стороны, правильно обрабатывающие имена файлов могут быть таким беспокойством, что можно найти его не стоящим усилия, если шанс обнаружения со странным именем файла, как ожидают, будет близким нулем (т.е. Вы только используете сценарий на своих собственных файлах, и Вы даете Вашим собственным файлам "простые" имена). Иногда возможно избежать этого решения в целом, не анализируя имена файлов вообще. К счастью, это возможно с find(1)
-exec
опция. Просто помещенный {}
в аргументе -exec
и Вы не должны волноваться о парсинге find
вывод.
Используя sed
или другие внешние процессы, чтобы сделать операции простой строки как разделение расширений и префиксов неэффективны. Вместо этого используйте расширения параметра, которые являются частью оболочки (никакой внешний процесс не означает, что это будет быстрее). Некоторые полезные статьи о предмете упоминаются ниже:
Использовать $( )
, и не используйте ``
больше: Bash FAQ 82.
Избегайте использования ПРОПИСНЫХ имен переменной. То пространство имен обычно резервируется оболочкой для особых целей (как PATH
), так использование его для Ваших собственных переменных является плохой идеей.
И теперь, без дальнейшей суматохи, вот очищенный сценарий для Вас:
#!/bin/sh
logfile=encodemp4ize.log
echo "Started at $(date)." > "$logfile"
rsync -avz --exclude '*.flv' flvs/ mp4s/
find flvs/ -type f -name '*.flv' -exec sh -c '
for flvsfile; do
file=${flvsfile#flvs/}
< /dev/null ffmpeg -i "$flvsfile" -vcodec libx264 -vprofile high \
-preset slow -b:v 500k -maxrate 500k -bufsize 1000k \
-threads 0 -acodec libfaac -ab 128k \
"mp4s/${file%flv}"mp4
printf %s\\n "$flvsfile MP4 done." >> "$logfile"
done
' _ {} +
Примечание: Я использовал POSIX sh
потому что Вы не использовали или нуждаетесь в любом bash
- определенные функции в Вашем оригинале.
Я нашел решение. Сценарий удара, кажется, производит вход (А именно, 'c' ключ), который вмешивается в ffmpeg
процесс.
Добавление < /dev/null
к ffmpeg
командная строка, как так:
ffmpeg -i "./$f" -vcodec libx264 -vprofile high -preset slow -b:v 500k -maxrate 500k -bufsize 1000k -threads 0 -acodec libfaac -ab 128k "./mp4s/$MP4FILENAME" < /dev/null
устраняет проблему.
В качестве альтернативы решению ffmpeg [...] < /dev/null
вы можете использовать:
ffmpeg -nostdin [...]
Подробности из документации ffmpeg:
To explicitly disable interaction you need to specify -nostdin.
Disabling interaction on standard input is useful, for example, if ffmpeg is in the background process group. Roughly the same result can be achieved with ffmpeg... < /dev/null but it requires a shell.
В цикле while я столкнулся с похожими проблемами, вы можете использовать цикл for, а в цикле for вы можете не брать список аудио и запускать его в цикле с помощью команды find.
Вы можете использовать такую команду (использовал много раз, и она работает отлично)
for f1 in `find. -maxdepth 1 -name "*.mkv" | sed 's/^\.\///g'`; do ffmpeg -i "$f1" -q:a 0 -map a../wav/"${f1%.*}.wav"; done
zsh
. Возможно, некоторые zsh люди на сайте знали бы. – jw013 24.10.2012, 16:09