这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
概述
ffmpeg是什么: FFmpeg既是一种音视频编解码工具,也是一组音视频解码开发套件。作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。
- FFmpeg的使用非常广泛, 在ffmpeg源码目录下,可以看到一些文件夹,都是以lib开头的,ffmpeg的基本组成主要就是这些模块,主要是AVFormat,AVCodec,AVFilter,AVDevice,AVutil等等, 了解这些就是了解ffmpeg的核心用途:
- libavutil包含用于简化编程的各种例程,包括随机数生成器,数据结构,数学例程,核心多媒体实用程序等等。
- libavcodec提供了解码和编码API,以及所有受支持的编解码器。
- libavformat提供了一个解复用和复用API,以及所有受支持的复用器和解复用器。实现了目前多媒体大多数媒体
封装格式,包括封装和解封装,例如mp4,flv,ts等,例如RTSP,RTMP网络协议封装,还支持扩展的
封装格式,扩展的格式要相应的第三方库 - libavdevice提供了一个接口,用于从输入设备(例如网络摄像头或输入音频)中抓取并渲染到输出设备,以及所
有受支持的输入和输出设备 - libswscale 高级别的图像转换API,提供了缩放和(原始像素)格式转换API,并具有多个缩放例程的高速/汇编
优化版本。 - libavfilter提供了音频,视频,字幕等滤镜处理框架
- libpostproc提供视频后处理例程
- libswresample提供了音频重采样,重矩阵化和样本格式转换API,以及许多高质量的优化例程
使用FFMPEG作为内核视频播放器:
Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音...
ffmpeg的Go SDK
由于需要使用 FFmpeg 第三方工具来完成视频截取第一帧作为封面并存储到本机, 所以运行之前需要预先安装 FFmpeg 到本机并配置好环境变量。
参考ffmpeg Documentation,事实上 FFmpeg 可以将 url 作为输入完成与将本地 mp4 文件作为输入等同的操作。
package main
import (
"fmt",
"os/exec"
)
func main() {
//本地输入视频文件路径
inputFile := "input.mp4"
//结果文件路径
outputFile := "output.mp4" // 设置 ffmpeg 的命令行参数
args := []string{"-i", inputFile, "-c", "copy", outputFile}
// 创建 *exec.Cmd
// 调用之前的需要环境变量的设置, 且exec依赖的独立环境
cmd := exec.Command("ffmpeg", args...) // 运行 ffmpeg 命令, 输出结果
if err := cmd.Run(); err != nil {
fmt.Println(err)
return
}
fmt.Println("转换成功")
}