用ffmpeg+Qt做点有趣的事(1)
来源:互联网 发布:安卓7.0 电量优化 编辑:程序博客网 时间:2024/05/29 13:33
音视频开发中最常做的就是编解码的操作了,以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在linux的安装,参看我的其他文章。
1.新建QT工程
2.在.pro文件中添加静态库
红色部分是关键,根据自己ffmpeg库的位置修改
3.在main.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 << endl;
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文件开头处加入
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
修改后的完整文件如下:
别忘了按CTRL+S.
好了,再次编译运行吧。
输出:
Hello FFmpeg!
version is:3673444
- 用ffmpeg+Qt做点有趣的事(1)
- 用ffmpeg+qt做点有趣的事(2)
- 用ffmpeg+qt做点有趣的事(3)----- ffmpeg解码流程
- 用Qt+ffmpeg做点有趣的事(5)--- FFMPEG Qt视频播放器之SDL的使用
- 用ffmpeg+qt做点有趣的事(4)----- 简易视频播放器
- 用Qt和ffmpeg做点有趣的事(10)录频软件开发0.1
- MATLAB 可以做什么有趣的事
- 《用QT做点什么》-2-QT控件入门
- 用Thread做点自动化的事
- 做个有趣的游戏
- python的几个有趣点
- ffmpeg 多线程初始化,需要做的事
- 用ffmpeg做的视频播放demo
- 我用代码做过的有趣的东西
- 数学建模可以用来做哪些有趣的事
- 你用TensorFlow做过哪些有趣的尝试?
- 你用TensorFlow做过哪些有趣的尝试?
- 你用TensorFlow做过哪些有趣的尝试?
- 剑指offer——数字在排序数组中出现的次数
- Python ndarray padding
- JAVA中ListIterator和Iterator详解与辨析
- 概率DP专题 (更新中)
- springmvc中如何正确的解析视图InternalResourceViewResolver
- 用ffmpeg+Qt做点有趣的事(1)
- windows 定时重启
- 阿里云服务器
- 免费的论文查重网站
- ThreadPoolExecutor源码解析
- 动态规划经典入门题目
- PreCreateWindow
- bzoj[NOI2005]维修数列
- Js高级---递归(一看就会)