本教程只针对windows64/32+vs2013环境配置
第一步 :配环境
1.打开ffmpeg官网中编译好的windows版本http://ffmpeg.zeranoe.com/builds/
64位windows系统和32位系统各有三个版本分别为Static版本,Share版本,Dev版本;
在这里建议无论是32位还是64位系统都直接配置32位的ffmpeg版本,除非你vs2013选择的是x64编译器。

将32位版本Share版本和Dev下载,解压。
在Dev里面主要是一些头文件和lib,在share版本里主要是dll文件。

2.打开vs2013,新建一个win32控制台程序。
选择项目-》属性-》c++目录,分别在包含目录和库目录中打开dev版本中的include和lib(指的是你解压dev保存的位置,在里面找到include和lib)

3项目-》属性-》链接器-》输入-》依赖项中填写

avcodec.lib
avformat.lib
avutil.lib
avdevice.lib
avfilter.lib
postproc.lib
swresample.lib
swscale.lib
保存即可。

第二步:视频解码,此处是一个完整的视频解码工程,从解码到存储,在vs2013上可以运行,如果编译不成功,可考虑是否是环境配错了。注意关闭防火墙。

  1. // ConsoleApplication9.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #pragma once
  10. #pragma warning(disable:4996)
  11.  
  12. extern "C"
  13. {
  14. #include <libavcodec/avcodec.h>
  15. #include <libavdevice/avdevice.h>
  16. #include<libavfilter/avfilter.h>
  17. #include <libswscale/swscale.h>
  18. #include <libswresample/swresample.h>
  19. #include <libavformat/avformat.h>
  20. #include <libavutil/avutil.h>
  21. };
  22.  
  23. //定义BMP文件头
  24. #ifndef _WINGDI_
  25. #define _WINGDI_
  26. typedef struct tagBITMAPFILEHEADER {
  27. WORD bfType;
  28. DWORD bfSize;
  29. WORD bfReserved1;
  30. WORD bfReserved2;
  31. DWORD bfOffBits;
  32. } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
  33.  
  34. typedef struct tagBITMAPINFOHEADER{
  35. DWORD biSize;
  36. LONG biWidth;
  37. LONG biHeight;
  38. WORD biPlanes;
  39. WORD biBitCount;
  40. DWORD biCompression;
  41. DWORD biSizeImage;
  42. LONG biXPelsPerMeter;
  43. LONG biYPelsPerMeter;
  44. DWORD biClrUsed;
  45. DWORD biClrImportant;
  46. } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
  47.  
  48. #endif
  49.  
  50. //保存BMP文件的函数
  51. void SaveAsBMP(AVFrame *pFrameRGB, int width, int height, int index, int bpp)
  52. {
  53. char buf[] = { };
  54. //bmp头
  55. BITMAPFILEHEADER bmpheader;
  56. BITMAPINFOHEADER bmpinfo;
  57. FILE *fp;
  58. char *filename = new char[];
  59. //文件存放路径,根据自己的修改
  60. sprintf_s(filename, , "%s_%d.bmp", "D:\\", index);
  61. if ((fp = fopen(filename, "wb+")) == NULL)
  62. {
  63. printf("open file failed!\n");
  64. return;
  65. }
  66.  
  67. bmpheader.bfType = 0x4d42;
  68. bmpheader.bfReserved1 = ;
  69. bmpheader.bfReserved2 = ;
  70. bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  71. bmpheader.bfSize = bmpheader.bfOffBits + width*height*bpp / ;
  72.  
  73. bmpinfo.biSize = sizeof(BITMAPINFOHEADER);
  74. bmpinfo.biWidth = width;
  75. bmpinfo.biHeight = height;
  76. bmpinfo.biPlanes = ;
  77. bmpinfo.biBitCount = bpp;
  78. bmpinfo.biCompression = BI_RGB;
  79. bmpinfo.biSizeImage = (width*bpp + ) / * * height;
  80. bmpinfo.biXPelsPerMeter = ;
  81. bmpinfo.biYPelsPerMeter = ;
  82. bmpinfo.biClrUsed = ;
  83. bmpinfo.biClrImportant = ;
  84.  
  85. fwrite(&bmpheader, sizeof(bmpheader), , fp);
  86. fwrite(&bmpinfo, sizeof(bmpinfo), , fp);
  87. fwrite(pFrameRGB->data[], width*height*bpp / , , fp);
  88.  
  89. fclose(fp);
  90. }
  91.  
  92. //主函数
  93. int main(void)
  94. {
  95. unsigned int i = , videoStream = -;
  96. AVCodecContext *pCodecCtx;
  97. AVFormatContext *pFormatCtx;
  98. AVCodec *pCodec;
  99. AVFrame *pFrame, *pFrameRGB;
  100. struct SwsContext *pSwsCtx;
  101. const char *filename = "E:\\123.avi";//rtsp://192.168.2.214:554/bs0
  102. AVPacket packet;
  103. int frameFinished;
  104. int PictureSize;
  105. uint8_t *buf;
  106. //注册编解码器
  107. av_register_all();
  108. avformat_network_init();
  109. pFormatCtx = avformat_alloc_context();
  110. //打开视频文件
  111. if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != )
  112. {
  113. printf("av open input file failed!\n");
  114. exit();
  115. }
  116. //获取流信息
  117. if (avformat_find_stream_info(pFormatCtx, NULL) < )
  118. {
  119. printf("av find stream info failed!\n");
  120. exit();
  121. }
  122. //获取视频流
  123. for (i = ; i<pFormatCtx->nb_streams; i++)
  124. if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
  125. {
  126. videoStream = i;
  127. break;
  128. }
  129.  
  130. if (videoStream == -)
  131. {
  132. printf("find video stream failed!\n");
  133. exit();
  134. }
  135.  
  136. pCodecCtx = pFormatCtx->streams[videoStream]->codec;
  137.  
  138. pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
  139.  
  140. if (pCodec == NULL)
  141. {
  142. printf("avcode find decoder failed!\n");
  143. exit();
  144. }
  145. //打开解码器
  146. if (avcodec_open2(pCodecCtx, pCodec, NULL)<)
  147. {
  148. printf("avcode open failed!\n");
  149. exit();
  150. }
  151.  
  152. //为每帧图像分配内存
  153. pFrame = av_frame_alloc();
  154. pFrameRGB = av_frame_alloc();
  155.  
  156. if ((pFrame == NULL) || (pFrameRGB == NULL))
  157. {
  158. printf("avcodec alloc frame failed!\n");
  159. exit();
  160. }
  161. //获得帧图大小
  162. PictureSize = avpicture_get_size(AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);
  163. buf = (uint8_t*)av_malloc(PictureSize);
  164.  
  165. if (buf == NULL)
  166. {
  167. printf("av malloc failed!\n");
  168. exit();
  169. }
  170. avpicture_fill((AVPicture *)pFrameRGB, buf, AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);
  171.  
  172. //设置图像转换上下文
  173. pSwsCtx = sws_getContext(pCodecCtx->width,
  174. pCodecCtx->height,
  175. pCodecCtx->pix_fmt,
  176. pCodecCtx->width,
  177. pCodecCtx->height,
  178. AV_PIX_FMT_BGR24,
  179. SWS_BICUBIC,
  180. NULL, NULL, NULL);
  181. i = ;
  182. while (av_read_frame(pFormatCtx, &packet) >= )
  183. {
  184. if (packet.stream_index == videoStream)
  185. {
  186. //真正解码
  187. avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
  188. if (frameFinished)
  189. {
  190. //反转图像 ,否则生成的图像是上下调到的
  191. pFrame->data[] += pFrame->linesize[] * (pCodecCtx->height - );
  192. pFrame->linesize[] *= -;
  193. pFrame->data[] += pFrame->linesize[] * (pCodecCtx->height / - );
  194. pFrame->linesize[] *= -;
  195. pFrame->data[] += pFrame->linesize[] * (pCodecCtx->height / - );
  196. pFrame->linesize[] *= -;
  197. //转换图像格式,将解压出来的YUV420P的图像转换为BRG24的图像
  198. sws_scale(pSwsCtx, pFrame->data, pFrame->linesize, , pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
  199. //保存为bmp图
  200. SaveAsBMP(pFrameRGB, pCodecCtx->width, pCodecCtx->height, i, );
  201. i++;
  202. }
  203. av_free_packet(&packet);
  204. }
  205. }
  206. sws_freeContext(pSwsCtx);
  207. av_free(pFrame);
  208. av_free(pFrameRGB);
  209. avcodec_close(pCodecCtx);
  210. avformat_close_input(&pFormatCtx);
  211.  
  212. return ;
  213. }

