1.亲手编译FFmpeg4.3并搭建开发环境
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模式,可以在编码的过程中直接改变码率的设置,在直播的场景中非常适用!可以做码率自适应的功能
Win10下搭建FFmpeg4.3的开发环境及初体验
下载
下载编译好的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
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 <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavdevice/avdevice.h>
#include <libavformat/version.h>
#include <libavutil/time.h>
#include <libavutil/mathematics.h>
}
定义相关宏,否则就报错,如error: #error missing -D__STDC_CONSTANT_MACROS”
extern "C"{
#ifdef __cplusplus
#define __STDC_CONSTANT_MACROS
#ifdef _STDINT_H
#undef _STDINT_H
#endif
#include <stdint.h>
#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:"<<version;
return a.exec();
}
四)运行程序,需要复制dll
将share文件下dll文件 copy to 该工程生成的exe文件所在的目录。
否则会“程序异常退出”。
Ubuntu编译FFmpeg
第一,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
Win10下亲手编译FFmpeg
系统环境:
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:__msys64msys2_shell.cmd,将其中的:
rem set MSYS2_PATH_TYPE=inherit
改为:
set MSYS2_PATH_TYPE=inherit
4.、重命名d:__msys64usrbinlink.exe 为C: msys64usrbinlink.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:__msys64usrbin目录中。
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:__msys64etcpacman.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/lib