,转载)ffmpe---实现将视频存储为图片jpg

技术,转载)ffmpe---实现将视频存储为图片jpg (转载)ffmpe---实现将视频存储为图片jpg原文出自:https://images1.tqwba.com/20211201/xuqcjtf4

(转载)ffmpe -实现将视频存储为图片使用联合图象专家组文件交换格式存储的编码图像文件扩展名

原文出自:https://images 1 . tqwba.com/20211201/xuqcjtf 4 ewe ',' e :/QT/test _ ffmpegSavePic/ffmpeg/output/',索引);

sprintf_s(out_file),sizeof(out_file),' %s%d.jpg ','./output/',index);

//分配AVFormatContext对象

AVFormatContext * pfformactx=avformat _ alloc _ context();

//设置输出文件格式

pfformactx-oformat=av _ guess _ format(' mjpeg ',NULL,NULL);

//创建并初始化一个和该全球资源定位器(统一资源定位符)相关的AVIOContext

if(AVIO _ open(pfformactx-Pb,out_file,AVIO_FLAG_READ_WRITE) 0)

{

printf('无法打开输出文件');

返回-1;

}

//构建一个新溪流

AVStream * PavStream=avformat _ new _ stream(pfformactx,0);

if (pAVStream==空)

{

返回-1;

}

//设置该溪流的信息

AVCodecContext * pcodectx=Pavlastream-codec;

pcodectx-codec _ id=pfformactx-oformat-video _ codec;

pcodectx-codec _ TYPE=AVMEDIA _ TYPE _ VIDEO;

pcodectx-PIX _ fmt=AV _ PIX _ FMT _ yuvj 420 p;

pcodectx-width=width;

pcodectx-高度=高度;

pcodectx-时基。num=1;

pcodectx-时基。den=25

//打印输出相关信息

av _ dump _ format(pfformactx,0,out_file,1);

//==================================查找编码器==================================//

AVCodec * pCodec=AVCodec _ find _ encoder(pcodectx-codec _ id);

if(!pCodec)

{

printf('找不到编解码器');

返回-1;

}

//设置pCodecCtx的解码器为pCodec

if(av codec _ open 2(pcodectx,pCodec,NULL) 0)

{

printf('无法打开编解码器');

返回-1;

}

//=====================================写入标头=====================================//

avformat _ write _ header(pfformactx,NULL);

int y _ size=pcodectx-宽度* pcodectx-高度;

//====================================编码==================================//

//给AVPacket分配足够大的空间

AVPacket pkt

av_new_packet(pkt,y _ size * 3);

int get _ picture=0;

int ret=avcodec _ encode _ video 2(pcodectx,pkt,pFrame,got _ picture);

if (ret 0)

{

printf('编码错误\\ n ');

返回-1;

}

if(get _ picture==1)

{

PKT。stream _ index=PavStream-index;

ret=av _ write _ frame(pfformactx,PKT);

}

av _ free _ packet(PKT);

//写预告片