ffmpeg这样连接了后会花屏,解决方式如下(换成TCP连接方式):

  1. AVDictionary* options = NULL;
  2. av_dict_set(&options, "rtsp_transport", "tcp", );
  3. if(avformat_open_input(&pFormatCtx,"rtsp://192.168.2.214:554/bs0",NULL,&options)!=){
  4. printf("Couldn't open input stream.\n");
  5. return -;
  6. }
  1. 这样连接了不会花屏,但是延时会越来越长

c++ 配置ffmpeg的更多相关文章

  1. Visual Studio 开发(二):VS 2017配置FFmpeg开发环境

    在上篇文章Visual Studio 开发(一):安装配置Visual Studio Code 中,我们讲了一下如何配置VS CODE,来编写和调试C的代码.如果你已经使用VS Code回顾和复习好C ...

  2. Windows配置ffmpeg

    一.ffmpeg简介 ffmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案. 支持操作系统: ...

  3. [转载]Windows x64下配置ffmpeg的方法

    ffmpeg简介 FFmpeg 是一款跨平台的,对视频.音频进行录制.转换.播放的命令行形式软件,它使用的是 libavcodec 编解码器.FFmpeg 官方网站是 http://ffmpeg.or ...

  4. FFmpeg + SoundTouch实现音频的变调变速

    本文使用FFmpeg + SoundTouch实现将音频解码后,进行变调变速处理,并将处理后的结果保存为WAV文件. 主要有以下内容: 实现一个FFmpeg的工具类,保存多媒体文件所需的解码信息 将解 ...

  5. iOS编译FFmpeg、kxmovie实现视频播放 (转载)

    由于FFmpeg开源框架的功能非常强大,可以播放的视频种类很多,同时添加第三方库kxmovie,实现视频播放,真的是爽爆了,因此今天来说一下关于FFmpeg在iOS手机上的一些配置过程,配置工具,还有 ...

  6. FFMPEG在嵌入式硬件上应用之 —— 基本环境搭建及编译

    前段时间在翻看电脑里面资料时,发现了以前做的在嵌入式硬件上面运行以ffmepg为基础,以嵌入式硬件解码的多媒体播放工作,发现都快忘记完了.今日得闲整理温习了一下ffmpeg在嵌入式上的运用,这里给大家 ...

  7. 【FFmpeg】Windows下FFmpeg调试

    为了深入了解ffmpeg的工作原理,需要阅读源代码,调试源代码.在Windows下调试ffmpeg源码,一种方法是在MinGW+Msys环境下,利用GDB进行调试:另一种是借助Eclipse进调试,其 ...

  8. 在Windows下利用Eclipse调试FFmpeg

    目录 [隐藏]  1 环境与软件 2 第一步:安装MinGW 3 第二步:配置编译环境 4 第三步:配置SDL 5 第四步:编译 5.1 编译faac 5.2 编译fdk-aac 5.3 编译x264 ...

  9. 在CentOS下利用Eclipse调试FFmpeg

    所需软件 64位软件打包下载链接:http://pan.baidu.com/s/1i3B08Up 密码:o50u https://yunpan.cn/cBKDSbrGDgBvz  访问密码 1f55 ...

