20190715更新

该方法没有对视频帧进行编码压缩,生成的视频很大,而且不能在windows自带的播放器上播放。

后来在网上找到了一段代码,修改之后满足了自己的需求,封装成了一个类,可以将png\jpg格式的图片合成为mp4或者avi格式的视频,其中因为读取硬盘图片用的是自己的一个库(主要用到的功能是:读取图片数据区,对图片进行格式转换),这一部分可以根据大家自己手上已有的代码资源进行替代,这里实验用到的png和jpg都是24bit的,32位也可以,最终都转化为32bit了。另,因为我这个图片读取库只能读2^n的图片,所以我用的是2048*1024的图片,如果你的库可以读任意分辨率的图片应该也是可以的。

调用类的代码如下:

#if 1
#include "VideoCapture2.h"#define DATASIZE 2048*2048int main()
{VideoCapture2* video = new VideoCapture2();video->Init(1332, 620, 25, 21000, "D:\\9\\outputVideo\\xxzx\\mp4\\temp_record_png_21000.mp4");//[bitrate]mp4:21000; avi:210int frame_index = 0;char buf[250] = { 0 };unsigned char *mydata = new unsigned char[DATASIZE];std::string dir = "D:\\9\\inputImg\\png2048_1024\\";while (frame_index < 50)//将图像压入视频中2250{_snprintf(buf, 255, "1_0%04d.png", frame_index);//1_00000std::string filePath = dir + buf;beCore::Ptr<beResource::Image> tempImg = beResource::Image::CreateFromFile(filePath);if (!tempImg){break;}video->AddFrame(tempImg);std::cout << frame_index << std::endl;frame_index++;}video->Finish();return 0;
}

//****************************************************************************************************************************

#include <stdio.h>extern "C"//包含C文件头
{
#include "libavformat/avformat.h"
};
#define DATASIZE 2048*2048AVStream *add_vidio_stream(AVFormatContext *oc, enum AVCodecID codec_id)//用以初始化一个用于输出的AVFormatContext结构体
{AVStream *st;AVCodec *codec;st = avformat_new_stream(oc, NULL);if (!st){printf("Could not alloc stream\n");exit(1);}codec = avcodec_find_encoder(codec_id);//查找mjpeg解码器if (!codec){printf("codec not found\n");exit(1);}avcodec_get_context_defaults3(st->codec, codec);//申请AVStream->codec(AVCodecContext对象)空间并设置默认值(由avcodec_get_context_defaults3()设置st->codec->bit_rate = 400000;//设置采样参数,即比特率  st->codec->width = 1332;//设置视频宽高,这里跟图片的宽高保存一致即可st->codec->height = 620;st->codec->time_base.den = 25;//设置帧率st->codec->time_base.num = 1;st->codec->pix_fmt = AV_PIX_FMT_YUV420P;//设置像素格式  st->codec->codec_tag = 0;if (oc->oformat->flags & AVFMT_GLOBALHEADER)//一些格式需要视频流数据头分开st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;return st;
}void main()
{AVFormatContext *ofmt_ctx = NULL;//其包含码流参数较多,是一个贯穿始终的数据结构,很多函数都要用到它作为参数const char *out_filename = "d:\\out.mp4";//输出文件路径,在这里也可以将mkv改成别的ffmpeg支持的格式,如mp4,flv,avi之类的int ret;//返回标志av_register_all();//初始化解码器和复用器avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);//初始化一个用于输出的AVFormatContext结构体,视频帧率和宽高在此函数里面设置if (!ofmt_ctx){printf("Could not create output context\n");return;}//AVStream *out_stream = add_vidio_stream(ofmt_ctx, AV_CODEC_ID_MJPEG);//创造输出视频流AVStream *out_stream = add_vidio_stream(ofmt_ctx, AV_CODEC_ID_PNG);//创造输出视频流(第三个参数指向图片的格式)av_dump_format(ofmt_ctx, 0, out_filename, 1);//该函数会打印出视频流的信息,如果看着不开心可以不要if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE))//打开输出视频文件{ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);if (ret < 0) {printf("Could not open output file '%s'", out_filename);return;}}if (avformat_write_header(ofmt_ctx, NULL) < 0)//写文件头(Write file header){printf("Error occurred when opening output file\n");return;}int frame_index = 0;//放入视频的图像计数unsigned char *mydata = new unsigned char[DATASIZE];AVPacket pkt;av_init_packet(&pkt);pkt.flags |= AV_PKT_FLAG_KEY;pkt.stream_index = out_stream->index;//获取视频信息,为压入帧图像做准备char buf[250] = { 0 };while (frame_index < 626)//将图像压入视频中{_snprintf(buf, 255, "1_00%03d.png", frame_index);//1_00000std::string dir = "F:\\帧转视频\\data5\\";std::string filePath = dir + buf;FILE *file;//打开一张jpeg图像并读取其数据,在这里图像最大为1M,如果超过1M,则需要修改1024*1024这里fopen_s(&file, filePath.c_str(), "rb");pkt.size = fread(mydata, 1, DATASIZE, file);pkt.data = mydata;fclose(file);if (av_interleaved_write_frame(ofmt_ctx, &pkt) < 0) //写入图像到视频{printf("Error muxing packet\n");break;}printf("Write %8d frames to output file\n", frame_index);//打印出当前压入的帧数frame_index++;}av_free_packet(&pkt);//释放掉帧数据包对象av_write_trailer(ofmt_ctx);//写文件尾(Write file trailer)delete[]mydata;//释放数据对象if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))avio_close(ofmt_ctx->pb);//关闭视频文件avformat_free_context(ofmt_ctx);//释放输出视频相关数据结构return;
}

