从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 原文地址:http://blog.yundiantech.com/?log=blog&id=7

==================================================

音视频开发中最常做的就是编解码的操作了,以H.264为例:如果想要自己实现编码h.264,需要对H.264非常的了解,首先需要查看H.264的文档,这个文档好像说是三百多页(本人并没有看过)。 想到这,你还写的下去么。 算了吧!   好在H264的编码器,有人已经写好了,而且还提供了源代码。主流的h264编码器有 x264 t264等。 

    因为我们不做研究,也不会去写编码器,因此完全没有必要去看H.264的手册。我们要做的只需要知道有这么个东西,在需要的时候 稍微了解一下h264的数据格式。最后当然是直接使用别人写好的编码器来编码了。 一个好的程序猿就要做到尽量使用现成的东西做开发,减少精力,减少时间,甚至提高稳定性。

    前面提到的t264和x264都是编解码h.264用的库。本人通常是使用x264来做。但对于新手来说,由于对h.264不是很了解,因此在使用x264上有点困难,出了问题通常不知道如何解决。并且这些库都只能编码一种格式,所以一开始不推荐使用。 而是推荐使用FFMPEG。

    

    FFMPEG是一个集成了各种编解码器的库,可以说是一个全能型的工具,从视频采集、视频编码到视频传输(包括RTP、RTCP、RTMP、RTSP等等协议)都可以直接使用FFMPEG来完成,更重要的一点FFMPEG是跨平台的,Windows、Linux、Aandroid、IOS这些主流系统通吃。因此初期强烈建议直接使用FFMPEG。

======================================================

那么开始记录下如何在windows下ffmpeg的使用,前面有相应的文章关于在linux下的配置和简单使用。

!!!!开始使用FFMPEG

一、FFMPEG获取:(这里的部分,我是按原博客使用的环境链接贴出来,因为版本比较老了,可能因为新的环境的问题在后面编译时出问题,或其他的问题,所以我这里是照着原博主的方法做的

这里以Windows版为例,我们前期的例子都是直接在Windows上进行的,因此直接下载Windows版本的,其他系统的先不管他。

下载地址:

https://ffmpeg.zeranoe.com/builds/   (下面我有贴出我这里使用的文件的,链接,可以直接下载

打开后可看到如下界面:

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

其中 Static 顾名思义就是静态库版本了。

Shared则是动态库版本。

Dev则是提供给开发者用的Lib文件。

    

FFMPEG最新版已经是3了。

不过我们用的还是2.5的,当然也可以用其他的,如2.8。基本上版本2的API都是没差的,因此对开发没有影响。

 

 

首先下载Dev库,点击Previous FFmpeg 32-bit Dev Versions 。

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

找到2.5版本的 点击下载:

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

ffmpeg-2.5.2-win32-shared: 链接:https://pan.baidu.com/s/1SvizwUkSCdqB9eaGNSXrSg 密码:j2tk

ffmpeg-2.5.2-win32-dev     : 链接:https://pan.baidu.com/s/1gObvbmAiwKNHHUVrIKc4VQ 密码:qrp3

 

二、在工程中引用FFMPEG

打开我们前面搭建好的Qt Creator。新建一个工程,随便都行,就选纯C++工程吧:

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

切记:名字和路径一定不能有中文。

 

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

我的工程是放在 :E:MyProjectsVideoDevelop 目录下

 

 

解压出刚才下载的ffmpeg,解压后的目录名字是ffmpeg-2.5.2-win32-dev

改名成ffmpeg,并且只留下include和lib这2个文件夹,其他都删了。

将ffmpeg直接复制到我们的工程目录下:

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

Qt Creator中修改工程配置文件 testFFmpeg.pro:

在里面加入:

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
 

这就是引用ffmpeg的头文件和库的意思,如下所示:

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

mian.cpp写成如下:

#include <iostream>

using namespace std;

extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavdevice/avdevice.h"

}

///由于我们建立的是C++的工程
///编译的时候使用的C++的编译器编译
///而FFMPEG是C的库
///因此这里需要加上extern "C"
///否则会提示各种未定义

int main()
{
    //这里简单的输出一个版本号
    cout << "Hello FFmpeg!" << endl;
    av_register_all();
    unsigned version = avcodec_version();
    cout << "version is:" << version;
    return 0;

}

好了点击左下角的绿色按钮编译 或 CTRL+R进行编译。

 

本以为结束了。

然而发现问题来了:

只有一个黑框,并没有那些版本的信息打印出来。。。

 

首先打开工程目录,会发现同目录下多了一个文件夹:build-testffmpeg-Desktop_Qt_5_6_0_MinGW_32bit-Debug

打开它,我们生成的exe文件就在build-testffmpeg-Desktop_Qt_5_6_0_MinGW_32bit-Debug/debug/testFFmpeg.exe

直接双击运行看看到底是什么情况。

双击运行之后就有提示了,提示缺少dll文件:

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

原来忘记把ffmpeg的dll文件放到里面了。

 

我们刚刚只是下载了Dev包,这里面只有LIB文件,Lib文件是编译连接的时候需要用到的。

而运行的时候需要DLL,因此继续下载FFMPEG的Shared版本,,(上面贴出来了链接的)

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

找到2.5的,下载下来。

一定要和刚才下载的版本一致,否则是没法运行的:

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

解压出 ffmpeg-2.5.2-win32-shared.7z

打开会看到一个bin目录,里面都是dll文件,这些就是运行时需要的动态库,

 

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

将这些dll复制到,刚才我们生成exe的目录下(要和exe放在一起)

 

现在重新打开Qt Creator,运行,这次终于对了,出现了版本信息:

从零开始学习音视频编程技术(四) FFMPEG的使用(学习笔记)

 

至此,就成功在QT中引用了FFMPEG库了。