ffmpeg解码视频存为BMP文件

这个博客展示了如何使用ffmpeg库将视频文件解码,并将每一帧转换为BMP图像文件进行保存。通过注册编解码器,打开视频文件,找到视频流,然后打开解码器,为每一帧分配内存并进行图像格式转换,最终保存为BMP格式。代码中涉及了AVFrame、AVFormatContext、AVPacket等关键结构和函数。
摘要由CSDN通过智能技术生成
#include <windows.h>
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma once  

 #ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>


#ifdef __cplusplus
}
#endif

//定义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; 
  
Qt是一种跨平台的C++应用程序开发框架,可以使用Qt实现将视频文件换为bmp文件形式。 一般的视频文件是以AVI、MP4等格式存在,需要先对视频进行解码操作,获取每一帧的像素数据,然后再将像素数据换为bmp格式的图片,最后保存为bmp文件。 Qt中可以使用FFmpeg库进行视频解码操作,获取每一帧的像素数据;使用Qt的QImage类可以将像素数据换为Qt可识别的格式;最后使用QImage类的save函数将每一帧图片保存为bmp格式的文件即可。 具体的实现过程可以分为以下几个步骤: 1. 加载视频文件,使用FFmpeg库进行解码,获取每一帧的像素数据。 2. 将像素数据换为QImage格式的图片。 3. 保存QImage格式的图片为bmp格式的文件,可以使用QImage类的save函数。 代码示例: ``` #include <QtCore> #include <QtGui> extern "C" { #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h> } int main(int argc, char **argv) { av_register_all(); avcodec_register_all(); avformat_network_init(); AVFormatContext *pFormatCtx = NULL; if (avformat_open_input(&pFormatCtx, argv[1], NULL, NULL) != 0) { return -1; } if (avformat_find_stream_info(pFormatCtx, NULL) < 0) { return -1; } int video_stream_index = -1; for (int i = 0; i < pFormatCtx->nb_streams; i++) { if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { video_stream_index = i; break; } } if (video_stream_index == -1) { return -1; } AVCodecContext *pCodecCtx = pFormatCtx->streams[video_stream_index]->codec; AVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id); if (pCodec == NULL) { return -1; } if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { return -1; } AVFrame *pFrame = av_frame_alloc(); AVFrame *pFrameRGB = av_frame_alloc(); uint8_t *buffer = (uint8_t *)av_malloc(avpicture_get_size(AV_PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height)); avpicture_fill((AVPicture *)pFrameRGB, buffer, AV_PIX_FMT_RGB24, pCodecCtx->width, pCodecCtx->height); struct SwsContext *img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL); AVPacket packet; int frame_finished; QImage image; int frame_count = 0; while (av_read_frame(pFormatCtx, &packet) >= 0) { if (packet.stream_index == video_stream_index) { avcodec_decode_video2(pCodecCtx, pFrame, &frame_finished, &packet); if (frame_finished) { sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize); image = QImage(pFrameRGB->data[0], pCodecCtx->width, pCodecCtx->height, QImage::Format_RGB888); QString filename = QString("%1_%2.bmp").arg(argv[2]).arg(frame_count++); image.save(filename, "BMP"); } } av_free_packet(&packet); } av_frame_free(&pFrame); av_frame_free(&pFrameRGB); av_free(buffer); sws_freeContext(img_convert_ctx); avcodec_close(pCodecCtx); avformat_close_input(&pFormatCtx); return 0; } ``` 该代码示例将指定的视频文件换为bmp格式的文件,需要传入两个参数,第一个参数为视频文件路径,第二个参数为输出的bmp文件名前缀。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值