[FFmpeg](https://www.ffmpeg.org/)是视频处理最常用的开源软件。
它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),也是许多音频和视频格式的标准编码/解码实现。
FFmpeg 本身是一个庞大的项目,包含许多组件和库文件,最常用的是它的命令行工具。本文介绍 FFmpeg 命令行如何处理视频,比桌面视频处理软件更简洁高效。
如果你还没安装,可以根据[官方文档](https://www.ffmpeg.org/download.html)先完成安装。
### 1.1 容器
视频文件本身其实是一个容器(container),里面包括了视频和音频,也可能有字幕等其他内容。
常见的容器格式有以下几种。一般来说,视频文件的后缀名反映了它的容器格式。
* MP4
* MKV
* WebM
* AVI
下面的命令查看 FFmpeg 支持的容器。
```
ffmpeg -formats
```
### 1.2 编码格式
视频和音频都需要经过编码,才能保存成文件。不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。
常用的视频编码格式如下。
> H.262
> H.264
> H.265
上面的编码格式都是有版权的,但是可以免费使用。此外,还有几种无版权的视频编码格式。
> VP8
> VP9
> AV1
常用的音频编码格式如下。
> MP3
> AAC
上面所有这些都是有损的编码格式,编码后会损失一些细节,以换取压缩后较小的文件体积。无损的编码格式压缩出来的文件体积较大,这里就不介绍了。
下面的命令可以查看 FFmpeg 支持的编码格式,视频编码和音频编码都在内。
```
ffmpeg -codecs
```
### 1.3 编码器
编码器(encoders)是实现某种编码格式的库文件。只有安装了某种格式的编码器,才能实现该格式视频/音频的编码和解码。
以下是一些 FFmpeg 内置的视频编码器。
* libx264:最流行的开源 H.264 编码器
* NVENC:基于 NVIDIA GPU 的 H.264 编码器
* libx265:开源的 HEVC 编码器
* libvpx:谷歌的 VP8 和 VP9 编码器
* libaom:AV1 编码器
音频编码器如下。
* libfdk-aac
* aac
下面的命令可以查看 FFmpeg 已安装的编码器。
```
ffmpeg -encoders
```
## 二、FFmpeg 的使用格式
FFmpeg 的命令行参数非常多,可以分成五个部分。
```
ffmpeg {1} {2} -i {3} {4} {5}
```
上面命令中,五个部分的参数依次如下。
* 全局参数
* 输入文件参数
* 输入文件
* 输出文件参数
* 输出文件
参数太多的时候,为了便于查看,ffmpeg 命令可以写成多行。
> $ ffmpeg \\
> \[全局参数\] \\
> \[输入文件参数\] \\
> \-i \[输入文件\] \\
> \[输出文件参数\] \\
> \[输出文件\]
下面是一个例子。
```
ffmpeg \-y \ # 全局参数-c:a libfdk_aac -c:v libx264 \ # 输入文件参数-i input.mp4 \ # 输入文件-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数output.webm # 输出文件
```
上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 Vorbis。
如果不指明编码格式,FFmpeg 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子。
```
ffmpeg -i input.avi output.mp4
```
## 三、常用命令行参数
FFmpeg 常用的命令行参数如下。
* \-c:指定编码器
* \-c copy:直接复制,不经过重新编码(这样比较快)
* \-c:v:指定视频编码器
* \-c:a:指定音频编码器
* \-i:指定输入文件
* \-an:去除音频流
* \-vn: 去除视频流
* \-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
* \-y:不经过确认,输出时直接覆盖同名文件。
## 四、常见用法
下面介绍 FFmpeg 几种常见用法。
### 4.1 查看文件信息
查看视频文件的元信息,比如编码格式和比特率,可以只使用-i参数。
```
ffmpeg -i input.mp4
```
上面命令会输出很多冗余信息,加上-hide\_banner参数,可以只显示元信息。
1$ ffmpeg -i input.mp4 -hide_banner
### 4.2 转换编码格式
转换编码格式(transcoding)指的是, 将视频文件从一种编码转成另一种编码。比如转成 H.264 编码,一般使用编码器libx264,所以只需指定输出文件的视频编码器即可。
```
ffmpeg -i [input.file] -c:v libx264 output.mp4
```
下面是转成 H.265 编码的写法。
```
ffmpeg -i [input.file] -c:v libx265 output.mp4
```
### 4.3 转换容器格式
转换容器格式(transmuxing)指的是,将视频文件从一种容器转到另一种容器。下面是 mp4 转 webm 的写法。
```
ffmpeg -i input.mp4 -c copy output.webm
```
上面例子中,只是转一下容器,内部的编码格式不变,所以使用-c copy指定直接拷贝,不经过转码,这样比较快。
### 4.4 调整码率
调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。
```
ffmpeg \-i input.mp4 \-minrate 964K -maxrate 3856K -bufsize 2000K \output.mp4
```
### 4.5 改变分辨率(transsizing)
下面是改变视频分辨率(transsizing)的例子,从 1080p 转为 480p 。
```
ffmpeg \-i input.mp4 \-vf scale=480:-1 \output.mp4
```
### 4.6 提取音频
有时,需要从视频里面提取音频(demuxing),可以像下面这样写。
```
ffmpeg \-i input.mp4 \-vn -c:a copy \output.aac
```
上面例子中,-vn表示去掉视频,-c:a copy表示不改变音频编码,直接拷贝。
### 4.7 添加音轨
添加音轨(muxing)指的是,将外部音频加入视频,比如添加背景音乐或旁白。
```
ffmpeg \-i input.aac -i input.mp4 \output.mp4
```
上面例子中,有音频和视频两个输入文件,FFmpeg 会将它们合成为一个文件。
### 4.8 截图
下面的例子是从指定时间开始,连续对1秒钟的视频进行截图。
```
ffmpeg \-y \-i input.mp4 \-ss 00:01:24 -t 00:00:01 \output_%3d.jpg
```
如果只需要截一张图,可以指定只截取一帧。
```
ffmpeg \-ss 01:23:45 \-i input \-vframes 1 -q:v 2 \output.jpg
```
上面例子中,-vframes 1指定只截取一帧,-q:v 2表示输出的图片质量,一般是1到5之间(1 为质量最高)。
### 4.9 裁剪
裁剪(cutting)指的是,截取原始视频里面的一个片段,输出为一个新视频。可以指定开始时间(start)和持续时间(duration),也可以指定结束时间(end)。
```
ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]$ ffmpeg -ss [start] -i [input] -to [end] -c copy [output]
```
下面是实际的例子。
```
ffmpeg -ss 00:01:50 -i [input] -t 10.5 -c copy [output]$ ffmpeg -ss 2.5 -i [input] -to 10 -c copy [output]
```
上面例子中,-c copy表示不改变音频和视频的编码格式,直接拷贝,这样会快很多。
### 4.10 为音频添加封面
有些视频网站只允许上传视频文件。如果要上传音频文件,必须为音频添加封面,将其转为视频,然后上传。
下面命令可以将音频文件,转为带封面的视频文件。
```
ffmpeg \-loop 1 \-i cover.jpg -i input.mp3 \-c:v libx264 -c:a aac -b:a 192k -shortest \output.mp4
```
上面命令中,有两个输入文件,一个是封面图片cover.jpg,另一个是音频文件input.mp3。-loop 1参数表示图片无限循环,-shortest参数表示音频文件结束,输出视频就结束。
## 五、参考链接
[FFmpeg libav tutorial](https://github.com/leandromoreira/ffmpeg-libav-tutorial#chapter-3---transcoding)
[Digital video introduction](https://github.com/leandromoreira/digital_video_introduction/blob/master/encoding_pratical_examples.md#split-and-merge-smoothly)
[FFmpeg encoding and editing course](http://slhck.info/ffmpeg-encoding-course/)
[Making Slideshows w/FFMpeg](https://dragonquest64.blogspot.com/2019/10/making-slideshows-wffmpeg.html)
[The Complete Guide for Using ffmpeg in Linux](https://itsfoss.com/ffmpeg/)
[Adding subtitles to your videos the easy way](https://bernd.dev/2020/04/adding-subtitles/)
到此这篇关于FFmpeg视频处理入门教程(新手必看)的文章就介绍到这了,更多相关FFmpe 入门内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
## wav转换MP3
~~~
system('ffmpeg -i test.wav -f mp3 -acodec libmp3lame '.public_path('temp/output2.mp3'));
~~~
> 需要安装libmp3lame编码库
## pcm转换MP3
~~~
system('ffmpeg -y -f s16be -ac 2 -ar 8000 -acodec pcm_s16le -i '.public_path($wav_file).' '. public_path($mp3_file));
~~~
- 后端
- composer
- composer配置国内镜像
- composer安装及设置2
- PHP
- 贝塔SG11加密
- 申请KEY
- 开始加密
- php 中连接tcp服务的三种方式
- php websocket 教程
- editor内容转换数组
- 使用正则判断中文维吾尔文
- PHP常用函数总结
- 常用助手函数
- 通过Imagick把pdf转换图片
- 维吾尔语基本区转换扩展区
- php GD库生成一个由文字和图片生成新的图片
- aes加密
- php数组函数 -- array_column,array_multisort 实现二维数组排序
- PHP操作Excel
- php更新内容
- 辅助查询(*)
- 【时间】操作
- 时间函数例子
- Date/Time 函数(不包含别名函数)
- php网络相关
- HTTP请求的返回值含义说明
- 使用php语言开发一个类似数据库操作的文件表类
- pinyin
- 维吾尔语基本区转换扩展区(2)
- php获取当前环境的信息
- laravel
- laravel 队列的使用
- laravel 自定义助手函数
- laravel seeder的使用
- laravel项目从git下载命令
- laravel 多个数据库配置
- laravel 填充假数据
- laravel 动态路由
- laravel 自定义 validate 响应
- laravel 创建追加字段的模拟访问器
- laravel 线上环境的数据库更改或添加字段
- laravel 模型查询按照whereIn排序
- laravel 使用 workerman 通过TCP 文件传输功能
- laravel api Header添加Accept头
- Laraval IDE 自动补全插件 laravel-ide-helper
- laravel 网站后台
- laravel 设置路由
- laravel-第三方composer包
- laravel 开发技巧
- laravel 昨天,今天时间
- 使用宝塔计划任务启动laravel调度器
- laravel结合workerman第二节
- Laravel - 上传多个文件
- 查询聊天好友列表
- 事件系统 event, listener
- laravel 安装 laravel-modules
- 自定义求看守器-toekn
- laravel限流
- 使用 Laravel api Resource 类时自定义分页信息
- Laravel php artisan命令大全
- 验证器
- workerman 创建wss服务
- 架构师必须知道的26项PHP安全实践
- python
- Python读取文件代码块已经备好,用的时候光拿(建议收藏)
- Python常用库大全
- api 签名验证
- git
- git命令
- 十分钟学会git基础
- Git代码同时上传到GitHub和Gitee(码云)
- Git - 多人协同开发利器,团队协作流程规范与注意事项
- 删除远程仓库的文件
- github查询方法
- 错误
- 解除项目git版本控制
- linux
- sentos安装supervisor
- PHP怎么守护进程运行php脚本
- 600条最强Linux命令总结
- centos开启防火墙、开放指定端口
- 前端
- vue
- vue2发布之前的config简单配置
- vue2安装scss命令
- vue2父子组件之间双向数据绑定
- 国际化双语--安装VueI18n
- vue3-setup 组件传参(defineProps、defineEmits、defineExpose
- Vue3 新写法速览:十分钟内轻松get
- 关于vue的外连接
- watch讲解
- computed
- webpack 打包后生成很多小文件怎么优化?
- vue2 vue.config.js常见配置和打包部署测试
- 小程序
- 小程序长期订阅消息
- 小程序自定义TabBar后如何实现keep-alive
- 收藏的html和css和js
- CSS 省略号(单行省略号、多行省略号)
- UyghurInput_a.js
- font.css
- 漂亮按钮样式
- clock.html
- css
- scroll css样式
- CSS流动布局-页面自适应
- css grid布局
- 禁止wap页面调整字体大小
- CSS @media 和 min-width/max-width
- 网站变灰是怎么实现的
- 瀑布流实现方式
- javascript
- SortableJS拖动排序
- wondow scroll滚动到上边
- 原生js插入HTML元素
- Konva.js —— 像操作DOM一样操作canvas
- 通过canvas合并俩个图片
- js scroll更多加载
- js 实现复制功能
- js判断安卓和苹果或者微信
- 浏览器打开控制台禁止
- 原生js一些dom操作
- js http客户端集合
- fetch
- axios
- canvas 点钟
- layer dialog
- jquery 和 laravel ajax全局配置
- layui 获取select的自定义参数
- konva.js中文开发文档
- js 大文件分片上传
- js监听网络状态实现断网重连后自动刷新页面
- js生成video缩略图
- JS获取当前系统电量情况
- uniapp
- uni-app swiper数量过多时卡顿优化方案
- uniapp 帖子集合
- 微信wap
- wap分享朋友和朋友圈
- wap 手机页面微信支付
- JsSdk微信公众号支付
- 通用各种小知识
- 正则表达式
- JS正则匹配过滤字符串中的html标签及html标签内的内容
- 判断维吾尔文输入
- 正则表达式符号
- 正则表达式练习
- 百度网盘不限速下载助手
- 解决VSCode下载慢或下载失败的问题
- 性能测试 使用Apache的ab测试工具
- nginx从入门到精通
- nginx
- Nginx 是怎么禁止访问php的 ?
- 宝塔面板
- supervisor
- 卸载宝塔
- redis
- redis实用笔记
- redis入门到精通
- phpredis
- redis数据库基础
- PHP对Redis的基本操作
- ffmpeg
- 合并多个音视
- 获取音视时长
- FFmpeg视频处理入门教程(新手必看)
- 外连接
- 安装
- PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法
- Linux安装ffmpeg
- docker
- 服务实现
- docker基本命令
- rewrite笔记
- 别人笔记链接
- 计算机常用知识
- 二进制1-10
- 斐波那契数列
- mysql
- 高性能高可用的MySQL,得从各种规范开始
- 读写分离配置
- 重要外连接,前端/ 后端/数据库等等
- 关于程序必须收藏的文章链接集合
- markdown
- 一篇文章讲清楚markdown