在visual studio 2010中调用ffmpeg

本文来自:http://blog.sina.com.cn/s/blog_4178f4bf01018wqh.html

最近几天一直在折腾ffmpeg,在网上也查了许多资料,费了不少劲,现在在这里和大家分享一下。

一、准备工作

本来是想自己在windows下编译ffmpeg生成lib、dll等库文件的,但是折腾好久总是出错,于是果断放弃。幸好网上已经有了编译好的版本,可以拿过来直接用,网址为http://ffmpeg.zeranoe.com/builds/。我们需要的是32-bit Builds (Shared)和32-bit Builds (Dev),版本号要相对应。32-bit Builds (Shared)主要包含了所要用到的dll文件,32-bit Builds (Dev)主要包含了所要用的头文件和lib文件。其实这些lib并不是传统的静态库文件(真正的静态库文件是在lib目录下的*.a文件),他们是dll的导出文件。dll文件在32-bit Builds (Shared)的bin目录下,lib文件在32-bit Builds (Dev)的lib目录下,头文件在32-bit Builds (Dev)的include目录下。

另外,C99中添加了几个新的头文件,Visual Studio中没有,所以需要你自己下载。并放至相应目录。对于VS2010来说通常是:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include。

二、Visual Studio配置

在准备好库文件之后,便可以进行Visual Studio简单的编译工作了,下面给出一份当前可以编译运行的代码,并以此为示例。

// ffmpeg-example.cpp : Defines the entry point for the console application.

//

//#include "stdafx.h"

#define inline _inline

#ifndef INT64_C

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

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

#endif

#ifdef __cplusplus

extern "C" {

#endif

#include <libavformat/avformat.h>

#include <libavcodec/avcodec.h>

#include <libswscale/swscale.h>

#ifdef __cplusplus

}

#endif

#include <stdio.h>

static void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame);

int main (int argc, const char * argv[])

{

AVFormatContext *pFormatCtx;

int             i, videoStream;

AVCodecContext  *pCodecCtx;

AVCodec         *pCodec;

AVFrame         *pFrame;

AVFrame         *pFrameRGB;

AVPacket        packet;

int             frameFinished;

int             numBytes;

uint8_t         *buffer;

// Register all formats and codecs

av_register_all();

// Open video file

//if(avformat_open_input(&pFormatCtx, argv[1], NULL, NULL)!=0)

if(avformat_open_input(NULL, argv[1], NULL, NULL)!=0)

return -1; // Couldn‘t open file

// Retrieve stream information

if(av_find_stream_info(pFormatCtx)<0)

return -1; // Couldn‘t find stream information

// Dump information about file onto standard error

av_dump_format(pFormatCtx, 0, argv[1], false);

// Find the first video stream

videoStream=-1;

for(i=0; i<pFormatCtx->nb_streams; i++)

if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO)

{

videoStream=i;

break;

}

if(videoStream==-1)

return -1; // Didn‘t find a video stream

// Get a pointer to the codec context for the video stream

pCodecCtx=pFormatCtx->streams[videoStream]->codec;

// Find the decoder for the video stream

pCodec=avcodec_find_decoder(pCodecCtx->codec_id);

if(pCodec==NULL)

return -1; // Codec not found

// Open codec

if(avcodec_open(pCodecCtx, pCodec)<0)

return -1; // Could not open codec

// Hack to correct wrong frame rates that seem to be generated by some codecs

if(pCodecCtx->time_base.num>1000 && pCodecCtx->time_base.den==1)

pCodecCtx->time_base.den=1000;

// Allocate video frame

pFrame=avcodec_alloc_frame();

// Allocate an AVFrame structure

pFrameRGB=avcodec_alloc_frame();

if(pFrameRGB==NULL)

return -1;

// Determine required buffer size and allocate buffer

numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,

pCodecCtx->height);

//buffer=malloc(numBytes);

buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

// Assign appropriate parts of buffer to image planes in pFrameRGB

avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,

pCodecCtx->width, pCodecCtx->height);

// Read frames and save first five frames to disk

i=0;

while(av_read_frame(pFormatCtx, &packet)>=0)

