从相机帧创建视频

huangapple go评论81阅读模式
英文:

Create video from camera frames

问题

我一直在尝试使用v4l2,并最终成功连接到了我的笔记本摄像头并设置了流媒体。

目前,我将帧保存为1.jpg2.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.jpg2.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 &quot;%02d.jpg&quot; -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(&quot;test.avi&quot;, 200, 100, 2)
checkErr(err)

// Create a movie from images: 1.jpg, 2.jpg, ..., 10.jpg
for i := 1; i &lt;= 10; i++ {
    data, err := ioutil.ReadFile(fmt.Sprintf(&quot;%d.jpg&quot;, i))
    checkErr(err)
    checkErr(aw.AddFrame(data))
}

checkErr(aw.Close())

huangapple
  • 本文由 发表于 2016年11月21日 15:57:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/40715272.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定