本教程只针对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. 前端Cannot read property 'disabled' of null 问题解决

    就是在项目中,控制台一直在报这个错,一直没找到是什么问题, 后来经过一番排查,发现是 因为在页面中使用了el-dropdown,但是在这个标签里面没有设置它的子元素,所以会报错,解决的方法就是在el- ...

  2. Unnatural

    1. 纪录片:非自然选择 1.1 CRISPR-Cas9的出现 1.2 故事1:先天性基因缺陷而失明的小孩 1.3 故事2:基因变异的蚊子 1.4 基因技术应用的现状 1.5 担忧 2. CRISPR ...

  3. 《C Primer Plus(第6版)(中文版)》普拉达(作者)epub+mobi+azw3

    内容简介 <C Primer Plus(第6版)中文版>详细讲解了C语言的基本概念和编程技巧. <C Primer Plus(第6版)中文版>共17章.第1.2章介绍了C语言编 ...

  4. sklearn中调用PCA算法

    sklearn中调用PCA算法 PCA算法是一种数据降维的方法,它可以对于数据进行维度降低,实现提高数据计算和训练的效率,而不丢失数据的重要信息,其sklearn中调用PCA算法的具体操作和代码如下所 ...

  5. 吴裕雄--天生自然JAVA数据库编程:ResultSet接口

    import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import j ...

  6. ubuntu18.04下neo4j的安装

    参考CSDN博客 安装jdk8方式与博客中有不同,按照博客中方法没有成功 以下方法配置环境变量成功 进入配置文件 [root@cuierdan java]# vim /etc/profile在文件的后 ...

  7. 016.Oracle数据库,取本季度第一天,取本季度最后一天

    /*取本季度第一天,取本季度最后一天*/ SELECT trunc(sysdate, 'Q') AS 本季度第一天 , add_months(trunc(sysdate, ) AS 本季度最后一天 F ...

  8. 0103-springmvc的基本流程

    背景 现在的it研发,已经从管理系统时代迈入了互联网系统时代. 页面开发已经从基于JSP+struts转变为为前后端分离的方式(springMVC + JS): 思想 MVC mvc框架不仅适用于ja ...

  9. UVA 12511/CSU 1120 virus 最长公共上升子序列

    第一次接触一个这最长公共上升子序列 不过其实搞清楚了跟最长公共子序列和 最长上升子序列如出一辙 两重循环,对于当前不相等的,等于前一个的值,相等的,等于比当前A[i]小的最大值+1.弄个临时变量记录最 ...

  10. 使用Python绘制漫步图

    代码如下: import matplotlib.pyplot as plt from random import choice class RandomWalk(): def __init__(sel ...