2017-02-22 51 views
0

У меня есть .wmv файл, который я хочу, чтобы преобразовать в .wav файл и я использую FFmpeg для того же, команда выглядит следующим образом:Как использовать выход FFMPEG как аргумент командной строки для исполняемого файла

ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav pipe:1 

труба: 1 выдает выходной файл волны в STDOUT. Я хочу захватить этот волновой файл из STDOUT и передать его в качестве аргумента командной строки для моего исполняемого файла, называемого foo. Я хочу сделать преобразование из wmv в wav на лету, а не сохранять WAV-файл. вещей я попытался следующие, но ни один из них, кажется, работают:

./foo $(ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav pipe:1) 

./foo $(<(ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav pipe:1)) 

ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav pipe:1 | xargs ./foo 

ffmpeg -i file.wmv -ar 8000 -sample_fmt s16 -f wav - | ./foo - 
+0

Почему бы просто не пропустить трубку и не читать вашу программу с stdin? – AlG

+1

Дизайн исполняемого файла не входит в мой контроль – pku

+0

Как насчет использования перенаправления процесса bash? Второй пример, но только с '<(ffmpeg ...)', а не '$ (' и ')'? Результат этого будет выглядеть примерно так: ./foo/dev/fd/63', где fd заполняется выходом команды. – ghoti

ответ

2

Я думаю, что ваша вторая попытка близка:

./foo <(ffmpeg ...) 

Замещение процесса расширяется до имени, который foo может открыть как и любой другой файл. Содержимое этого «файла» - это результат от ffmpeg.

Обратите внимание, что это не сработает, если foo ожидает файл для поиска; выход ffmpeg по-прежнему является потоком, который не буферизируется в памяти. Если foo ожидает, что сможет перемещаться вперед и назад по файлу, вам нужно использовать фактический файл. (ffmpeg ... > tmp; ./foo tmp)


В первом случае, вы пытаетесь Пропустите содержимом выходного потока в качестве аргумента, подобно ./foo "$(cat some.mp4)".

В третьем случае вы обрабатываете вывод ffmpeg как имя файла.

Четвертый случай будет работать, если foo были написаны для понимания - в качестве имени для стандартного ввода. Это соглашение о программе, а не что-то, предоставляемое оболочкой.

+0

Спасибо. но я немного смущен относительно того, как синтаксис <(ffmpeg ...) служит аргументом командной строки, а не stdin. – pku

+0

Подстановка процесса - это, в некотором смысле, способ создания временного файла. Попробуйте 'echo <(:)' (':' быть командой do-nothing). Вывод - это имя «файла», которое создает подстановка процесса. – chepner