Простой способ перекодировать mp3 в ogg в python (live)? - PullRequest
8 голосов
/ 29 марта 2011

Я ищу библиотеку / модуль, который может транскодировать MP3 (другие форматы плюс) в OGG, на лету.

Для чего мне это нужно: я пишу относительно небольшое веб-приложение для личного пользования, которое позволит людям слушать свою музыку через браузер. Для прослушивания я собираюсь использовать новый и мощный тег <audio>. Однако немногие браузеры поддерживают MP3. Живое транскодирование кажется лучшим вариантом, потому что оно не тратит место на диске (как, например, если бы я конвертировал всю музыкальную библиотеку), и у меня не будет проблем с производительностью, поскольку одновременно будет максимум 2-3 слушателя.

По сути, мне нужно передать ему MP3 (или что-то еще), а затем получить обратно файлоподобный объект, который я могу передать обратно в мою структуру (flask, между прочим) для передачи клиенту.

Материал, на который я смотрел:

  • gstreamer - кажется излишним, хотя имеет хорошую поддержку для многих форматов; ужасно не хватает документации
  • timeside - выглядит красиво и просто в использовании, но опять же в нем есть много вещей, которые мне не нужны (графика, анализ, пользовательский интерфейс ...)
  • PyMedia - последнее обновление: 01 февраля 2006 г. ...

Предложения

1 Ответ

7 голосов
/ 29 марта 2011

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

...