【C++】ffmpeg将png/jpg图片序列转成mp4/avi相关推荐

  1. 将图片序列压缩成视频

    原文链接:http://blog.csdn.net/carson2005/article/details/7085480 有些时候,我们确实需要将一个图片序列压缩成视频文件,从而方便观看,或者给别人展 ...

  2. 利用Python将图片序列转换成视频

    文章参考该博客 https://blog.csdn.net/weixin_42265958/article/details/108219472 import cv2 import os import ...

  3. ffmpeg实现将H264裸流封装成.mp4或.avi文件

    ffmpeg学习历程 由于我是移植到arm-linux环境(海思HI3521A),H264裸流直接从海思的编码模块VENC获取. H264数据流序列:    SPS, PPS, SEI, I, P, ...

  4. ffmpeg将mov格式的视频转换成mp4格式

    import os # 获取目录下的所有文件列表 import fnmatch # 文件格式筛选模块,筛选指定格式文件#遍历 def dirlist(path, allfile):filelist = ...

  5. 使用ffmpeg将多个TS视频拼接成mp4视频

    1.下载安装ffmpeg 点击下面网址下载对应版本安装 https://ffmpeg.org/download.html 下载好之后添加环境变量 添加成功之后在cmd窗口输入ffmpeg,显示如下结果 ...

  6. 用python和ffmpeg批量合成bilibili缓存的m4s成mp4

    我的目录格式是这样的 所以直接脚本处理一下就好了 ffmpeg安装:https://ffmpeg.zeranoe.com/builds/win64/static/ 直接去上面链接里找一个下载解压 哪个 ...

  7. 利用ffmpeg将.m4s的视频格式转换成.mp4

    下载ffmpeg 下载地址:https://www.gyan.dev/ffmpeg/builds/ 点击红色链接就可以下载,一般下载.zip格式就好,当然也可以选择.7z 题外话:什么是ffmpeg ...

  8. OpenCV 视频与图片序列相互转换 VideoWriter生成视频流

    OpenCV学习笔记(四十七)--VideoWriter生成视频流highgui http://blog.csdn.net/yang_xian521/article/details/7440190 标 ...

  9. ffmpeg图片序列转视频或者GIF

    图片序列转换为视频 ffmpeg -f image2 -i ./tmp/%04d.png movie.mp4 视频转换为GIF ffmpeg -i test.mp4 test.gif 图片序列转换为G ...

最新文章

  1. 独家 | ​采用BERT的无监督NER(附代码)
  2. SecureCRT Application 已停止工作
  3. ctypealpha php_PHP Ctype函数(转)
  4. PCL Lesson1 :PCL库PCLVisualizer的简单使用
  5. 【面试必备】CSS盒模型的点点滴滴
  6. 中国省级行政区划变动情况
  7. hive系列-hive教程
  8. mpu6050惯性导航学习记录
  9. nginx ajax 错误500,聊聊nginx报错499问题
  10. 历尽磨难,探索未来生活的2014年
  11. 如何量化你的用户价值?——RFM模型分析实战
  12. 【线段树区间合并】BZOJ1593-[Usaco2008 Feb]Hotel 旅馆
  13. windows 10桌面快捷方式小箭头
  14. Java、JSP汽车零件销售管理系统的设计与实现
  15. CSS3画八卦太极图(绕一个圆旋转)
  16. 毕业设计-基于微信小程序的实验室仪器设备管理系统
  17. 卸载jdk(JAVA开发环境)
  18. 多个PDF怎么合并到一起?分享两种好用的合并方法
  19. iphone忘记访问控制密码之后如何找回
  20. 检测服务器端口是否被封(墙)

热门文章

  1. C++智能指针3——弱指针weak_ptr详解
  2. 解析人工智能的技术演变线索
  3. LightOJ 1248 - Dice (III) 给一个质地均匀的n的骰子, 求投掷出所有点数至少一次的期望次数。(概率)...
  4. Java实验报告多线程_java多线程实验报告.doc
  5. 基于5G/4G边缘网关的建筑机器人应用
  6. 计算机一级考试成绩分析,计算机一级考试成绩分析与总结
  7. 双粗虚线中间一条实线_高速公路虚线两加一行虚线是什么意思
  8. 全国计算机等级考试 备考,如何备考全国计算机二级等级考试
  9. Thunderbird使用教程\好用的邮件客户端
  10. Kubernetes 三节点安装-完整可用