FFmpeg | 青训营

52 阅读3分钟

基本操作

强大的视频工具 ffmpeg [全局参数] {[输入文件参数] -i 输入文件地址} ... {[输出文件参数] 输出文件地址} ...


ffmpeg 最简单的使用就是用来 显示文件信息 。不用给输出,只是简单的写:

ffmpeg -i file_name

ffmpeg -i 'E:\下载\test.m4s'

转m4s文件为MP4文件

ffmpeg -i 'E:\下载\test.m4s' -codec copy D:\Output.mp4

播放视频

ffplay D:\Project\GoProject\input.mp4

GuGo操作

截取视频封面

ffmpeg -i input.mp4 -ss 00:00:01 -vframes 1 output.jpg

ffmpeg -i D:\Project\GoProject\input.mp4 -ss 00:00:01 -vframes 1 D:\Project\GoProject\output.jpg

为视频添加水印

ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4

ffmpeg -i D:\Project\GoProject\input.mp4 -i D:\Project\GoProject\watermark.png -filter_complex "overlay=10:10" D:\Project\GoProject\output.mp4

-filter_complex "overlay=10:10" 指定水印的位置。这里的10:10表示将水印放置在视频的左上角。您可以根据需要调整水印的位置。如果您希望水印位于视频的底部中间位置,可以使用overlay=W-w-10:H-h-10。

调整水印大小

ffmpeg -i D:\Project\GoProject\input.mp4 -i D:\Project\GoProject\watermark.png -filter_complex "[1:v]scale=w=100:h=100[wm];[0:v][wm]overlay=10:10" D:\Project\GoProject\output.mp4

go

package main

import (
    "fmt"
    "os/exec"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

// 定义 Video struct,用来存储视频信息
type Video struct {
    gorm.Model
    Name string
    Path string
}

func main() {
    // 连接数据库
    db, err := gorm.Open("mysql", "root:password@/database?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic("failed to connect to the database")
    }
    defer db.Close()

    // 创建表
    db.AutoMigrate(&Video{})

    // FFmpeg命令转换视频
    cmd := exec.Command("ffmpeg", "-i", "input.mp4", "-vcodec", "libx264", "-acodec", "aac", "-strict", "-2", "output.mp4")

    err = cmd.Run()
    if err != nil {
        fmt.Println(err)
    }

    // 在数据库里存储视频信息
    video := Video{Name: "output", Path: "output.mp4"}
    db.Create(&video)
}

exec.Command是Go语言中的一个函数,可以用于执行外部命令。您可以使用exec.Command来调用ffmpeg命令进行视频处理。exec.Command来执行ffmpeg命令:

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    // 命令和参数
    cmdArgs := []string{
        "-i", "input.mp4",
        "-i", "watermark.png",
        "-filter_complex", "overlay=10:10",
        "output.mp4",
    }

    // 创建命令
    cmd := exec.Command("ffmpeg", cmdArgs...)

    // 设置输出和错误输出
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    // 执行命令
    err := cmd.Run()
    if err != nil {
        fmt.Println("执行命令时出错:", err)
        return
    }

    fmt.Println("命令执行成功")
}

右上角

使用FFmpeg的overlay过滤器可以将水印叠加到视频上。在叠加时,可以通过设置水印的位置来定位它在视频中的位置。

overlay过滤器的语法如下:

overlay=x:y

其中,x和y是水印的坐标位置。x表示水印距离视频左上角的水平偏移量,y表示水印距离视频左上角的垂直偏移量。正值表示向右或向下的偏移,负值表示向左或向上的偏移。

例如,如果要将水印放置在视频的右上角,可以设置overlay参数为:

overlay=W-w-10:10

其中,W表示视频的宽度,w表示水印的宽度。这样设置后,水印将位于视频的宽度减去水印宽度再减去10个像素的位置,垂直方向距离视频顶部10个像素的位置。

请注意,如果水印的大小超过了视频的大小,水印将会被裁剪。

希望这能帮到你!如果你有任何其他问题,请随时问我。

管道

func stido() {
	// Command to generate cover using ffmpeg
	cmd := exec.Command("ffmpeg", "-i", "input.mp4", "-vframes", "1", "-an", "-f", "image2pipe", "-")

	// Create a bytes.Buffer to capture stdout
	var buf bytes.Buffer
	cmd.Stdout = &buf

	err := cmd.Run()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// buf.Bytes() now contains the image data. You can use it to write to a file or send it to an output stream.
	err = os.WriteFile("output_image.jpg", buf.Bytes(), 0644)
	if err != nil {
		fmt.Println("Error saving image:", err)
		return
	}

	fmt.Println("Cover image generated successfully!")
}