零开始学习音视频编程技术(四) 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。

好了,下面进入正题,开始使用FFMPEG吧。

一、FFMPEG获取:

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

下载地址:

https://ffmpeg.zeranoe.com/builds/

打开后可看到如下界面:

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

Shared则是动态库版本。

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

FFMPEG最新版已经是3了。

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

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

找到2.5版本的 点击下载:

二、在工程中引用FFMPEG

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

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

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

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

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

将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的头文件和库的意思,如下所示:

mian.cpp写成如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#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;

}

好了点击左下角的绿色按钮编译吧:

不一会儿便看到了二个错误:

看到错误的时候,莫方,2个而已嘛,不防先看看是啥错误吧。

先双击第一个错误:

跳到了common.h:

#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C)

#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
#endif

看不懂什么鬼意思,总之他的意思就是什么东西没定义了,那就按他的要求定义一下吧:

修改main.cpp

在包含ffmpeg头文件的前面加上:

#define __STDC_CONSTANT_MACROS

如下图所示:

当然也可以直接在common.h的开头处加上#define __STDC_CONSTANT_MACROS

我习惯的是后者,这样改完以后就直接复制改好的文件就行了,一劳永逸。

好了继续编译,这时候错误变成一个了,继续双击错误。

还是跳到了common.h。

这个文件还真是多事。

提示UINT64_C未声明,那就给他声明一下吧:

在common.h文件开头处加入

1

2

3

4

#ifndef INT64_C

#define INT64_C(c) (c ## LL)

#define UINT64_C(c) (c ## ULL)

#endif

修改后的完整文件如下:

别忘了按CTRL+S.

好了,再次编译运行吧。

本以为结束了。

运行发现问题又来了:

只有一个黑框,我们上面写的那些信息并没有打印出来。

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

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

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

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

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

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

而运行的时候需要DLL,因此继续下载FFMPEG的Shared版本

找到2.5的,下载下来。

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

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

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

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

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

至此,就成功了引用了FFMPEG了。

完整工程下载:http://download.csdn.net/detail/qq214517703/9622574

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

从零开始学习音视频编程技术(四) FFMPEG的使用相关推荐

  1. 从零开始学习音视频编程技术(七) FFMPEG Qt视频播放器之SDL的使用

    从零开始学习音视频编程技术(七) FFMPEG Qt视频播放器之SDL的使用 原文地址:http://blog.yundiantech.com/?log=blog&id=10 前面介绍了使用F ...

  2. 从零开始学习音视频编程技术(六) FFMPEG Qt视频播放器之显示图像

    从零开始学习音视频编程技术(六) FFMPEG Qt视频播放器之显示图像 原文地址:http://blog.yundiantech.com/?log=blog&id=9 前面讲解了如何用FFM ...

  3. 从零开始学习音视频编程技术--转自雲天之巔

    此为转载文章,主要是为了个人阅读方便,将博主的系列文章罗列出来,点击直接跳转. 从零开始学习音视频编程技术(一) 视频格式讲解 从零开始学习音视频编程技术(二) 音频格式讲解 从零开始学习音视频编程技 ...

  4. 从零开始学习音视频编程技术(二) 音频格式讲解

    从零开始学习音视频编程技术(二) 音频格式讲解 原文地址:http://blog.yundiantech.com/?log=blog&id=5 1. 音频简介 前面我们说过视频有一个每秒钟采集 ...

  5. 从零开始学习音视频编程技术(二十一) 录屏软件开发之最终完善

    原文地址:http://blog.yundiantech.com/?log=blog&id=28 上面我们已经生成了录屏的视频,然而这个视频并不是理想中的那样,随时时间的增加,音视频会越来越不 ...

  6. 从零开始学习音视频编程技术(42) AAC数据解析

    AAC基本格式 AAC音频格式有ADIF和ADTS: ADIF:Audio Data Interchange Format 音频数据交换格式.这种格式的特征是可以确定的找到这个音频数据的开始,不需进行 ...

  7. Android 音视频深入 十四 FFmpeg与OpenSL ES 播放mp3音乐,能暂停(附源码

    项目地址 https://github.com/979451341/FFmpegOpenslES 这次说的是FFmpeg解码mp3,数据给OpenSL ES播放,并且能够暂停. 1.创建引擎 slCr ...

  8. Android 音视频深入 十四 FFmpeg与OpenSL ES 播放mp3音乐,能暂停(附源码下载)

    项目地址 https://github.com/979451341/FFmpegOpenslES 这次说的是FFmpeg解码mp3,数据给OpenSL ES播放,并且能够暂停. 1.创建引擎 slCr ...

  9. C++音视频编程探秘

    C++音视频编程探秘(C++ Audio and Video Programming Unveiled) 一.引言(Introduction) C++音视频编程简介(Overview of C++ A ...

最新文章

  1. mysql 5.7.9_MySQL5.7.9免安装版配置方法
  2. TCP/IP协议(3):数据链路层
  3. Python脚本导出为exe程序
  4. android 实现微信分享多张图片的功能
  5. flume-source
  6. mysql增删改查 dao_MYSQL 之 JDBC(七):增删改查(五) DAO设计模式
  7. C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel
  8. 天弘余额宝发布2018年报:规模1.13万亿 平均每天赚1.39亿元
  9. python怎么读取txt文件-Python笔记(读取txt文件中的数据)
  10. ListView可拖拽item的原理
  11. Fuse Audio Labs VCS-1 Mac - 零延迟通道条插件
  12. 云承软件和云溪哪个好_多工序开料机的软件对接及注意事项
  13. 天津科技大学计算机学院地址,天津科技大学有几个校区及校区地址
  14. 米家插件平台的技术实践之路
  15. 文本检测之-craft检测算法
  16. 高中数学一轮复习逆袭必要学习方法
  17. python二维列表每个子列表取一个元素的所有组合
  18. vscode离线下载对应版本的插件,避免版本兼容问题
  19. C# 淘宝商品微信返利助手开发-(九)编写一个vue页面用于复制淘口令
  20. 如何使用QQ收集表收青年大学习?

热门文章

  1. python3创建类_python3 metaclass--创建类的过程分析
  2. c语言tcp读写二进制文件,通过TCP/IP连接发送二进制文件
  3. Linux内核网络协议栈1- socket文件系统注册
  4. Redis与数据库缓存一致性问题
  5. Python的贝叶斯网络学习库pgmpy介绍和使用
  6. HIT Software Construction Lab6引发出来对锁的问题的探究
  7. Kali Linux与Ubuntu的ssh服务
  8. Atitit.事件机制 与 消息机制的联系与区别
  9. C程序中对时间的处理——time库函数详解转
  10. java加载properties文件的几种方式,java高级面试笔试题