随机推荐

  1. Ubuntu flatabulous 主题

    在终端输入以下指令 sudo apt-get update sudo apt-get upgrade sudo apt-get install unity-tweak-tool//安装unity tw ...

  2. java 获取当前时间,前一天时间

    java获取当前时间,并按一定格式输出 1.用Calendar获取Date Calendar calendar=Calendar.getInstance(); SimpleDateFormat for ...

  3. DataReader和DataAdapter的区别

    SqlDataReader是一个向前的指针,本身并不包含数据,调用一次Read()方法它就向前到下一条记录,一个SqlDataReader必须单独占用一个打开的数据库连接. 在使用 SqlDataRe ...

  4. NO28 第四关考试题

    第4章 第4周课前测试考试题 4.1 定时任务规则的含义01 第1题 如果在某用户的crontab文件中有以下记录,该行中的命令多久执行一次(RHCE考试题)?(  ) 30 4 * * 3 mycm ...

  5. vs2010编译C++ 状态标志

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  6. 你必须知道的.Net 8.2.2 本质分析

    1 .Equals  静态方法  Equals 静态方法实现了对两个对象的相等性判别,其在 System.Object 类型中实现过程可以表 示为: public static bool Equals ...

  7. 第2节 网站点击流项目(下):6、访客visit分析

    0: jdbc:hive2://node03:10000> select * from ods_click_stream_visit limit 2;+--------------------- ...

  8. 通过虚拟机增加Linux的磁盘(分区容量)

    因为安装oracle设置的磁盘空间不足,所以安装失败.这里总结一下如何添加磁盘挂载 1. 右键虚拟机点击设置,然后点击磁盘,点击添加按钮 2.然后点击下一步下一步,直到安装成功 3.然后输入 fdis ...

  9. 使用vue框架开发前端项目的步骤

    前端项目的开发 1. 本地安装nodejs https://nodejs.org/en/download/ 2. 测试安装 > node -v 3. 本地安装git > git --ver ...

  10. C++ mfc 简易文本编辑器 遇到的一些问题

    [题目40]简易文本编辑器. 设计一个简易的文本编辑器. 设计要求: (1) 具有图形菜单界面: (2) 查找,替换(等长,不等长),插入(插串,文本块的插入).文本块移动(行块,列块移动),删除; ...