2013-03-25 206 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