FFMpeg дает недопустимую ошибку аргумента с подпроцессом python - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь преобразовать поток файла или микрофона в частоту дискретизации 22050 и изменить темп на двойной. Я могу сделать это, используя терминал с кодом ниже:

#ffmpeg -i test.mp3 -af asetrate=44100*0.5,aresample=44100,atempo=2 output.mp3 

Но я не могу запустить этот код терминала с подпроцессом python. Я пробую много вещей, но каждый раз терплю неудачу. Обычно я принимаю Запрошенный выходной формат 'asetrate' или 'aresample' или 'atempo' не подходит для выходного формата ошибки. Недопустимый аргумент. Как я могу запустить его и взять поток с трубой?

song = subprocess.Popen(["ffmpeg.exe", "-i", sys.argv[1], "-f", "asetrate", "22050", "wav", "pipe:1"],
                        stdout=subprocess.PIPE)

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Ваши две команды разные. Попробуйте:

song = subprocess.Popen(["ffmpeg", "-i", sys.argv[1], "-af", "asetrate=22050,aresample=44100,atempo=2", "-f", "wav", "pipe:1"],
  • -af для звукового фильтра.
  • -f для ручной настройки формата мультиплексора / вывода
2 голосов
/ 23 января 2020

ffmpeg интерпретирует все, что предоставлено -af, как один аргумент, который затем будет внутренне проанализирован на отдельные, поэтому разделение их перед передачей через Popen не приведет к достижению того же самого.

Первоначальный пример с использованием терминала должен быть создан с использованием Popen как

subprocess.Popen([
    'ffmpeg', '-i', 'test.mp3', '-af', 'asetrate=44100*0.5,aresample=44100,atempo=2',
    'output.mp3',
])

Так что для вашего реального примера с pipe попробуйте вместо этого следующее:

song = subprocess.Popen(
    ["ffmpeg.exe", "-i", sys.argv[1], "-f", "asetrate=22050,wav", "pipe:1"],
    stdout=subprocess.PIPE
)

Затем вам понадобится вызвать song.communicate(), чтобы получить вывод, произведенный ffmpeg.exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...