{

// Is this a packet from the video stream?

if(packet.stream_index==videoStream)

{

// Decode video frame

avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);

// Did we get a video frame?

if(frameFinished)

{

static struct SwsContext *img_convert_ctx;

#if 0

// Older removed code

// Convert the image from its native format to RGB swscale

img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24,

(AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width,

pCodecCtx->height);

// function template, for reference

int sws_scale(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,

int srcSliceH, uint8_t* dst[], int dstStride[]);

#endif

// Convert the image into YUV format that SDL uses

if(img_convert_ctx == NULL) {

int w = pCodecCtx->width;

int h = pCodecCtx->height;

img_convert_ctx = sws_getContext(w, h,

pCodecCtx->pix_fmt,

w, h, PIX_FMT_RGB24, SWS_BICUBIC,

NULL, NULL, NULL);

if(img_convert_ctx == NULL) {

fprintf(stderr, "Cannot initialize the conversion context!\n");

exit(1);

}

}

int ret = sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0,

pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);

#if 0

// this use to be true, as of 1/2009, but apparently it is no longer true in 3/2009

if(ret) {

fprintf(stderr, "SWS_Scale failed [%d]!\n", ret);

exit(-1);

}

#endif

// Save the frame to disk

if(i++<=5)

SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height, i);

}

}

// Free the packet that was allocated by av_read_frame

av_free_packet(&packet);

}

// Free the RGB image

//free(buffer);

av_free(buffer);

av_free(pFrameRGB);

// Free the YUV frame

av_free(pFrame);

// Close the codec

avcodec_close(pCodecCtx);

// Close the video file

av_close_input_file(pFormatCtx);

return 0;

}

static void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame)

{

FILE *pFile;

char szFilename[32];

int  y;

// Open file

sprintf(szFilename, "frame%d.ppm", iFrame);

pFile=fopen(szFilename, "wb");

if(pFile==NULL)

return;

// Write header

fprintf(pFile, "P6\n%d %d\n255\n", width, height);

// Write pixel data

for(y=0; y<height; y++)

fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);

// Close file

fclose(pFile);

}

首先在Visual Studio中新建工程,并将代码添加到工程的.cpp文件中。其次,就要配置工程的库文件和链接器。

1. 设置ffmpeg头文件位置

鼠标右键点击工程名,选择属性


然后选择 配置属性 -> C/C++ -> 常规 -> 附加包含目录,添加目录为你下载的32-bit Builds (Dev)中的头文件目录。

2. 设置ffmpeg的lib文件位置

鼠标右键点击工程名,选择属性, 然后选择 配置属性 -> 链接器 -> 常规 -> 附加库目录,添加目录为你下载的32-bit Builds (Dev)中的lib文件目录。

3. 设置ffmpeg的所引用的lib文件 
鼠标右键点击工程名,选择属性, 然后选择 配置属性 -> 链接器 -> 输入 -> 附加依赖项,添加的文件为你下载的32-bit Builds (Dev)中的lib文件。

如果一切正常,这时你便可以编译成功。

三、可能出现的问题

1. 虽然编译通过,但是并不表示就可以运行,当你运行代码时会出现以下错误

原因是,你虽然引用了LIB文件,但这并不是真正的静态库文件,而是对DLL的引用,所以当你调用ffmpeg库函数时,需要DLL文件在场。你可以用dumpbin(VS自带工具)来查看你生成的exe中引用了哪些DLL文件。你在命令行输入:

>dumpbin D:\test\test.exe /imports

然后根据显示的文件名,将下载的32-bit Builds (Shared)的bin文件夹下的dll文件拷贝到你新建的工程的源文件目录下。

2. 上段代码中的变量argv[1],如果你没有指定参数,则会报错。所以如果不指定,则需要将其改为一个const char *的字符串变量,字符串内容为你想读入的视频的全路径,例如

const char* filename = "D:\\work\\code\\VideoConference\\test\\IMGP1816.AVI";

上述都配置完毕就可以运行了,暂时先写这么多吧,后面我会继续总结的。

时间: 2024-10-14 19:51:04

在visual studio 2010中调用ffmpeg的相关文章

在visual studio 2010+中调用ffmpeg编译时 报错error LNK xxxx: 模块对于 SAFESEH 映像是不安全的。

