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,并且视频编解码器支持需要根据具体平台配置。