Простой способ перекодировать mp3 в ogg в python (live)?
Я ищу библиотеку / модуль, который может перекодировать MP3 (другие форматы являются плюсом) в OGG, на лету.
для чего мне это нужно: я пишу относительно небольшое веб-приложение для личного использования, которое позволит людям слушать музыку через браузер. Для прослушивания части, я намерен использовать новый и могучий <audio>
тег. Тем не менее, несколько браузеров поддерживают MP3 там. Live transcoding кажется лучшим вариантом, потому что он не тратит дисковое пространство (например, если бы я преобразовать всю музыкальную библиотеку) и у меня не будет проблем с производительностью, так как будет не более 2-3 слушателей одновременно.
в основном, мне нужно кормить его MP3 (или что-то еще), а затем получить файловый объект, который я могу передать обратно в свою структуру (flask
, кстати) для подачи клиенту.
вещи, которые я смотрел:
-
gstreamer
-- кажется излишним, хотя имеет хорошую поддержку для многих форматов; документации не хватает ужасно!--14--> -
timeside
-- выглядит красиво и просто в использовании, но опять же у него есть много вещей, которые мне не нужны (графика, анализ, пользовательский интерфейс...) - PyMedia -- последнее обновление: 01 Feb 2006...
предложения?
1 ответов
вы знаете, нет никакого стыда в использовании subprocess
для вызова внешних утилит. Например, вы можете построить трубы, такие как:
#!/usr/bin/env python
import subprocess
frommp3 = subprocess.Popen(['mpg123', '-w', '-', '/tmp/test.mp3'], stdout=subprocess.PIPE)
toogg = subprocess.Popen(['oggenc', '-'], stdin=frommp3.stdout, stdout=subprocess.PIPE)
with open('/tmp/test.ogg', 'wb') as outfile:
while True:
data = toogg.stdout.read(1024 * 100)
if not data:
break
outfile.write(data)
На самом деле, это, вероятно, ваш лучший подход в любом случае. Учтите, что в многопроцессорной системе MP3-декодер и Ogg-кодер будут работать в отдельных процессах и, вероятно, будут запланированы на отдельных ядрах. Если вы попытаетесь сделать то же самое с однопоточной библиотекой, вы сможете перекодировать только так быстро, как одно ядро сможет справиться с этим.