перекодировка предохранителя и gstreamer - PullRequest
0 голосов
/ 02 августа 2010

Я пытаюсь создать FUSE FS, который транскодирует все звуковые файлы в mp3. Моя первая идея - использовать gstreamer в качестве бэкенда для транскодирования. Я думал об использовании этого конвейера:

gst-launch -v filesrc location=01\ New\ Born.flac ! decodebin ! audioconvert ! lame vbr=4 vbr-quality=9 ! id3v2mux ! appsink

Python-привязки fuse Ожидают, что эта функция вызывает при чтении файла:

def read(self, length, offset):

Как мне перенести буфер с gstreamer на предохранитель fs? Я не знаю, как с этим справиться. Я никогда не использовал appsink раньше.

Надеюсь, понятно, о чем я.

Ответы [ 2 ]

0 голосов
/ 04 августа 2010

Пробовали ли вы: giosink Записывать в любое местоположение, поддерживаемое GIO. Giosrc Чтение из любого местоположения, поддерживаемого GIO.

С помощью Gio вы можете рассматривать FUSE как любую файловую систему.

0 голосов
/ 02 августа 2010

Я не думаю, что вам нужно беспокоиться о appsink.Мне кажется, что чем дальше вы можете отделить часть транскодирования от части файловой системы, тем лучше.Транскодируйте в отдельном потоке или процессе в файловую систему и передавайте сообщения, чтобы сообщить демону FUSE, как далеко продвинулся процесс транскодирования.

Вместо appsink я бы использовал filesink, транскодирующий в ряде рабочих потоков / процессовЗаписать .mp3s в каталог кэша с контролируемым размером и иметь блок read(), пока выполняемый транскодированный файл не станет достаточно длинным для выполнения запроса.

Вот источник для fileink.При отсутствии запросов он просто добавляет содержимое каждого буфера в файл.http://mediatools.cs.ucl.ac.uk/nets/newvideo/browser/gst-cvs/gstreamer/plugins/elements/gstfilesink.c#L436

Вы также можете сэкономить много времени и усилий, просто скачав mp3fs или gstfs , которые уже в значительной степени выполняют то, что вы упоминаете.

...