基本操作
强大的视频工具 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!")
}