FFmpeg到底是什么
简介
FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程。
现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接触FFMPEG的人学习;而且很多的例子程序编译通不过,极大地打消了学习的积极性。我自己在刚开始学习FFMPEG的时候也遇到了很大的困难。
为了帮助更多的人快速成为“大神”,我想总结一个学习FFMPEG的方法,方便大家循序渐进的学习FFMPEG。
PS:有不少人不清楚“FFmpeg”应该怎么读。它读作“ef ef em peg”
FFmpeg是什么
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。
这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。
项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。
FFmpeg的组成
构成FFmpeg主要有三个部分,
第一部分:工具
第一部分是四个作用不同的工具软件,分别是:ffmpeg.exe,ffplay.exe,ffserver.exe和ffprobe.exe。
ffmpeg.exe:音视频转码、转换器
ffplay.exe:简单的音视频播放器
ffserver.exe:流媒体服务器
ffprobe.exe:简单的多媒体码流分析器
第二部分:SDK
第二部分是可以供开发者使用的SDK,为各个不同平台编译完成的库。
如果说上面的四个工具软件都是完整成品形式的玩具,那么这些库就相当于乐高积木一样,我们可以根据自己的需求使用这些库开发自己的应用程序。这些库有:
libavcodec:包含音视频编码器和解码器
libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等功能
libavformat:包含多种多媒体容器格式的封装、解封装工具
libavfilter:包含多媒体处理常用的滤镜功能
libavdevice:用于音视频数据采集和渲染等功能的设备相关
libswscale:用于图像缩放和色彩空间和像素格式转换功能
libswresample:用于音频重采样和格式转换等功能
第三部分:源码
第三部分是整个工程的源代码,无论是编译出来的可执行程序还是SDK,都是由这些源代码编译出来的。
FFmpeg的源代码由C语言实现,主要在Linux平台上进行开发。
FFmpeg不是一个孤立的工程,它还存在多个依赖的第三方工程来增强它自身的功能。
在当前这一系列的博文/视频中,我们暂时不会涉及太多源代码相关的内容,主要以FFmpeg的工具和SDK的调用为主。
FFmpeg主要功能
多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
视频采集功能
ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。
视频格式转换功能
ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换 。
ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成视频网站所采用的flv格式。
视频截图功能
对于选定的视频,截取指定时间的缩略图。
视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅。
给视频加水印功能
使用ffmpeg 视频添加水印(logo)。
FFmpeg八大库
1.libavutil
核心工具库,最基础模块之一,其他模块都会依赖该库做一些基本的音视频处理操作
2. libavformat
文件格式和协议库,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的
3. libavcodec
编解码库,封装了Codec层,但是有一些codec是具备自己的License的,FFmpe不会默认添加像libx264、FDK-AAC、Lame等库,但是FFmpeg是一个平台,可以将其他的第三方codec以插件的方式添加进来,为开发者提供统一接口
4.libavfilter
音视频滤镜库,该模块包含了音频特效和视频特效的处理,在使用FFmpeg的API进行编解码的过程中,可以使用该模块高效的为音视频数据做特效处理
5. libavdevice
输入输出设备库,比如需要编译出播放声音或者视频的工具ffplay,就需要确保该模块是打开的,同事也需要libsdl的预先编译,该设备模块播放声音和视频都又是使用libsdl库
6.libswresample
用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换
7.libswscale
该模块用于图像格式转换,可以将YUV的数据转换为RGB的数据
8.libpostproc
该模块用于进行后期处理,当我们使用filter的时候,需要打开这个模块,filter会用到这个模块的一些基础函数
比较老的ffmpeg还会编译出avresamle模块,也是用于对音频原始出具进行重采样的,但是已经被废弃,推荐使用libswresample替代
另外,库里还可以包含对H.264/MPEG-4 AVC视频编码的X264库,是最常用的有损视频编码器,支持CBR、VBR模式,可以在编码的过程中直接改变码率的设置,在直播的场景中非常适用!可以做码率自适应的功能
下载
下载编译好的Windows版本:http://ffmpeg.zeranoe.com/builds/
选择版本:4.3.1
选择OS: Win-64位
选择库: Dev、Static、Shared
-----------------------------------------
视频中的地址已经无法打开,我将ffmepg4.3.1的开发包和源码上传到了百度云:
链接:https://pan.baidu.com/s/1-3xSO6ytyQLlSId0Xiak4w
提取码:fyxy
------------------------------------------
安装
配置PATH环境变量
验证,开始使用
QT + FFMPEG 开发环境搭建
步骤简要
step1: 下载FFmpeg相应的动态库文件和程序执行所依赖的.dll文件。
step2: 将动态库所对应的头文件和动态库文件加入工程
step 3: 将dll文件copy到.exe文件所对应的目录下。
下载FFMpeg对应的动态库和DLL文件
-----------------------------------------
视频中的地址已经无法打开,我将ffmepg4.3.1的开发包和源码上传到了百度云:
链接:https://pan.baidu.com/s/1-3xSO6ytyQLlSId0Xiak4w
提取码:fyxy
------------------------------------------
1 下载地址:(FFmpeg4.3.1)
开发环境为win10 64bit +QT5.9.8 ,需下载window 32 bit对应的shared文件(包含dll文件)和Dev文件(包含动态库和include的文件以及examples)。
注意window-64bit的开发库时,提示 “xxx undefined reference ”。.
step 2 :将动态库和头文件加入project
将下载的dev文件解压,文件名改为ffmpeglib,并copy到工程所在的目录
一)加入头文件
INCLUDEPATH += $$PWD/ffmpeg/include
二)加入动态库文件
LIBS += $$PWD/ffmpeg/lib/avcodec.lib \
$$PWD/ffmpeg/lib/avdevice.lib \
$$PWD/ffmpeg/lib/avfilter.lib \
$$PWD/ffmpeg/lib/avformat.lib \
$$PWD/ffmpeg/lib/avutil.lib \
$$PWD/ffmpeg/lib/postproc.lib \
$$PWD/ffmpeg/lib/swresample.lib \
$$PWD/ffmpeg/lib/swscale.lib
三)开始写code
包含头文件,注意QT为C++开发环境,FFMpeg用的是C 开发的,在CPP导入C的特性,需加关键词“ extern “C”“
extern "C"{
#include
#include
#include
#include
#include
#include
#include
}
定义相关宏,否则就报错,如error: #error missing -D__STDC_CONSTANT_MACROS”
extern "C"{
#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS
#ifdef _STDINT_H
#undef _STDINT_H
#endif
#include
#endif
}
添加如下code,若能成功输出ffmpeg version信息,则代表开发环境搭建成功。
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
qDebug()<< avcodec_configuration();
unsigned version = avcodec_version();
QString ch = QString::number(version,10);
qDebug()<< "version:"< return a.exec(); } 四)运行程序,需要复制dll 将share文件下dll文件 copy to 该工程生成的exe文件所在的目录。 否则会“程序异常退出”。 第一,apt安装ffmpeg,简单明了 源码方式安装ffmpeg,麻烦,还要手动下载安装。。 开门见山,三行命令。 第一步:添加源。 sudo add-apt-repository ppa:djcj/hybrid 第二步:更新源。 sudo apt-get update 第三步:下载安装。 sudo apt-get install ffmpeg 如上,就安装好了,打完收工~~~ 第二,源码安装ffmpeg,深入了解 1.下载源码:git clone git://source.ffmpeg.org/ffmpeg.git 安装依赖库: sudo apt-get update -qq && sudo apt-get -y install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev 2.生成配置:./configure --enable-shared --prefix=/usr/local/ffmpeg/ --disable-x86asm 旧版本可以使用--disable-yasm禁用汇编语言,新版本支持enable-x86asm / --disable-x86asm instead.启用/禁用汇编加速 注意:WARNING: The --disable-yasm option is only provided for compatibility and will be removed in the future. Use --enable-x86asm / --disable-x86asm instead.启用/禁用汇编加速 3. make && make install 4 版本查询 /usr/local/ffmpeg/lib/pkgconfig目录下保存每个模块的版本号 libavcodec.pc libavdevice.pc libavfilter.pc libavformat.pc libavutil.pc libswresample.pc libswscale.pc pkg-config libavdevice --modversion 查询的是当前系统目录下libavdevice的版本号,默认是从/usr/lib/pkgconfig, /usr/local/lib/pkgconfig,/usr/share/pkgconfig/开始查询libavdevice.pc, 如果需要优先找到源码编译的版本号,需要进行如下的设置 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig;$PKG_CONFIG_PATH 5 各个版本下载网址 http://ffmpeg.org/releases/ 6 添加额外库 1、yasm(libx264需要依赖yasm) sudo apt-get install yasm 2、libx264 sudo apt-get install libx264-dev 3、libfaac sudo apt-get install libfaac-dev 4、libmp3lame sudo apt-get install libmp3lame-dev 5、libtheora sudo apt-get install libtheora-dev 6、libvorbis sudo apt-get install libvorbis-dev 7、libxvid sudo apt-get install libxvidcore-dev 8、libxext sudo apt-get install libxext-dev 9、libxfixes sudo apt-get install libxfixes-dev ./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-libxvid --enable-x11grab --enable-libvorbis 系统环境: Windows 10 64位 需要安装的软件和工具: Visual Studio 2015 With Update 3 MSYS2 + mingw(gcc) YASM 1、MSYS2 MSYS2内部也是集成了MINGW,采用Pacman管理软件包,使用非常方便。 1、下载:http://msys2.github.io. 选择第二个:msys2-x86_64-20160921.exe msys2-x86_64-20161025.exe, msys2-x86_64-20180531.exe 注意版本:不要下载新版本,否则编译过程中容易报错。 下载地址:https://sourceforge.net/projects/msys2/files/Base/x86_64/ 下载后,默认安装到d:\__msys64 2、安装后,到msys2窗口执行, 安装编译程序: pacman -S make gcc diffutils pkg-config pacman -S make gcc diffutils pkg-config # 可能需要多尝试几次,我安装的时候gcc更新了几次才成功,这个更新过程支持断点续传。 # 如果不安装pkg-config,运行./configure的时候,会出现如下warning # WARNING: pkg-config not found, library detection may fail. 3、编辑d:\__msys64\msys2_shell.cmd,将其中的: rem set MSYS2_PATH_TYPE=inherit 改为: set MSYS2_PATH_TYPE=inherit 4.、重命名d:\__msys64\usr\bin\link.exe 为C: \msys64\usr\bin\link.bak, 避免和MSVC 的 link.exe抵触。 2、YASM 1.、下载地址:http://yasm.tortall.net/Download.html,下载其64位版本Win64 .exe (64 位 Windows 通用)。 2、下载后,将yasm-1.3.0-win64.exe 改名为yasm.exe,并放置于 d:\__msys64\usr\bin\目录中。 3、ffmpeg源码: 下载ffmpeg代码,版本:release4.3.1, http://www.ffmpeg.org/download.html 4、更新msys64,并改用国内镜像 # 更新mingw-w64-x86_64-toolchain工具链 pacman -S mingw-w64-x86_64-toolchain 注意:速度慢的堪比蜗牛。 [D:\__msys64\etc\pacman.d] 办法:改用国内的镜像。 mirrorlist.mingw32 ## ## 32-bit Mingw-w64 repository mirrorlist ## ## Primary ## msys2.org Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/ Server = http://repo.msys2.org/mingw/i686 Server = http://downloads.sourceforge.net/project/msys2/REPOS/MINGW/i686 Server = http://www2.futureware.at/~nickoe/msys2-mirror/i686/ mirrorlist.mingw64 ## ## 64-bit Mingw-w64 repository mirrorlist ## ## Primary ## msys2.org Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/ Server = http://repo.msys2.org/mingw/x86_64 Server = http://downloads.sourceforge.net/project/msys2/REPOS/MINGW/x86_64 Server = http://www2.futureware.at/~nickoe/msys2-mirror/x86_64/ mirrorlist.msys ## ## MSYS2 repository mirrorlist ## ## Primary ## msys2.org Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/ Server = http://repo.msys2.org/msys/$arch Server = http://downloads.sourceforge.net/project/msys2/REPOS/MSYS2/$arch Server =http://www2.futureware.at/~nickoe/msys2-mirror/msys/$arch/ 5、下载x264,并编译 请下载这个版本:x264-snapshot-20170208-2245-stable.tar.bz2 http://download.videolan.org/pub/videolan/x264/snapshots/ ./configure --prefix=/usr/local/x264 --enable-shared --disable-thread --disable-avs make make install Windows msys2编译ffmpeg找不到库路径问题之解决方法 FFMpeg支持MinGW以及visual studio编译,两者的configure选项在指定链接库的路径时有差异: msvc: --extra-ldflags=-LIBPATH:../builds/lib mingw: --extra-ldflags=-L../builds/lib 6、编译ffmpeg 开始菜单--->VS 2015--->vs2015 x86/x64本地命令行工具 #进入下载ffmpeg目录中, 比如:cd /e/work/ffmpeg/ffmpeg4.3.1 ./configure --toolchain=msvc --enable-yasm --enable-asm --enable-shared --disable-static --prefix=/usr/local/ffmpeg431 【注意:由于编码问题,请不要直接复制这个命令行,而是自己手工写】 make make install ./configure --toolchain=msvc --enable-yasm --enable-asm --enable-shared --disable-static --enable-libx264 --extra-cflags="-I/usr/local/x264/include" --extra-ldflags=-LIBPATH:c:/x264/lib 坑: --extra-cflags="-I/usr/local/x264/include" --extra-ldflags="-L/usr/local/x264/lib" --extra-ldflags=-LIBPATH:c:/x264/libUbuntu编译FFmpeg
Win10下亲手编译FFmpeg