




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FFmpeg简明教程本教程只针对windows64/32+vs2010环境配置第一步 :配环境1.打开ffmpeg官网中编译好的windows版本/builds/64位windows系统和32位系统各有三个版本分别为Static版本,Share版本,Dev版本;在这里建议无论是32位还是64位系统都直接配置32位的ffmpeg版本,除非你vs2010选择的是x64编译器。将32位版本Share版本和Dev下载,解压。在Dev里面主要是一些头文件和lib,在share版本里主要是dll文件。2.打开vs2010,新建一个win32控制台程序。选择项目-属性-c+目录,分别在包含目录和库目录中打开dev版本中的include和lib(指的是你解压dev保存的位置,在里面找到include和lib)3项目-属性-链接器-输入-依赖项中填写avcodec.libavformat.libavutil.libavdevice.libavfilter.libpostproc.libswresample.libswscale.lib保存即可。第二步:视频解码,此处是一个完整的视频解码工程,从解码到存储,在vs2010上可以运行,如果编译不成功,可考虑是否是环境配错了。1.定义一些解码变量unsigned int i = 0, videoStream = -1; AVCodecContext *pCodecCtx; AVFormatContext *pFormatCtx; AVCodec *pCodec; AVFrame *pFrame, *pFrameRGB; struct SwsContext *pSwsCtx; /打开视频的路径,可以根据自己的要求修改const char *filename = E:/视频浓缩测试视频/421-20141018100000-20141018105959-2956390.ts; AVPacket packet; int frameFinished; int PictureSize; uint8_t *buf; 2.注册解码器 /注册编解码器av_register_all(); avformat_network_init(); /这里是分配一块内存,保存视频的属性信息pFormatCtx = avformat_alloc_context();3.打开视频文件 /打开视频文件if (avformat_open_input(&pFormatCtx, filename, NULL,NULL) != 0 ) printf (av open input file failed!n); exit (1); 4. 获取流信息/获取流信息if ( avformat_find_stream_info(pFormatCtx,NULL) 0 ) printf (av find stream info failed!n); exit (1); 5.获取流信息并找到对应解码器/获取视频流for ( i=0; inb_streams; i+ ) if ( pFormatCtx-streamsi-codec-codec_type = AVMEDIA_TYPE_VIDEO ) videoStream = i; break; if (videoStream = -1) printf (find video stream failed!n); exit (1); pCodecCtx = pFormatCtx-streamsvideoStream-codec; pCodec = avcodec_find_decoder (pCodecCtx-codec_id); if (pCodec = NULL) printf (avcode find decoder failed!n); exit (1); 6打开解码器/打开解码器if ( avcodec_open2(pCodecCtx, pCodec,NULL)width, pCodecCtx-height); buf = (uint8_t*)av_malloc(PictureSize); if ( buf = NULL ) printf( av malloc failed!n); exit(1); avpicture_fill ( (AVPicture *)pFrameRGB, buf, PIX_FMT_BGR24, pCodecCtx-width, pCodecCtx-height); 9.转换图像上下文 /设置图像转换上下文pSwsCtx = sws_getContext (pCodecCtx-width, pCodecCtx-height, pCodecCtx-pix_fmt, pCodecCtx-width, pCodecCtx-height, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL); 10.真正解码开始,解码图像并保存i = 0;while(av_read_frame(pFormatCtx, &packet) = 0) if(packet.stream_index=videoStream) /真正解码avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished,&packet); if(frameFinished) /反转图像 ,否则生成的图像是上下调到的pFrame-data0 += pFrame-linesize0 * (pCodecCtx-height - 1); pFrame-linesize0 *= -1; pFrame-data1 += pFrame-linesize1 * (pCodecCtx-height / 2 - 1); pFrame-linesize1 *= -1; pFrame-data2 += pFrame-linesize2 * (pCodecCtx-height / 2 - 1); pFrame-linesize2 *= -1; /转换图像格式,将解压出来的YUV420P的图像转换为BRG24的图像sws_scale (pSwsCtx, pFrame-data, pFrame-linesize, 0, pCodecCtx-height, pFrameRGB-data, pFrameRGB-linesize); /保存为bmp图SaveAsBMP (pFrameRGB, pCodecCtx-width, pCodecCtx-height,i, 24);i+;av_free_packet(&packet);11.保存bmp函数定义/定义BMP文件头#ifndef _WINGDI_ #define _WINGDI_typedef struct tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER; #endif /保存BMP文件的函数void SaveAsBMP (AVFrame *pFrameRGB, int width, int height, int index, int bpp) char buf5 = 0; /bmp头BITMAPFILEHEADER bmpheader; BITMAPINFOHEADER bmpinfo; FILE *fp; char *filename = new char255;/文件存放路径,根据自己的修改sprintf_s(filename,255,%s_%d.bmp,D:/Debug/filename,index);if ( (fp=fopen(filename,wb+) = NULL ) printf (open file failed!n); return; bmpheader.bfType = 0x4d42; bmpheader.bfReserved1 = 0; bmpheader.bfReserved2 = 0; bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); bmpheader.bfSize = bmpheader.bfOffBits + width*height*bpp/8; bmpinfo.biSize = sizeof(BITMAPINFOHEADER); bmpinfo.biWidth = width; bmpinfo.biHeight = height; bmpinfo.biPlanes = 1; bmpinfo.biBitCount = bpp; bmpinfo.biCompression = BI_RGB; bmpinfo.biSizeImage = (width*bpp+31)/32*4*height; bmpinfo.biXPelsPerMeter = 100; bmpinfo.biYPelsPerMeter = 100; bmpinfo.biClrUsed = 0; bmpinfo.biClrImportant = 0; fwrite (&bmpheader, sizeof(bmpheader), 1, fp); fwrite (&bmpinfo, sizeof(bmpinfo), 1, fp); fwrite (pFrameRGB-data0, width*height*bpp/8, 1, fp); fclose(fp); 12.释放sws_freeContext (pSwsCtx); av_free (pFrame); av_free (pFrameRGB); avcodec_close (pCodecCtx); avformat_close_input (&pFormatCtx); return 0; Ffmpeg视频解码是一个比较固定化的东西,可以说只要按照上面步骤走下来,就可以解任何一种只要是ffmpeg支持的格式。附完整代码:/ ffmpeg1.0shipinjiemabmp.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include #include #pragma once extern C#include #include #include#include #include #include #include ;/定义BMP文件头#ifndef _WINGDI_ #define _WINGDI_typedef struct tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER; #endif /保存BMP文件的函数void SaveAsBMP (AVFrame *pFrameRGB, int width, int height, int index, int bpp) char buf5 = 0; /bmp头BITMAPFILEHEADER bmpheader; BITMAPINFOHEADER bmpinfo; FILE *fp; char *filename = new char255;/文件存放路径,根据自己的修改sprintf_s(filename,255,%s_%d.bmp,D:/Debug/filename,index);if ( (fp=fopen(filename,wb+) = NULL ) printf (open file failed!n); return; bmpheader.bfType = 0x4d42; bmpheader.bfReserved1 = 0; bmpheader.bfReserved2 = 0; bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); bmpheader.bfSize = bmpheader.bfOffBits + width*height*bpp/8; bmpinfo.biSize = sizeof(BITMAPINFOHEADER); bmpinfo.biWidth = width; bmpinfo.biHeight = height; bmpinfo.biPlanes = 1; bmpinfo.biBitCount = bpp; bmpinfo.biCompression = BI_RGB; bmpinfo.biSizeImage = (width*bpp+31)/32*4*height; bmpinfo.biXPelsPerMeter = 100; bmpinfo.biYPelsPerMeter = 100; bmpinfo.biClrUsed = 0; bmpinfo.biClrImportant = 0; fwrite (&bmpheader, sizeof(bmpheader), 1, fp); fwrite (&bmpinfo, sizeof(bmpinfo), 1, fp); fwrite (pFrameRGB-data0, width*height*bpp/8, 1, fp); fclose(fp); /主函数int main (void) unsigned int i = 0, videoStream = -1; AVCodecContext *pCodecCtx; AVFormatContext *pFormatCtx; AVCodec *pCodec; AVFrame *pFrame, *pFrameRGB; struct SwsContext *pSwsCtx; const char *filename = E:/视频浓缩测试视频/421-20141018100000-20141018105959-2956390.ts; AVPacket packet; int frameFinished; int PictureSize; uint8_t *buf; /注册编解码器av_register_all(); avformat_network_init();pFormatCtx = avformat_alloc_context();/打开视频文件if (avformat_open_input(&pFormatCtx, filename, NULL,NULL) != 0 ) printf (av open input file failed!n); exit (1); /获取流信息if ( avformat_find_stream_info(pFormatCtx,NULL) 0 ) printf (av find stream info failed!n); exit (1); /获取视频流for ( i=0; inb_streams; i+ ) if ( pFormatCtx-streamsi-codec-codec_type = AVMEDIA_TYPE_VIDEO ) videoStream = i; break; if (videoStream = -1) printf (find video stream failed!n); exit (1); pCodecCtx = pFormatCtx-streamsvideoStream-codec; pCodec = avcodec_find_decoder (pCodecCtx-codec_id); if (pCodec = NULL) printf (avcode find decoder failed!n); exit (1); /打开解码器if ( avcodec_open2(pCodecCtx, pCodec,NULL)width, pCodecCtx-height); buf = (uint8_t*)av_malloc(PictureSize); if ( buf = NULL ) printf( av malloc failed!n); exit(1); avpicture_fill ( (AVPicture *)pFrameRGB, buf, PIX_FMT_BGR24, pCodecCtx-width, pCodecCtx-height); /设置图像转换上下文pSwsCtx = sws_getContext (pCodecCtx-width, pCodecCtx-height, pCodecCtx-pix_fmt, pCodecCtx-width, pCodecCtx-height, PIX_FMT_BGR24,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老年人搭伙协议书内容
- 动产抵押协议书
- 外聘合作协议书
- 离婚协议书去哪里办
- tcp协议书栈源码
- 共同收款协议书
- 委托 经营 协议书
- 2025设备租赁合同与设备买卖合同的区别
- 婴儿用品促销方案运营
- 固态最快协议书
- 高考生物选择性必修2生物与环境基础知识填空默写(每天打卡)
- FZT 34002-2016 亚麻印染布行业标准
- 2023年高考物理(山东卷)真题评析及2024备考策略
- 全国身份证号地区对应表
- 主要机械设备表(汇总200种)
- GB/T 18386-2017电动汽车能量消耗率和续驶里程试验方法
- GB/T 17282-1998根据运动粘度确定石油分子量(相对分子质量)的方法
- GB/T 13912-2020金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
- GB 12326-2000电能质量电压波动和闪变
- 《空气动力学》配套教学课件
- 2022年泰安市中考英语试题(含答案)
评论
0/150
提交评论