Golang视频处理工具 - 基于FFmpeg的跨平台视频I/O、GIF生成及摄像头流封装

Golang视频处理工具 - 基于FFmpeg的跨平台视频I/O、GIF生成及摄像头流封装 Vidio 是一个基于 FFmpeg 的 Go 语言包,提供简单的视频输入/输出功能。它允许用户逐帧处理视频、访问网络摄像头以及创建视频。

安装方式:go get github.com/AlexEidt/Vidio

请看下面的示例,它遍历输入视频 input.mp4 的每一帧,并将其写入名为 output.mp4 的新视频中。input.mp4 的音频也会被复制过去。请注意,这只是一个简单的视频复制示例,但也可以在此处进行其他视频处理。

video, err := vidio.NewVideo("input.mp4")

options := vidio.Options{
	FPS: video.FPS(),
	Bitrate: video.Bitrate(),
    // 如果 "input.mp4" 没有任何音频,请不要包含 "Audio" 字段。
	Audio: "input.mp4",
}

writer, err := vidio.NewVideoWriter(
    "output.mp4",
    video.Width(),
    video.Height(),
    &options
)

defer writer.Close()

for video.Read() {
    writer.Write(video.FrameBuffer())
}

项目源码:GitHub - AlexEidt/Vidio: FFmpeg wrapper providing simple, cross-platform Video I/O, GIF Creation, and Webcam Streaming in Go.


更多关于Golang视频处理工具 - 基于FFmpeg的跨平台视频I/O、GIF生成及摄像头流封装的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang视频处理工具 - 基于FFmpeg的跨平台视频I/O、GIF生成及摄像头流封装的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Vidio这个包确实为Go语言中的视频处理提供了简洁的FFmpeg封装。以下是一个扩展示例,展示如何逐帧处理视频并添加简单的灰度滤镜效果:

package main

import (
    "github.com/AlexEidt/Vidio"
    "image/color"
)

func applyGrayscale(frame []uint8, width, height int) {
    for y := 0; y < height; y++ {
        for x := 0; x < width; x++ {
            idx := (y*width + x) * 3
            r := float64(frame[idx])
            g := float64(frame[idx+1])
            b := float64(frame[idx+2])
            
            // 灰度转换公式
            gray := uint8(0.299*r + 0.587*g + 0.114*b)
            
            frame[idx] = gray
            frame[idx+1] = gray
            frame[idx+2] = gray
        }
    }
}

func main() {
    video, err := vidio.NewVideo("input.mp4")
    if err != nil {
        panic(err)
    }
    
    options := vidio.Options{
        FPS:     video.FPS(),
        Bitrate: video.Bitrate(),
        Codec:   "libx264",
        Audio:   "input.mp4",
    }
    
    writer, err := vidio.NewVideoWriter(
        "output_grayscale.mp4",
        video.Width(),
        video.Height(),
        &options,
    )
    if err != nil {
        panic(err)
    }
    defer writer.Close()
    
    frameBuffer := make([]uint8, video.Width()*video.Height()*3)
    
    for video.Read() {
        copy(frameBuffer, video.FrameBuffer())
        applyGrayscale(frameBuffer, video.Width(), video.Height())
        writer.Write(frameBuffer)
    }
}

摄像头流处理的示例:

func captureWebcam() {
    // 打开默认摄像头
    cam, err := vidio.NewCamera(video.Width(), video.Height())
    if err != nil {
        panic(err)
    }
    defer cam.Close()
    
    options := vidio.Options{
        FPS:     30,
        Bitrate: 2000000,
        Codec:   "libx264",
    }
    
    writer, err := vidio.NewVideoWriter(
        "webcam_output.mp4",
        cam.Width(),
        cam.Height(),
        &options,
    )
    if err != nil {
        panic(err)
    }
    defer writer.Close()
    
    // 录制10秒
    frames := 30 * 10
    for i := 0; i < frames; i++ {
        if cam.Read() {
            writer.Write(cam.FrameBuffer())
        }
    }
}

GIF生成示例:

func createGIF() {
    video, err := vidio.NewVideo("input.mp4")
    if err != nil {
        panic(err)
    }
    
    // 创建GIF写入器
    gifWriter, err := vidio.NewGIFWriter(
        "output.gif",
        video.Width(),
        video.Height(),
        video.FPS(),
    )
    if err != nil {
        panic(err)
    }
    defer gifWriter.Close()
    
    // 提取前100帧制作GIF
    frameCount := 0
    for video.Read() && frameCount < 100 {
        gifWriter.Write(video.FrameBuffer())
        frameCount++
    }
}

这些示例展示了Vidio包的核心功能。需要注意的是,使用前需要确保系统已安装FFmpeg,并且视频编解码器支持需要根据具体平台配置。

回到顶部