英文:
Create video from camera frames
问题
我一直在尝试使用v4l2,并最终成功连接到了我的笔记本摄像头并设置了流媒体。
目前,我将帧保存为1.jpg
,2.jpg
等等。
从基本层面考虑,我需要一个存储容器来存放这些JPEG图像,然后一个视频播放器按顺序运行容器中的内容,从而生成视频。
我假设视频格式将成为我的容器。
如何创建并写入一个视频容器呢?
英文:
I've been playing around with v4l2 and I finally managed to connect to my laptop's camera and set it to stream.
At the moment I save the frames as 1.jpg
, 2.jpg
etc.
Thinking on a basic level, I need a storage container for those jpegs and then a video player runs the container contents in sequence and I get video.
I assume the video format is going to be my container.
How do I create and write to one?
答案1
得分: 5
最简单的方法是将JPEG图像保存在一个MJPEG格式的视频文件中,MJPEG是一个由一系列JPEG图像组成的简单视频格式。
你可以使用不同的现成编码器将一系列JPEG图像转换为MJPEG(或其他格式)视频文件,比如ffmpeg。使用ffmpeg
,你可以使用以下命令完成:
ffmpeg -r 2 -i "%02d.jpg" -vcodec mjpeg test.avi
如果你想在Go语言中实现,你可以使用简单易用的github.com/icza/mjpeg
包(声明:我是该包的作者)。
让我们看一个例子,将JPEG文件1.jpg
、2.jpg
、...、10.jpg
转换为一个电影文件:
checkErr := func(err error) {
if err != nil {
panic(err)
}
}
// 视频尺寸:200x100像素,帧率:2
aw, err := mjpeg.New("test.avi", 200, 100, 2)
checkErr(err)
// 从图像创建电影:1.jpg、2.jpg、...、10.jpg
for i := 1; i <= 10; i++ {
data, err := ioutil.ReadFile(fmt.Sprintf("%d.jpg", i))
checkErr(err)
checkErr(aw.AddFrame(data))
}
checkErr(aw.Close())
英文:
The easiest would be to save your JPEG images in a video file of format MJPEG, which is a simple video format consisting a series of JPEG images.
You may turn to different ready-to-use encoders to turn a series of JPEG images into an MJPEG (or any other format) video file, such as ffmpeg. Using ffmpeg
, you could do it with the following command:
ffmpeg -r 2 -i "%02d.jpg" -vcodec mjpeg test.avi
If you want to do it in Go, you may use the dead-simple github.com/icza/mjpeg
package (disclosure: I'm the author).
Let's see an example how to turn the JPEG files 1.jpg
, 2.jpg
, ..., 10.jpg
into a movie file:
checkErr := func(err error) {
if err != nil {
panic(err)
}
}
// Video size: 200x100 pixels, FPS: 2
aw, err := mjpeg.New("test.avi", 200, 100, 2)
checkErr(err)
// Create a movie from images: 1.jpg, 2.jpg, ..., 10.jpg
for i := 1; i <= 10; i++ {
data, err := ioutil.ReadFile(fmt.Sprintf("%d.jpg", i))
checkErr(err)
checkErr(aw.AddFrame(data))
}
checkErr(aw.Close())
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论