VS2008+ffmpeg SDK3.2调试tutorial01

最近研究ffmpeg,在ubuntu下感觉不太好调试,老是找不到函数的声明。所以我就把他移到windows下用vs2008分析

关于环境的搭建,我参考了 http://hi.baidu.com/forever803/blog/item/ba90cdd2cca917093af3cf9e.html ,这里我把步骤整理一下,顺便奉上图文

第1步:

下载ffmpeg SDK3.2:点击下载,并解压。

第2步:

打开vs2008新建一个空的vc++项目

第3步:

新建一个C++源文件,test.cpp,输入简单代码测试一下

[html] view plaincopy

 

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main(){  
  4.     printf("aaaa\n");  
  5.     system("pause");  
  6.     return 0;  
  7. }  

按F5运行,打印输出aaaa,则没问题

第4步:

将解压出来的sdk下的include目录下的所有文件夹和文件拷到vc++工程目录下的test.cpp同一个目录。我的是(C:\Users\easou\Documents\Visual Studio 2008\Projects\testffmpeg\testffmpeg),此时,目录结构如下图

第5步:

 将解压出来的lib文件夹拷贝至tes.cpp同一目录下。

然后在vs2008里,单击工程右键->属性->常规->附加库目录  填入$(SolutionDir)\$(ProjectName)\lib

    
属性->链接器->  附加依赖项  填入avcodec.lib avdevice.lib avfilter.lib avformat.lib avutil.lib swscale.lib  点击确定

第6步:

将tutorial01.c的内容复制到test.cpp中,并修改相关引用路径,按F7编译。F5运行

tes.cpp代码:

[html] view plaincopy

 

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. #ifdef __cplusplus  
  5. extern "C" {  
  6. #endif  
  7.     #include "libavcodec/avcodec.h"  
  8.     #include "libavformat/avformat.h"  
  9.     #include "libswscale/swscale.h"  
  10. #ifdef __cplusplus  
  11. }  
  12. #endif  
  13.   
  14. void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame) {  
  15.   FILE *pFile;  
  16.   char szFilename[32];  
  17.   int  y;  
  18.     
  19.   // Open file  
  20.   sprintf(szFilename, "frame%d.ppm", iFrame);  
  21.   pFile=fopen(szFilename, "wb");  
  22.   if(pFile==NULL)  
  23.     return;  
  24.     
  25.   // Write header  
  26.   fprintf(pFile, "P6\n%d %d\n255\n", width, height);  
  27.     
  28.   // Write pixel data  
  29.   for(y=0; y<height; y++)  
  30.     fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);  
  31.     
  32.   // Close file  
  33.   fclose(pFile);  
  34. }  
  35.   
  36. int main() {  
  37.   AVFormatContext *pFormatCtx;  
  38.   int             i, videoStream;  
  39.   AVCodecContext  *pCodecCtx;  
  40.   AVCodec         *pCodec;  
  41.   AVFrame         *pFrame;   
  42.   AVFrame         *pFrameRGB;  
  43.   AVPacket        packet;  
  44.   int             frameFinished;  
  45.   int             numBytes;  
  46.   uint8_t         *buffer;  
  47.   static struct SwsContext *img_convert_ctx;  
  48.   char * filePath="test.mp4";  
  49.   // Register all formats and codecs  
  50.   av_register_all();  
  51.     // Open video file  
  52.   if(av_open_input_file(&pFormatCtx, filePath, NULL, 0, NULL)!=0)  
  53.     return -1; // Couldn't open file  
  54.     
  55.   // Retrieve stream information  
  56.   if(av_find_stream_info(pFormatCtx)<0)  
  57.     return -1; // Couldn't find stream information  
  58.     
  59.   // Dump information about file onto standard error  
  60.   dump_format(pFormatCtx, 0, filePath, 0);  
  61.     // Find the first video stream  
  62.   videoStream=-1;  
  63.   for(i=0; i<pFormatCtx->nb_streams; i++)  
  64.     if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) {  
  65.       videoStream=i;  
  66.       break;  
  67.     }  
  68.   if(videoStream==-1)  
  69.     return -1; // Didn't find a video stream  
  70.       // Get a pointer to the codec context for the video stream  
  71.   pCodecCtx=pFormatCtx->streams[videoStream]->codec;  
  72.   
  73.     // Find the decoder for the video stream  
  74.   pCodec=avcodec_find_decoder(pCodecCtx->codec_id);  
  75.   if(pCodec==NULL) {  
  76.     fprintf(stderr, "Unsupported codec!\n");  
  77.     return -1; // Codec not found  
  78.   }  
  79.       // Open codec  
  80.   if(avcodec_open(pCodecCtx, pCodec)<0)  
  81.     return -1; // Could not open codec  
  82.   
  83.     // Allocate video frame  
  84.   pFrame=avcodec_alloc_frame();  
  85.     
  86.   // Allocate an AVFrame structure  
  87.   pFrameRGB=avcodec_alloc_frame();  
  88.   if(pFrameRGB==NULL)  
  89.     return -1;  
  90.   
  91.       
  92.   // Determine required buffer size and allocate buffer  
  93.   numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,  
  94.                   pCodecCtx->height);  
  95.   buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));  
  96.   
  97.     // Assign appropriate parts of buffer to image planes in pFrameRGB  
  98.   // Note that pFrameRGB is an AVFrame, but AVFrame is a superset  
  99.   // of AVPicture  
  100.   avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,  
  101.          pCodecCtx->width, pCodecCtx->height);  
  102.   
  103.   // Read frames and save first five frames to disk  
  104.   i=0;  
  105.   while(av_read_frame(pFormatCtx, &packet)>=0) {  
  106.             if(packet.stream_index==videoStream) {  
  107.                       // Decode video frame  
  108.                  avcodec_decode_video(pCodecCtx, pFrame, &frameFinished,packet.data, packet.size);  
  109.                    if(frameFinished) {  
  110.                             // Convert the image from its native format to RGB  
  111.                         img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);  
  112.                         // Convert the image from its native format to RGB  
  113. sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize,0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);  
  114.                         if(++i<=5)  
  115.                             SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height,i);                  
  116.                    }  
  117.             }  
  118.                 // Free the packet that was allocated by av_read_frame  
  119.         av_free_packet(&packet);  
  120.   }  
  121.   // Free the RGB image  
  122.   av_free(buffer);  
  123.   av_free(pFrameRGB);  
  124.     
  125.   // Free the YUV frame  
  126.   av_free(pFrame);  
  127.     
  128.   // Close the codec  
  129.   avcodec_close(pCodecCtx);  
  130.     
  131.   // Close the video file  
  132.   av_close_input_file(pFormatCtx);  
  133.     
  134.   printf("执行完毕\n");  
  135.   system("pause");  
  136.   return 0;  
  137. }  

 

