3

我目前正在做:

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
4

2 回答 2

1

您可以使用几个选项:

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

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

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

于 2013-03-24T11:55:29.053 回答
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 需要的那种输入。

于 2013-03-28T21:10:11.663 回答