Простой способ перекодировать 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-кодер будут работать в отдельных процессах и, вероятно, будут запланированы на отдельных ядрах. Если вы попытаетесь сделать то же самое с однопоточной библиотекой, вы сможете перекодировать только так быстро, как одно ядро сможет справиться с этим.