最近需要涉及一个视频格式转换的小任务,其中用到到了ffmpeg,记录一下学习笔记。
在学习的过程中发现了一个神的存在——雷神雷霄骅,可惜天妒英才呀。
百度百科
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、[Mac OS X](https://baike.baidu.com/item/Mac OS X/470629)等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 FFmpeg编码库可以使用GPU加速。
软件名称 | Fast Forward Mpeg | 开发商 | FFmpeg team |
---|---|---|---|
软件平台 | Linux、Windows、Mac OS X | 软件授权 | 开源 |
最近更新时间 | 2021年4月8日 | 软件版本 | 4.4 |
软件语言 | C语言、汇编 | 标准协议 | LGPL/GPL |
ffmpeg是一种高效的视频、音频转换器和采集器。ffmpeg通过-i选项指定任意数量输入文件,输入文件的类型可以是常规的音视频文件,也可以是管道、网络流、采集设备等,同时也可以生成任意数量的输出文件。
输入、输出文件的流类型、数量原则上是没有限制的,但会受到容器格式(container format)限制,输出流格式可以默认(自动)采用哪个输入流的格式,也可以通过-map指定采用哪个输入流格式。
-i指定的输入文件,以及文件的流,索引号都是从0开始,例如:2:3代表第三个输入文件中的第四个流。
原则上选项(option)应用于跟随的指定文件,因此,顺序很重要,您可以在命令行上多次使用相同的选项,但每次出现都应该应用于跟随的输入、输出文件。 此规则的例外是全局选项,应首先指定。不要混合输入文件和输出文件,首先指定所有输入文件,然后再指定所有输出文件。也不要混用属于不同文件的选项,所有选项仅适用于跟随的输入或输出文件。
构成FFmpeg主要有三个部分:四个作用不同的工具软件、可以供开发者使用的SDK、整个工程的源代码。
具体为:ffmpeg.exe, ffplay.exe, ffserver.exe和ffprobe.exe
组成 | 介绍 |
---|---|
ffmpeg.exe | 视频转码、转换器 |
ffplay.exe | 简单的音视频播放器 |
ffserver.exe | 流媒体服务器 |
ffprobe.exe | 简单的多媒体码流分析器 |
如果说上面的四个工具软件都是完成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。
库 | 介绍 |
---|---|
libavformat | 用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能 |
libavcodec | 用于各种类型声音/图像编码解码 |
libavutil | 包含一些公共的工具函数,如随机数生成器、数据结构、数字函数等功能 |
libswscale | 用于视频场景比例缩放、色彩空间和像素格式转换 |
libpostproc | 用于后期效果处理 |
libavfilter | 包含多媒体处理常用的滤镜功能 |
libavdevice | 用于音视频数据采集和渲染等功能的设备相关 |
libswresample | 用于音频重采样和格式转换等功能 |
无论是编译出来的可执行程序还是SDK,都是由这些源代码编译出来的。FFmpeg的源代码由C语言实现,主要在Linux平台上进行开发。FFmpeg不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以FFmpeg的工具和SDK的调用为主。到下一系列我们将专门研究如何编译源代码并根据源代码来进行二次开发。
FFmpeg官网
在官网上找到Download页面:
该页上可以下载FFmpeg的工具、库和源代码等。在选择"Windows Packages"下的Windows Builds后,会跳转到Windows版本的下载页面:
这里的话我选择Windows64的,然后是gpl的压缩包,可以看出,它是最大的。
下载后把它解压到对应的路径中:
然后在系统变量中添加一个FFMPEG_HOME:
最后在path中添加指向FFmpeg的bin路径:
验证是否安装成功(切换到命令行窗口,输入ffmpeg -version,出现如下界面就说明成功了):
功能
ffmpeg.exe用于视频的转码。
最简单的命令
ffmpeg -i input.avi -b:v 640k output.ts
该命令是将当前文件夹下的input.avi文件转换成output.ts文件,并将output.tx文件视频的码率设置为640kbps
ffmpeg -i [输入文件路径] -b:b [输出视频码率] [输出文件路径]
所有的参数都是以键值对的形式指定的。例如输入文件参数是"-i",而参数值就是文件路径;输出视频码率参数是"-b:v",而参数值是视频的码率值。但是注意位于最后面的输出路劲前面不包含参数名称。
命令 | 说明 |
---|---|
-h | 帮助 |
-i filename | 输入文件 |
-t duration | 设置处理时间,格式为hh:mm:ss |
-ss position | 设置起始时间,格式为hh:mm:ss |
-b:v bitrate | 设置视频码率 |
-b:a bitrate | 设置音频码率 |
-r fps | 设置帧率 |
-s wxh | 设置帧大小,格式为WxH |
-c:v codec | 设置视频编码器 |
-c:a codec | 设置音频编码器 |
-ar frep | 设置音频采样率 |
详细的参数设置可以访问FFmpeg官方文档进行学习
也可以直接参考雷神的FFmpeg参数中文详细解释
功能
用于播放的应用程序
简单的播放命令
播放test.mp4的命令为:
ffplay test.mp4
具体使用参考ffplay的快捷键以及选项
ffprobe是用于查看文件格式的应用程序。
详细使用可以参考官方说明
FFmpeg官网
FFmpeg官方文档
FFMPEG视音频编解码零基础学习方法(雷霄骅-雷神)
《基于 FFmpeg + SDL 的视频播放器的制作》课程的视频(雷霄骅-雷神)
之后几天扫地生将会结合springboot做一个实现一些音视频的格式转换的demo...同样的,也会以笔记的形式记录具体步骤。