2013-03-23 3 views
3

я сейчас делаю:В Python с GStreamer, как использовать файл-объект в качестве источника ввода?

source_path = 'file:///home/raj/videos/sample.mpg' 
descr = 'uridecodebin uri=%s ! videoconvert ! gdkpixbufsink name=sink' % (source_path) 
pipeline = Gst.parse_launch(descr) 

Но вместо того, чтобы использовать uri, как я могу использовать сырой исходный файл, например, от source_file = request.POST['file'].file. (Возможно, это будет загрузка видеофайла из строки?)

Мои исследования до сих пор привело меня к appsrc (http://ingo.fargonauten.de/node/447), но я не знаю, как использовать его с GStreamer 1.0, так как я не могу понять о том, как загрузить файл в буфер:

raw_src = request.POST['files[]'].file 
descr = 'appsrc name=vidsrc ! videoconvert ! gdkpixbufsink name=sink' 
pipeline = Gst.parse_launch(descr) 
appsrc = pipeline.get_by_name('vidsrc') 
appsrc.emit('push-buffer', Gst.Buffer(raw_src.read()) ##I am not creating the buffer correctly for GStreamer 1.0 
+0

Я не совсем понимаю вашу цель. Вы надеетесь позвонить GStreamer из веб-скрипта? –

+0

@MultimediaMike, да, я. Конечный пользователь загружает видео на веб-сайт, и я хочу передать этот файл-объект в appsrc (или любой соответствующий элемент) для использования этого файла. Файл еще не сохранен на жестком диске, поэтому у меня нет пути для него. – Raj

+0

Итак, файл будет храниться в памяти для всего этого процесса? Видеофайлы могут быть довольно большими. Вы уверены, что не хотите хранить это во временном файле? Должно быть возможно кодирование из памяти, но мне интересно об общей архитектуре. Есть ли ограничение на размер файла? –

ответ

1

есть несколько вариантов, вы можете использовать:

  1. трубы, создать набор труб, записать содержимое файла в трубе записи а также перейдите в read pipe в fdsrc, используя свойство fd.

  2. Создайте временный файл, используя модуль tempfile, напишите содержимое и передайте файл в файл, используя свойство filename.

  3. Appsrc, но вам нужно подключиться к сигналам push-buffer и end-of-stream, создавать буферы из данных. Это лучше избегать этой опции, как вы должны сделать чтение в питона, это более эффективно использовать fdsrc/filesink в части обработки делается в С.

+0

В моей (MVC-стиле) webframework есть менеджер транзакций, который автоматически помещает загруженный файл во временный каталог (у меня нет доступа к имени/пути временного файла). Поэтому я остался с файлом, который я могу использовать .read() ' – Raj

+0

Я бы хотел увидеть пример кода, чтобы сделать ваше первое предложение и 3-е предложения, пожалуйста. Предпочтительно, я хотел бы придерживаться формата 'descr' и' Gst.parse_lauch (descr) ', так как у меня уже есть все настройки кода. И повторный метод создания конвейера может вызвать множество других проблем – Raj

0

Если у вас есть реальный объект файла, а не просто файлоподобный, вы можете использовать fdsrc напрямую, а не использовать между ними каналы.

Адаптировать из кода в вопросе, что-то, как это должно работать:

descr = 'fdsrc name=vidsrc ! decodebin ! videoconvert ! gdkpixbufsink name=sink' 
pipeline = Gst.parse_launch(descr) 

src = pipeline.get_by_name('vidsrc') 
src.props.fd = source_file.fileno() 

Вы хотите добавить decodebin, так как вы переход от uridecodebin Ф.Д. источник не будет, вероятно, обеспечить такой вклад, который видеоконвертер/pixbufsink.

 Смежные вопросы

  • Нет связанных вопросов^_^