热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ffmpeg解码视频存为BMP文件

ffmpeg解码视频存为BMP文件分类:ffmpeg2011-07-2812:138人阅读评论(0)收藏举报viewplain#include#

ffmpeg解码视频存为BMP文件

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

转载于:https://www.cnblogs.com/moonvan/archive/2011/09/11/2173467.html


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
author-avatar
迷人的小刀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有