解决该错误的方法: 1.右键单击该项目选择“属性”. 2.在属性页中选择:配置选项->链接器->命令行. 3. 在命令行的“其他选项”中输入/SAFESEH:NO. 4.点击确定,从新编译即可通过.

Visual Studio 2010 中的 Web 开发

概述 Microsoft Visual Studio 2010 为 ASP.NET Web 应用程序的开发提供非常多新的功能.这些新功能旨在帮助开发者高速方便地创建和部署质量高且功能全的 Web 应用程序. 眼下,Visual Studio 2010 支持 HTML 代码片段.利用这些代码片段,能够生成高质量的代码.Visual Studio 中附带了非常多代码片段,开发者也能够创建自己的代码片段. Visual Studio 2010 提供的还有一个新功能是转换 web.config 文件,以

在 Visual Studio 2010 中创建 ASP.Net Web Service

第一步:创建一个“ASP.Net Empty Web Application”项目 第二步:在项目中添加“Web Service”新项目 第一步之后,Visual Studio 2010会创建一个仅含一个站点配制文件(Web.config)的空站点,其余的什么也没有. 我们在Visual Studio 2010的Solution Explorer中,选中当前的这个project,添加新项目(右键菜单:Add --> New Item),选择“Web Service”这种类型: 看到这里读者应该就

Visual Studio 2010中的Profiler使用

Visual studio 2010 的Profiler是自带的性能工具, 利用它我们可以找出程序中的性能瓶颈,然后不断优化不断再测试. 简介 Profiler有利用向导启动程序和后期附加到程序两种关联被测模块的方式,测试方式也有两种:Sampling(采样)和Instrumentation(检测). Sampling:按设置的时间间隔中断计算机处理器并收集函数调用堆栈. 调用堆栈是一个动态结构,用于存储有关正在处理器上执行的函数的信息.这个分析方法形成的结果就是各个函数在运行时被采样的次数,次

[转]Visual Studio 2010 中安装Qt 5.1

截至目前(2013年7月12日)为止,Qt 的最高版本为Qt5.1,在该版本中已经将Qt Creator与Qt Lib集成在一个文件夹中,因此安装的时候较为方便,只需安装一个即可.因为Qt具有超强的可移植性,在同一系统平台下编写的Qt程序几乎不用更改(主要是在调试的时候更改编译链接的库即可)即可轻松运行在Windows.Linux和嵌入式平台上,在win7下主要有两种使用方式:即在Visual Studio中和利用Qt Creator直接编程,在此主要列写Visual Studio2010中安装

如何在Visual Studio Code中调用浏览器运行HTML代码

微软刚发布的Visual Studio Code还不支持安装扩展,没有内置的HTML预览功能.如果想要编辑HTML之后直接运行,可以 ctrl+shift+p 搜索 Configure Task Runner. 回车之后打开 tasks.json,修改一下: {     "version": "0.1.0",     "command": "explorer",     "windows": {      

opencv的安装与在Visual studio 2010中的配置

opencv是基于C++实现的强大的图形图像处理库,包含很多图像处理和机器学习的工具函数.在VS中使用时,安装和相关配置步骤如下: 一.opencv的安装 (1)从opencv的官网上下载安装包,http://opencv.org/downloads.html   以opencv 2.4.10为例 (2)比如解压安装在I:software目录下,会在该目录下生成名为opencv的文件夹 (3)在计算机的环境变量的最后面添加 ;I:\opencv\build\x64\vc10\bin 这样计算机就

Visual Studio 2010中的stdafx.h和targetver.h两个头文件是有什么用?

来自百度~stdafx.h中没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行. Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作.由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了. 为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示: ◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文

在 Visual Studio 2010 中配置SharpPcap

最近需要在C#下写一个抓取ARP包的程序,网上找来找去,在C#下只能用SharpPcap来做了.SharpPcap是作者把winPcap用C#重新封装而来的,详细信息见如下的链接. SharpPcap教程 我在配置的过程中遇到了一些问题,现在把这些问题的解决方法写下来,以免以后忘了,又开始各种痛苦的调试. 先来看看我的环境:win7旗舰版 .VS2010旗舰版.WinPcap4.1.3.SharpPcap4.2.0. 1.安装Winpcap4.1.3(WinPcap4.1.3下载) 2.解压Sh