ffmpeg解码视频存为BMP文件

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

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

ffmpeg解码视频存为BMP文件相关推荐

  1. ffmpeg 解码视频(h264、mpeg2)输出yuv420p文件

    ffmpeg 解码视频(h264.mpeg2)输出yuv420p文件 播放yuv可以参考:ffplay -pixel_format yuv420p -video_size 768x320 -frame ...

  2. ffmpeg解码视频文件并播放

    最近学习了一下如何使用ffmpeg解码音视频,网上的教程挺多但是也挺杂的,搞了好几天,明白了ffmpeg解码音视频的大体流程,这里记录一下ffmpeg解码视频并播放音视频的例子,但并没有做音频.视频播 ...

  3. 从零实现简易播放器:4.ffmpeg 解码视频为yuv数据-使用avcodec_send_packet与avcodec_receive_frame

    ffmpeg 解码视频为yuv数据 作者:史正 邮箱:shizheng163@126.com 如有错误还请及时指正 如果有错误的描述给您带来不便还请见谅 如需交流请发送邮件,欢迎联系 csdn : h ...

  4. FFMPEG将视频切片成ts文件并对ts文件进行ASE加密,并合并成M3U8操作方法

    环境:centos7 开发语言:php 框架:视频转码服务系统 生成ASE加密文件需要用到的命令: #!/bin/sh BASE_URL=${1:-'.'} openssl rand 16 > ...

  5. 使用 FFmpeg 开发播放器基础--使用 ffmpeg 解码视频文件

    原:http://blog.chinaunix.net/uid-11344913-id-4282729.html 使用 ffmpeg 解码多媒体文件之前,首先需要了解一些基本的概念: 容器:多媒体文件 ...

  6. FFmpeg解码视频帧为jpg图片保存到本地

    之前遇到一个需求是将视频一秒一秒解码成一帧一帧的图片,用户滑动选择时间节点(微信朋友圈发10秒视频的编辑界面).开始我是用的MediaMetadataRetriever类来获取图片,但是对于分辨率比较 ...

  7. ffmpeg解码视频

    目录 一.前言 二.ffmpeg解码API介绍 三.ffmpeg解码示例 四.ffmpeg解码框架设计 <ffmpeg解码H264/H265为yuv代码实现>链接: https://edu ...

  8. ffmpeg 解码视频小例子

    原:http://blog.csdn.net/flyfight88/article/details/8541068 ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益 ...

  9. FFmpeg解码视频并保存为图片

    1.多媒体文件的读取 一个多媒体文件包含有多个流(视频流 video stream,音频流 audio stream,字幕等):流是一种抽象的概念,表示一连串的数据元素:     流中的数据元素称为帧 ...

最新文章

  1. C#如何打开一个窗体,同时关闭该窗体
  2. mysql gt resource_讲解MySQL中lt;=gt;操作符的用法
  3. hadoop学习6 运行map reduce出错
  4. 【Elasticsearch】Elasticsearch analyzer 中文 分词器
  5. 实时操作系统和优先级反转
  6. 1077. 互评成绩计算 (20)-PAT乙级真题
  7. Eclipse运行异常:Could not find the main class. Program will exit.
  8. mysql备份为0_MySQL 备份(一)
  9. 字节跳动java一共几面_字节跳动Java面经(已offer)
  10. C语言/C++中strcpy_s函数
  11. smith圆图重要性_数学之美:浅谈Smith圆图
  12. 2019数据安装勾选_建筑CAD首选软件~【T20 天正建筑 V5.0 安装教程】
  13. java在线测试工具_9个最好用的在线编译/调试工具
  14. php微信昵称保存,附件十四 存储微信昵称的处理方法
  15. 浅谈认识商业智能过程中遇到的困难
  16. stack smashing detected(c++报错)
  17. 《东周列国志》第四回 秦文公郊天应梦 郑庄公掘地见母
  18. 用二维数组进行学生的成绩排序和计算
  19. Microsoft Visual Studio 2019介绍之使用入门
  20. 树莓派科学小实验4B--07_继电器

热门文章

  1. 2022-2028年中国UI设计行业现状调研分析及发展趋势研究报告
  2. 2022-2028年中国应急救援装备行业市场研究及前瞻分析报告
  3. Go 知识点(16)— 将枚举值转换为字符串
  4. etcd 笔记(04)— etcd 网关与 gRPC 网关
  5. Python 标准库之 datetime
  6. tornado 异步两种实现形式 通过回调可以利用
  7. LeetCode简单题之将句子排序
  8. 天元MegEngine训练推理
  9. 华为+长安研发芯片?长安蔚来更名“阿维塔科技”
  10. SLAM图优化g2o