在使用GStreamer的Python中,如何使用文件对象作为输入源?

时间:2013-03-23 04:51:02

标签: gstreamer python-gstreamer gobject-introspection

我目前正在做:

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。 (也许这会从字符串中加载视频文件?)

到目前为止,我的研究已经让我appsrchttp://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

2 个答案:

答案 0 :(得分:1)

您可以使用以下几种方法:

  1. 管道,创建一组管道,将文件内容写入写入管道,并使用fd属性将读取管道传递给fdsrc。

  2. 使用tempfile模块创建临时文件,编写内容并使用filename属性将文件传递到filesink。

  3. Appsrc,但您需要连接到push-buffer和end-of-stream信号,从数据创建缓冲区。最好避免使用这个选项,因为你必须在python中进行读取,使用fdsrc / filesink会更有效,因为部分处理是在C中完成的。

答案 1 :(得分: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切换,fd source不太可能提供videoconvert / pixbufsink需要的那种输入。

相关问题