这里可能出现的问题比较多,主要有:

1、找不到stdint.h这个文件,将出现问题的头文件中的“include <stdint.h>”改为“include "stdint.h"”即可

2、无法解析的外部符号 _img_convert,参考文章http://witmax.cn/ffmpeg-img-convert.html

3、运行时会出现找不到avformat.dll的对话框,将sdk下的bin文件下的dll文件都拷贝到工程目录下的debug文件夹解决。

4、信息窗出现 testffmpeg.exe: 本机”已退出,返回值为 -1字样。检查一下,是否没有将你的test.mp4拷到tes.cpp同一个目录下,mp4文件网上随便找一个就可以。提供我的视频一个http://115.com/file/e7f1ylpy

最后按F5出现命令窗口如下,调试通过

到test.cpp文件的目录下看一下,多出了5个ppm文件

可以用acd查看

时间: 2024-10-03 06:02:18

VS2008+ffmpeg SDK3.2调试tutorial01的相关文章

断点调试 最小化-VS2008为什么下断点调试时候,对话框最小化点不出来

问题描述 VS2008为什么下断点调试时候,对话框最小化点不出来 VS2008为什么下断点调试时候,对话框最小化点不出来,我做了一个程序,有两个按钮响应,我在其中一个按钮响应中下了一个断点,然后调试运行,我想看点击另外一个按钮时断点处的变化,但是这时候对话框最小化,怎么点也看不了了,也就点不了按钮了 ,要是再按F5直接就跳过断电了,请问怎么解决这个问题啊 ?

VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件

