2013-05-30 34 views
2

我有一個用於Raspberry Pi的新相機插件。它還沒有video4linux的支持,但配備了一個小程序,吐出1080p的h264流。我已經證實了這項工作,並得到了它推動視頻與到stdout:在Raspberry Pi上用gstreamer從h264流中捕獲jpeg

raspivid -n -t 1000000 -vf -b 2000000 -fps 25 -o - 

我想處理此流,使得我最終採取一次一秒鐘的視頻快照。

由於它是1080p,我將需要使用rpi的硬件支持H264編碼。我相信gstreamer是唯一支持此功能的應用程序,所以使用ffmpeg或avconv的解決方案將無法工作。我已經使用了構建腳本在http://www.trans-omni.co.uk/pi/GStreamer-1.0/build_gstreamer做出的GStreamer和硬件H264編碼插件,並似乎工作:

[email protected]:~/streamtest# GST_OMX_CONFIG_DIR=/etc/gst gst-inspect-1.0 | grep 264 
... 
omx: omxh264enc: OpenMAX H.264 Video Encoder 
omx: omxh264dec: OpenMAX H.264 Video Decoder 

所以我需要構建一個GST-管道下水,負責就標準輸入視頻和吐出來每秒一次新鮮的jpeg。我知道我可以使用的GStreamer的「multifilesink」匯到這樣做,所以想出了下面簡短的腳本來運行它:

[email protected]:~/streamtest# cat test.sh 
#!/bin/bash 

export GST_OMX_CONFIG_DIR=/etc/gst 

raspivid -n -t 1000000 -vf -b 2000000 -fps 25 -o - | \ 
gst-launch-1.0 fdsrc fd=0 ! decodebin ! videorate ! video/x-raw,framerate=1/1 ! jpegenc ! multifilesink location=img_%03d.jpeg 

麻煩的是它不工作:GStreamer的只是坐在永遠在預卷狀態,永遠不會吐出我寶貴的jpeg。

[email protected]:~/streamtest# ./test.sh 
Setting pipeline to PAUSED ... 
Pipeline is PREROLLING ... 
[waits forever] 

在情況下,它是在GStreamer的-v標誌設置有用的輸出爲http://pastebin.com/q4WySu4L

任何人都可以解釋我做錯了嗎?

+0

我正在嘗試做同樣的事情。我還沒有嘗試過讓gstreamer工作,所以如果我有任何不同的結果,我會給它一個機會並回信。 – Respectech

+0

我也一直在gstreamer-devel名單上與人交談。看起來並不樂觀:我聽說raspivid的輸出缺乏gstreamer需要做出關於framerate的決定的時間戳。 請參閱http://gstreamer-devel.966125.n4.nabble.com/Capturing-jpegs-from-an-h264-stream-td4660254.html –

+0

可以通過修改raspivid源代碼來添加時間戳嗎?或者它是否必須在GPU級別發生? – Respectech

回答

2

我們終於找到了解決方案。我GStreamer的管道主要是正確的,但兩個問題相結合,以阻止它的工作:到H264幀它產生

  • 最近的GStreamer的版本有哪些停止處理untimestamped幀
  • 錯誤

    • raspivid不添加時間戳

    運行gstreamer的1.0版本(確保從頭開始構建&刪除先前嘗試的所有痕跡)並且問題消失。

    查看http://gstreamer-devel.966125.n4.nabble.com/Capturing-jpegs-from-an-h264-stream-tt4660254.html的郵件列表線程。

    +0

    您是否有可用於測試的Raspberry Pi的gstreamer二進制文件副本? – Respectech

    +0

    它與其他一些事物相關聯,所以我懷疑它會在旅程中倖存下來。但是我已經把構建腳本放在了pastebin上;這應該給你一個類似於我的工作構建。 http://pastebin.com/u8T7mE18 –