av_write_trailer(pF

ormatCtx);
//if (pFrame){
// av_frame_unref(pFrame);
//}
if (pAVStream)
{
avcodec_close(pAVStream-codec);
}
avio_close(pFormatCtx-pb);
avformat_free_context(pFormatCtx);
return 0;
}
//没有完全源代码,自己修改过的
void FFmpegDemo::on_pictureBtn2_clicked()
{
//1.FFMPEG初始化操作
av_register_all(); //初始化FFMPEG 调用了这个才能正常适用编码器和解码器
//=========================== 创建AVFormatContext结构体 ===============================//
//分配一个AVFormatContext,FFMPEG所有的操作都要通过这个AVFormatContext来进行
AVFormatContext *pFormatCtx = avformat_alloc_context();
//==================================== 打开文件 ======================================//
char *file_path = "./2.mp4";//这里必须使用左斜杠
int ret = avformat_open_input(pFormatCtx, file_path, NULL, NULL);
if (ret != 0)
{
cout "open error!" endl;
return ;
}
//循环查找视频中包含的流信息,直到找到视频类型的流
//便将其记录下来 保存到videoStream变量中
int i;
int videoStream;
//=================================== 获取视频流信息 ===================================//
if (avformat_find_stream_info(pFormatCtx, NULL) 0)
{
cout "Could't find stream infomation." endl;
return ;
}
videoStream = -1;
for (i = 0; i pFormatCtx-nb_streams; i++)
{
if (pFormatCtx-streams[i]-codec-codec_type == AVMEDIA_TYPE_VIDEO)
{
videoStream = i;
}
}
//如果videoStream为-1 说明没有找到视频流
if (videoStream == -1)
{
cout "Didn't find a video stream." endl;
return ;
}
//================================= 查找解码器 ===================================//
AVCodecContext* pCodecCtx = pFormatCtx-streams[videoStream]-codec;
AVCodec* pCodec = avcodec_find_decoder(pCodecCtx-codec_id);
if (pCodec == NULL)
{
cout "Codec not found." endl;
return ;
}
//================================ 打开解码器 ===================================//
if (avcodec_open2(pCodecCtx, pCodec, NULL) 0)// 具体采用什么解码器ffmpeg经过封装 我们无须知道
{
cout "Could not open codec." endl;
return ;
}
//================================ 设置数据转换参数 ================================//
SwsContext * img_convert_ctx;
img_convert_ctx = sws_getContext(pCodecCtx-width, pCodecCtx-height, pCodecCtx-pix_fmt, //源地址长宽以及数据格式
pCodecCtx-width, pCodecCtx-height, AV_PIX_FMT_YUVJ420P, //目的地址长宽以及数据格式
SWS_BICUBIC, NULL, NULL, NULL);//算法类型 AV_PIX_FMT_YUVJ420P AV_PIX_FMT_BGR24
//==================================== 分配空间 ==================================//
//一帧图像数据大小
int numBytes = avpicture_get_size(AV_PIX_FMT_YUVJ420P, pCodecCtx-width, pCodecCtx-height);
unsigned char *out_buffer;
out_buffer = (unsigned char *)av_malloc(numBytes * sizeof(unsigned char));
AVFrame * pFrame;
pFrame = av_frame_alloc();
AVFrame * pFrameRGB;
pFrameRGB = av_frame_alloc();
avpicture_fill((AVPicture *)pFrameRGB, out_buffer, AV_PIX_FMT_YUVJ420P, pCodecCtx-width, pCodecCtx-height);
//会将pFrameRGB的数据按RGB格式自动"关联"到buffer 即pFrameRGB中的数据改变了 out_buffer中的数据也会相应的改变
//=========================== 分配AVPacket结构体 ===============================//
int y_size = pCodecCtx-width * pCodecCtx-height;
AVPacket *packet = (AVPacket *)malloc(sizeof(AVPacket)); //分配一个packet
av_new_packet(packet, y_size); //分配packet的数据
//2.循环采集视频流数据 将其转换为图片
//=========================== 读取视频信息 ===============================//
int index = 0;
//读取的是一帧视频 数据存入一个AVPacket的结构中
while (av_read_frame(pFormatCtx, packet) = 0)
{
//此时数据存储在packet中
if (packet packet-stream_index == videoStream)
{
//视频解码函数 解码之后的数据存储在 pFrame中
int got_picture = 0;
ret = avcodec_decode_video2(pCodecCtx, pFrame, got_picture, packet);
if (ret 0)
{
cout "decode error." endl;
return;
}
//转换一帧图像
sws_scale(img_convert_ctx, pFrame-data, pFrame-linesize, 0,
pCodecCtx-height, //源
pFrameRGB-data, pFrameRGB-linesize); //目的
SaveAsJPEG(pFrameRGB, pCodecCtx-width, pCodecCtx-height, index++); //保存图片
}
}
free(packet);
av_frame_free(pFrameRGB);
av_frame_free(pFrame);
avcodec_close(pCodecCtx);
avformat_free_context(pFormatCtx);
}

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/128328.html

(0)

相关推荐

  • python计算变量间的相关系数(python计算多元变量的相关系数)

    技术Python协方差与相关系数怎么定义本篇内容介绍了“Python协方差与相关系数怎么定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅

    攻略 2021年12月21日
  • 日本哪里好玩,日本有那些好吃好玩的地方

    技术日本哪里好玩,日本有那些好吃好玩的地方我想:每个人去日本旅行的想法不同日本哪里好玩,所以什么样的旅行才能称得上是最完美呢?或许没有正确答案。而日本国家观光协会一直致力于向外国游客推介聚集尖端技术或最新流行的大都会观光

    生活 2021年11月1日
  • 如何修改图片大小尺寸,如何修改照片的尺寸和大小

    技术如何修改图片大小尺寸,如何修改照片的尺寸和大小使用美图秀秀可以做到如何修改图片大小尺寸。1、打开“美图秀秀”,点击“打开图片”,这里选择一个后缀为”jpg”图片文件。2、打开图片后,在屏幕的右下角点击”EXIF“,可

    生活 2021年10月20日
  • ppg是什么意思,化妆品peg/ppg是什么意思

    技术ppg是什么意思,化妆品peg/ppg是什么意思PEG/PPG-15/30 产品外观ppg是什么意思:无色到清透的淡黄色液体
    INCI名称:PEG/PPG 25/30CPPOLYMER
    性能与用途:消除护肤品粘感

    生活 2021年10月30日
  • MYSQL有哪些运算符

    技术MYSQL有哪些运算符这篇文章主要介绍“MYSQL有哪些运算符”,在日常操作中,相信很多人在MYSQL有哪些运算符问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MYSQL有哪些运算符”

    攻略 2021年11月9日
  • Java的基础语法有什么

    技术Java的基础语法有什么这篇文章主要讲解了“Java的基础语法有什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的基础语法有什么”吧!准备工作Dos命令配置

    攻略 2021年11月30日