利用FFmpeg将视频文件生成bmp图像帧(解决反转问题)
来源:互联网 发布:windows自带c编译器 编辑:程序博客网 时间:2024/06/17 08:16
#include <stdio.h> #include "avformat.h" typedef struct tagBITMAPFILEHEADER { typedef struct tagBITMAPINFOHEADER{ #endif void SaveAsBMP (AVFrame *pFrameRGB, int width, int height, int index, int bpp) char filename[20] = "R://test"; bmpheader.bfType = 0x4d42; bmpinfo.biSize = sizeof(BITMAPINFOHEADER); fwrite (&bmpheader, sizeof(bmpheader), 1, fp); fclose(fp); int main (void) av_register_all(); if ( av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL) != 0 ) if ( av_find_stream_info(pFormatCtx) < 0 ) for ( i=0; i<pFormatCtx->nb_streams; i++ ) if (videoStream == -1) pCodecCtx = pFormatCtx->streams[videoStream]->codec; pCodec = avcodec_find_decoder (pCodecCtx->codec_id); if (pCodec == NULL) pFrame = avcodec_alloc_frame(); PictureSize = avpicture_get_size (PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height); buf = av_malloc(PictureSize); if ( buf == NULL ) avpicture_fill ( (AVPicture *)pFrameRGB, buf, PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height); pSwsCtx = sws_getContext (pCodecCtx->width, i = 0; while(av_read_frame(pFormatCtx, &packet) >= 0) SaveAsBMP (pFrameRGB, pCodecCtx->width, pCodecCtx->height, i++, 24); sws_freeContext (pSwsCtx); return 0;
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "avcodec.h"
#include "swscale.h"
#pragma comment (lib, "avcodec.lib")
#pragma comment (lib, "avformat.lib")
#pragma comment (lib, "avutil.lib")
#pragma comment (lib, "swscale.lib")
#ifndef _WINGDI_
#define _WINGDI_
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
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;
{
char buf[5] = {0};
BITMAPFILEHEADER bmpheader;
BITMAPINFOHEADER bmpinfo;
FILE *fp;
_itoa (index, buf, 10);
strcat (filename, buf);
strcat (filename, ".bmp");
if ( (fp=fopen(filename,"wb+")) == NULL )
{
printf ("open file failed!/n");
return;
}
bmpheader.bfReserved1 = 0;
bmpheader.bfReserved2 = 0;
bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmpheader.bfSize = bmpheader.bfOffBits + width*height*bpp/8;
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 (&bmpinfo, sizeof(bmpinfo), 1, fp);
fwrite (pFrameRGB->data[0], width*height*bpp/8, 1, fp);
}
{
unsigned int i = 0, videoStream = -1;
AVCodecContext *pCodecCtx;
AVFormatContext *pFormatCtx;
AVCodec *pCodec;
AVFrame *pFrame, *pFrameRGB;
struct SwsContext *pSwsCtx;
const char *filename = "test.avi";
AVPacket packet;
int frameFinished;
int PictureSize;
uint8_t *buf;
{
printf ("av open input file failed!/n");
exit (1);
}
{
printf ("av find stream info failed!/n");
exit (1);
}
if ( pFormatCtx->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO )
{
videoStream = i;
break;
}
{
printf ("find video stream failed!/n");
exit (1);
}
{
printf ("avcode find decoder failed!/n");
exit (1);
}
if ( avcodec_open(pCodecCtx, pCodec)<0 )
{
printf ("avcode open failed!/n");
exit (1);
}
pFrameRGB = avcodec_alloc_frame();
if ( (pFrame==NULL)||(pFrameRGB==NULL) )
{
printf("avcodec alloc frame failed!/n");
exit (1);
}
{
printf( "av malloc failed!/n");
exit(1);
}
pCodecCtx->height,
pCodecCtx->pix_fmt,
pCodecCtx->width,
pCodecCtx->height,
PIX_FMT_BGR24,
SWS_BICUBIC,
NULL, NULL, NULL);
{
if(packet.stream_index==videoStream)
{
avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, packet.data, packet.size);
if(frameFinished)
{
//反转图像
//*(pFrame->data[0]) = pCodecCtx->width * (pCodecCtx->height-1);
//pFrame ->linesize[0] = -(pCodecCtx->height);
pFrame->data[0] += pFrame->linesize[0] * (pCodecCtx->height - 1);
pFrame->linesize[0] *= -1;
pFrame->data[1] += pFrame->linesize[1] * (pCodecCtx->height / 2 - 1);
pFrame->linesize[1] *= -1;
pFrame->data[2] += pFrame->linesize[2] * (pCodecCtx->height / 2 - 1);
pFrame->linesize[2] *= -1;
sws_scale (pSwsCtx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
}
}
av_free_packet(&packet);
}
av_free (pFrame);
av_free (pFrameRGB);
avcodec_close (pCodecCtx);
av_close_input_file (pFormatCtx);
}
- 利用FFmpeg将视频文件生成bmp图像帧(解决反转问题)
- 利用FFmpeg将视频文件生成bmp图像帧(解决反转问题)
- 利用FFmpeg将视频文件生成bmp图像帧
- 通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)
- ffmpeg将一个视频文件解码输出bmp和jpg文件--重写tutorial01程序
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
- ffmpeg python批处理视频文件 增加关键帧 解决seekTo不准确问题
- 利用ffmpeg解析视频文件信息
- VTK利用BMP图像序列生成表面模型
- 【学习ffmpeg】打开视频文件,帧分析,并bmp保存关键帧
- 解决nginx利用image_filter动态生成缩略图不支持bmp
- ffmpeg从视频文件中读取成bmp图片
- ffmpeg从视频文件中读取成bmp图片
- ffmpeg从视频文件中读取成bmp图片
- ffmpeg从视频文件中读取成bmp图片
- 关于用FFMPEG截取视频图像保存为BMP图像颠倒及颜色不正常的问题
- 通过FFmpeg将多媒体文件解码后保存成Bmp图像.
- 用Jquery和JTemplates来处理JSON数据
- 永不过时的Lisp
- 中文汉字编码技术的探索、突破与拓展
- 复制数组(
- 手把手教你使用Flex 3——《Flex 3程序设计》
- 利用FFmpeg将视频文件生成bmp图像帧(解决反转问题)
- cmd下重启iis命令
- Oracle10.2限制(取自官方文档)
- 找不到可安装的ISAM 错误的解决方案!
- 生成子系统树的方法:
- Java动态代理
- 随机验证码
- 图片无缝向左滚动
- 删除存储过程