写在前面:

我只用png和jpg图片生成了avi格式的视频,还不懂mp4怎么生成。我想我应该去看ffmpeg,不过opencv的VideoWriter应该能生成mp4视频的啊,fourcc不对?如何控制生成的视频时长?作为一名前端,还不懂。

版本信息:

gocv version: 0.29.0

opencv lib version: 4.5.4

我需要这些:

丑陋的代码:

package main

import (
	"fmt"
	"image"
	"image/png"
	"os"

	"gocv.io/x/gocv"
)

func main() {
	filename := "video01.avi" // 尾巴要有数字,不知道哪里少了个库
	fourcc := "MJPG"
	bfs := float64(25)
	frameWidth := 512
	frameHeight := 512
	videoWriter, err := gocv.VideoWriterFile(filename, fourcc, bfs, frameWidth, frameHeight, true)

	// 本地图片文件数组
	imgs := [...]string{"static/test.jpg", "static/test.png"}

	if err != nil {
		fmt.Println("视频写文件错误")
		return
	}
	defer videoWriter.Close()

	if !videoWriter.IsOpened() {
		fmt.Println("打开视频写文件失败")
	}

	// 写本地jpeg图片
	mat := gocv.IMRead(imgs[0], gocv.IMReadColor)
	// Resize的作用就是图片和视频尺寸不一致的时候弄到一致,至于怎么保持图片比例还不懂
	gocv.Resize(mat, &mat, image.Point{X: frameWidth, Y: frameHeight}, 0, 0, gocv.InterpolationArea)
	gocv.CvtColor(mat, &mat, gocv.ColorBGRToRGBA)
	defer mat.Close()

	for i := 0; i < 100; i++ {
		videoWriter.Write(mat)
	}

	// 写本地png图片 if path.Ext(imgs[i]) == string(gocv.PNGFileExt) // 判断.png
	file, _ := os.Open(imgs[1])
	defer file.Close()
	img, _ := png.Decode(file)
	mat, _ = gocv.ImageToMatRGB(img)
	// Resize的作用就是图片和视频尺寸不一致的时候弄到一致,至于怎么保持图片比例还不懂
	gocv.Resize(mat, &mat, image.Point{X: frameWidth, Y: frameHeight}, 0, 0, gocv.InterpolationArea)

	gocv.CvtColor(mat, &mat, gocv.ColorBGRToRGBA)
	defer mat.Close()

	for i := 0; i < 100; i++ {
		videoWriter.Write(mat)
	}

	fmt.Println("ok")
}

// 网络图片转Mat
// func saveImageFromURL(imgURL string) (gocv.Mat, error) {
// 	dummy := gocv.Mat{}
// 	resp, err := http.Get(imgURL)
// 	if err != nil {
// 		return dummy, err
// 	}
// 	content, _ := ioutil.ReadAll(resp.Body)
// 	if resp.StatusCode > 202 {
// 		return dummy, errors.New(string(content))
// 	}
// 	defer resp.Body.Close()
// 	mat, _ := gocv.IMDecode(content, gocv.IMReadColor)
// 	if m.Empty() {
// 		return dummy, fmt.Errorf("invalid image content from URL: `%s`", imgURL)
// 	}
// 	return mat, nil
// }