设置VS2008和IE8 调试ATL控件   VS2008设置篇:     设置VS2008 通过IE8 调试ATL的ActiveX控件的步骤如下: (1)       设置项目属性 通过菜单项 "项目->你的项目属性"如下图: (2)       在弹出的属性页对话框中选中"配置属性->调试",在右边填入下列参数: 命令         :C:\Program Files\Internet Explorer\iexplore.exe(你的IE8执行文件

请教各位大神 vs2008只要点击调试就会出现 尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述 在vs2008中使用C#编写程序,原来好好的,突然出现的这个问题,无论代码写什么都会出现"尝试读取或写入受保护的内存.这通常指示其他内存已损坏."的错误.同时还会出现"错误2未能找到要求的文件alink.dll"就算新建个项目,只有一个窗体,代码是空的,也会出现这个情况.vs也重装过了问题依旧.系统还原过了问题依旧.我发现打开以前写的代码就可以调试,但是现在新建的项目就不行.新建一个空的也不能运行,控制台的都不行,旧的项目只要修改一个字哪怕就是个变量名也就

VS2008 在IE中 调试 ActiveX控件 .

不知道是不是微软的粗心大意,VS2008中竟然没有ActiveX控件测试容器. 幸好需要在IE中测试控件,就不需要那个测试容器啦.   1. 生产测试控件的HTML: <HTML><HEAD><TITLE>Test</TITLE></HEAD><BODY> <OBJECT ID="MyActiveX" WIDTH=800 HEIGHT=600 CLASSID="CLSID:5228A02F-8FBD

VS2008远程调试

环境:      同一局域网内,主机和虚拟机远程调试   远程计算机:虚拟机搭的WindowsXP/32(局域网中使用桥接,非局域网使用NAT)     本地计算机:Windows XP.Win71.本机计算机要求:VS2008 IDE 打开被调试代码 2.本机计算机登陆的用户名和密码,必须和远程计算机的登录名和密码相同,仅仅用户名相同,密码不同也是不可以的,会报错.  (也可以不设相同用户名和密码,貌似只有VC++下可以,在远程调试器选项里设置无验证模式,相应的在项目属性的调试页里设置,见下面

VS2008远程调试方法

在网上找了好多资料才把这个调试环境搭好,下面总结一下: 先说明两个概念: 1.      目标机:远程需要调试的机子,也就是被调试程序exe所在的机子,该机子可以安装VS2008或者不安装vs2008 2.      调试机:安装VS2008的机子,就是存放代码下断点调试的机子,该机子必须安装vs2008   下面介绍具体设置步骤: 目标机: 1.      如果目标机安装了VS2008则直接在[开始菜单]->[Microsoft Visual Studio2008]->[VisualStud

VC++植物大战僵尸中文版修改器实现代码_C 语言

本文实例讲述了VC++植物大战僵尸中文版修改器实现代码.分享给大家供大家参考.具体分析如下: 这是很简单的一个辅助工具,关键是游戏数据的分析,实现了两个功能,无限阳光和无冷却.特别注意的一下,如果用VS2008编译的话,调试的时候是正常的,但编译后功能就会失效,这是因为OpenProcess权限的问题,需要提权,在VC6下是正常的. void CzhiwuDlg::OnBnClickedButton1() { //无限阳光代码 HWND hJubing; DWORD lID; DWORD bas

WPF的ListView控件自定义布局用法实例_C#教程

本文实例讲述了WPF的ListView控件自定义布局用法.分享给大家供大家参考,具体如下: 概要: 以源码的形式贴出,免得忘记后,再到网上查资料.在VS2008+SP1环境下调试通过 引用的GrayscaleEffect模块,可根据参考资料<Grayscale Effect...>中的位置下载. 正文: 如何布局是在App.xaml中定义源码如下 <Application x:Class="CWebsSynAssistant.App" xmlns="http

报表查看器 Web 控件 HTTP 处理程序尚未在应用程序的 web.config 文件中注册

问题描述 我在asp.net页面上放了个reportView的控件,也配置了数据源,但是运行后在页面什么也不显示,一片空白.网上的一般配置,比如web.config的配置都有了,查看页面的源文件有:报表查看器配置错误</h2><p>报表查看器Web控件HTTP处理程序尚未在应用程序的web.config文件中注册.请将<addverb="*"path="Reserved.ReportViewerWebControl.axd"type=&