FFmpeg入门详解之54:搭建环境ffmpeg

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平