2013-03-23 112 views
3

我目前做的:在使用GStreamer的Python中,如何使用文件對象作爲輸入源?

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 
+0

我不太明白你的目標。你是否希望從網絡腳本中調用GStreamer? – 2013-03-24 00:47:31

+0

@MultimediaMike,是的。最終用戶正在向網站上傳視頻,我想將該文件對象傳遞給appsrc(或任何適當的元素)以利用該文件。該文件尚未保存到硬盤,所以我沒有路徑。 – Raj 2013-03-24 00:52:11

+0

因此,這個文件將被保留在整個過程的內存中?視頻文件可以變得相當大。你確定你不想將它存儲在臨時文件中嗎?應該可以從內存中進行編碼,但是我想知道整個架構。是否有文件上傳大小限制? – 2013-03-24 03:55:37

回答

1

有幾個選項可以使用:

  1. 管,打造一個集管道,寫入文件內容寫入通道和使用fd屬性將讀取管道傳遞給fdsrc。

  2. 使用tempfile模塊創建臨時文件,寫入內容並使用filename屬性將文件傳遞到filesink。

  3. Appsrc,但您需要連接到推送緩衝區和流結束信號,從數據創建緩衝區。這是更好地避免這個選項,你必須做在Python中的閱讀,這是更有效地使用fdsrc /文件接收作爲處理的部分在C.

+0

我的(MVC風格)webframework有一個事務管理器,它可以自動將上傳的文件放入一個臨時目錄(我無法訪問臨時文件的名稱/路徑)。因此,我留下了一個文件,我可以'.read()' – Raj 2013-03-24 17:55:24

+0

我想看一個代碼示例來做你的第一個建議和第三個建議。我希望堅持使用'descr'和'Gst.parse_lauch(descr)'格式,因爲這是我已經完成所有代碼設置的方式。並且管道創建的重做方法可能導致許多其他問題 – Raj 2013-03-24 18:00:44

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源將不太可能提供的那種投入的那videoconvert/pixbufsink需要。

相關問題