LINUX.ORG.RU

python mp3/ogg stream encoding


0

1

Нужна библиотека (враппер над библиотекой) для кодирования сырого потока в mp3/ogg (хотя бы во что-нибудь).

Все что попадается - умеет максимум кодировать в файл. Т.е. stringio ему не скормить - требует именно полноценный файловый объект с открытым дескриптором. А мне мало того что не в файл надо, так еще и поток, т.е. временными файлами я не обойдусь - мне 24/7 надо.

Раньше был хороший проект - pymedia, но успешно загнулся.

Гугль безуспешен.

★★★★★

Пятиминутный велосипед. Можно кодировать любые потоки любой программой, например oggenc.

import fcntl, os, signal
from select import select
from subprocess import Popen, PIPE
from threading import Thread
import time

def unblock_fd(fd):
    fl = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)

class Converter(object):
    SIZE = 1024

    def __init__(self, cmd):
        self.process = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)
        unblock_fd(self.process.stdout)

    def start(self, chunk_processed):
        while self.process.poll() is None:
            r, _, _ = select([self.process.stdout], [], [])
            if r:
                data = r[0].read(self.SIZE)
                if data:
                    chunk_processed(data)

    def feed(self, data):
        self.process.stdin.write(data)
        self.process.stdin.flush()

    def stop(self):
        self.process.stdin.close()
        self.process.send_signal(signal.SIGPIPE)
        self.process.wait()

def writer(converter):
    for _ in xrange(10):
        converter.feed('String\n')
        time.sleep(0.1)

    converter.stop()

def reader(data):
    print data,

converter = Converter('grep --line-buffered -o Str')
t = Thread(target=writer, args=(converter,))
t.daemon = True
t.start()

converter.start(reader)
baverman ★★★
()
Ответ на: комментарий от baverman

Ага. А у меня subprocess.Popen закрывался после первой записи в него. Следущая запись выдавала типа «io operations on closed descriptor».

Ок, буду играться, спасибо!

AngryElf ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

Нет, в итоге это у меня просто были косяки с параметрами вызываемой прграммы. Она валилась, поэтому пайп ругался.

AngryElf ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.