Я могу преобразовать mp4 в wav, используя ffmpeg
, сделав это:
ffmpeg -vn test.wav -i test.mp4
Я также могу использовать subprocess
, чтобы сделать то же самое, если мой ввод и вывод - это пути к файлам .
Но что, если бы я хотел использовать ffmpeg
непосредственно с байтами или «файловым» объектом, например io.BytesIO()
?
Вот попытка:
import subprocess
from io import BytesIO
b = BytesIO()
with open('test.mp4', 'rb') as stream:
command = ['ffmpeg', '-i']
proc = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=b)
proc.communicate(input=stream.read())
proc.wait()
proc.stdin.close()
proc.stdout.close()
Выдает мне:
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
<ipython-input-84-0ddce839ebc9> in <module>
5 with open('test.mp4', 'rb') as stream:
6 command = ['ffmpeg', '-i']
----> 7 proc = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=b)
...
1486 # Assuming file-like object
-> 1487 c2pwrite = stdout.fileno()
1488
1489 if stderr is None:
UnsupportedOperation: fileno
Конечно, я мог бы использовать временные файлы для передачи своих байтов, но я бы хотел избежать записи на диск (потому что этот шаг - всего одна ссылка в конвейере преобразований).