2013-03-25 207 views
3

我需要使用網絡攝像頭捕捉視頻併爲捕獲的每個視頻幀輸出單個圖像。將視頻轉換爲幀圖像序列

我一直在使用的GStreamer與multifilesink嘗試,如:

gst-launch v4l2src device=/dev/video1 ! video/x-raw-yuv,framerate=30/1 ! ffmpegcolorspace ! pngenc ! multifilesink location="frame%d.png" 

然而,這實際上並不輸出的每一幀,也就是說,如果我以30 fps 2秒記錄,我不明白60圖片。我假設這是因爲編碼不能那麼快,所以我需要另一種方法。

我想如果我有一個管道捕捉一個視頻,並有一個單獨的管道將該視頻轉換爲幀,但我對編解碼器不夠了解。我是否需要將視頻編碼爲像h264或mp4這樣的文件,然後再解碼它?

有沒有人有任何想法或建議?請記住,我需要能夠在代碼中執行此操作,而不是使用Adobe Premiere等應用程序。

謝謝!

回答

0

我必須提供的解決方案不使用gstreamer而是使用ffmpeg。我希望你也可以。

this forum post描述的那樣,你可以使用這樣的事情:

ffmpeg -i movie.avi frame%d.png 

獲得PNG/JPG圖片爲視頻的每一幀。
但是,根據您使用的輸入文件,您可能必須在運行ffmpeg之前將其轉換爲MPEG vid。

注:
如果你想在你的圖像文件名前導零,(在C的printf()爲5位數字,等)使用%05d代替:

ffmpeg -i movie.avi frame%05d.png 

輸出文件格式取決於文件擴展名,因此您可以使用.jpg.bmp,...而不是.png

1

你可以簡單地在裏面添加一個隊列是這樣的:

gst-launch v4l2src device=/dev/video1 ! video/x-raw-yuv,framerate=30/1 ! queue ! ffmpegcolorspace ! pngenc ! multifilesink location="frame%d.png" 

這應該確保視頻捕獲被允許在30 fps的運行,然後將其寫入 盤可以在它自己發生速度。請注意,如果您將此設置保留的時間太長,隊列將會增長到相當大的尺寸 。

1

我最終這樣做了兩部分。

將視頻寫入文件。

gst-launch v4l2src device=/dev/video2 ! video/x-raw-yuv,framerate=30/1 ! xvidenc ! queue ! avimux ! filesink location=test.avi 

後過程。

gst-launch-1.0 --gst-debug-level=3 filesrc location=test.avi ! decodebin ! queue ! autovideoconvert ! pngenc ! multifilesink location="frame%d.png" 
+0

這是一個錯字還是你使用gst-launch(0.x)作爲第一個命令,gst-launch-1.0作爲第二個命令? – 2017-05-10 11:50:26