iOS多张图片合成一个视频
ImageToVideo
前提是要懂AVFoundation中的AVAssetReader和AVAssetWriter的使用,最后面有demo
核心代码为,给AVAssetWriterInput加一个适配器对象这样就可以写入PixelBuffer,之后将图片转成PixelBuffer写入即可
//mov的格式设置 编码格式 宽度 高度
NSDictionary *videoSettings =[NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecH264,AVVideoCodecKey,[NSNumber numberWithInt:size.width],AVVideoWidthKey,[NSNumber numberWithInt:size.height],AVVideoHeightKey,nil];
AVAssetWriterInput *writerInput =[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];
NSDictionary*sourcePixelBufferAttributesDictionary =[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32ARGB],kCVPixelBufferPixelFormatTypeKey,nil];
// AVAssetWriterInputPixelBufferAdaptor提供CVPixelBufferPool实例,
// 可以使用分配像素缓冲区写入输出文件。使用提供的像素为缓冲池分配通常
// 是更有效的比添加像素缓冲区分配使用一个单独的池
AVAssetWriterInputPixelBufferAdaptor *adaptor =[AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput sourcePixelBufferAttributes:sourcePixelBufferAttributesDictionary];[writerInput requestMediaDataWhenReadyOnQueue:dispatchQueue usingBlock:^{//写入时的逻辑:将数组中的每一张图片多次写入到buffer中,while([writerInput isReadyForMoreMediaData]){//数组中一共7张图片此时写入490次if(++frame >=[imageArray count]*imageArray.count*10){[writerInput markAsFinished];[videoWriter finishWriting];// [videoWriterfinishWritingWithCompletionHandler:nil];break;}CVPixelBufferRef buffer =NULL;//每张图片写入70次换下一张int idx =frame/(imageArray.count*10);NSLog(@"idx==%d",idx);//将图片转成bufferbuffer = (CVPixelBufferRef)[self pixelBufferFromCGImage:[[imageArray objectAtIndex:idx] CGImage] size:size];if (buffer){//添加buffer并设置每个buffer出现的时间,每个buffer的出现时间为第n张除以30(30是一秒30张图片,帧率,也可以自己设置其他值)所以为frame/30,即CMTimeMake(frame,30)为每一个buffer出现的时间点if(![adaptor appendPixelBuffer:buffer withPresentationTime:CMTimeMake(frame,30)])//设置每秒钟播放图片的个数{NSLog(@"FAIL");}else{NSLog(@"OK");}CFRelease(buffer);}}
}];
以下为图片转buffer
- (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image size:(CGSize)size {
NSDictionary *options =[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],kCVPixelBufferCGImageCompatibilityKey,[NSNumber numberWithBool:YES],kCVPixelBufferCGBitmapContextCompatibilityKey,nil];
CVPixelBufferRef pxbuffer =NULL;
CVReturn status =CVPixelBufferCreate(kCFAllocatorDefault,size.width,size.height,kCVPixelFormatType_32ARGB,(__bridge CFDictionaryRef) options,&pxbuffer);
NSParameterAssert(status ==kCVReturnSuccess && pxbuffer !=NULL);
CVPixelBufferLockBaseAddress(pxbuffer,0);
void *pxdata =CVPixelBufferGetBaseAddress(pxbuffer);
NSParameterAssert(pxdata !=NULL);
CGColorSpaceRef rgbColorSpace=CGColorSpaceCreateDeviceRGB();
// 当你调用这个函数的时候,Quartz创建一个位图绘制环境,也就是位图上下文。当你向上下文中绘制信息时,Quartz把你要绘制的信息作为位图数据绘制到指定的内存块。一个新的位图上下文的像素格式由三个参数决定:每个组件的位数,颜色空间,alpha选项
CGContextRef context =CGBitmapContextCreate(pxdata,size.width,size.height,8,4*size.width,rgbColorSpace,kCGImageAlphaPremultipliedFirst);
NSParameterAssert(context);
//使用CGContextDrawImage绘制图片 这里设置不正确的话 会导致视频颠倒
// 当通过CGContextDrawImage绘制图片到一个context中时,如果传入的是UIImage的CGImageRef,因为UIKit和CG坐标系y轴相反,所以图片绘制将会上下颠倒
CGContextDrawImage(context,CGRectMake(0,0,CGImageGetWidth(image),CGImageGetHeight(image)), image);
// 释放色彩空间
CGColorSpaceRelease(rgbColorSpace);
// 释放context
CGContextRelease(context);
// 解锁pixel buffer
CVPixelBufferUnlockBaseAddress(pxbuffer,0);
return pxbuffer;
}
https://github.com/github-liuxu/ImageToVideo.git
iOS多张图片合成一个视频相关推荐
- python图片合成视频_把几张图片合成一个视频,有什么软件是免费的?
看到这个问题我第一个想到的就是自己在用的"万兴喵影"剪辑软件. 用了挺久的,所以对于里面的功能还是很清楚的. 接下来我就分布列出来给你们康康~ 第一步:导入图片 你可以单击&quo ...
- python ffmpeg 视频转图片 视频转音频 播放音频 多张图片+音频转视频 多个视频合成一个视频 改变视频播放速度
文章目录 视频转图片 视频转音频 播放音频 图片+音频 转 视频 多个视频合成一个视频 改变视频播放速度 视频转图片 #!/usr/bin/env python # -*- encoding: utf ...
- javaCV学习-1-环境搭建及测试多张图片合成一个mp4的视频
最近在自学用java语言如何进行处理音视频. 学习时,在网上找了一段代码,测试多张图片合成一个mp4的视频. 代码是: import org.bytedeco.ffmpeg.global.avcode ...
- 在python中将多张图片合成为视频
网上有很多程序示例描述了如何在python中将多张图片合成为视频,但好像都没有关注一个小问题--被合成的那些图片的尺寸应该一致,并且和程序中给定的参数一致.我遇到的问题就是,如果多张图片的尺寸不一致, ...
- 想要将多个视频拼接在一起?如何把三个视频合成一个视频
从事短视频创作行业以来,总是存在着各种挑战.最开始,因为主要负责视频素材的搜集,所以每天虽忙但充实,最近逐步开始学习视频的剪辑工作,可把我难到了!想要将多个视频拼接在一起?如何把三个视频合成一个视频? ...
- 多个视频如何合成一个视频?
多个视频如何合成一个视频?想必大家都有录制视频的经历,在录视频的时候,我们总会挑一些比较经典,比较重要的场景进行录制,这样到最后我们就得到了几段不同的视频文件.如果后期我们要分享这几段视频,大家说是一 ...
- ffmeg将多段视频合成一个视频
ffmeg将多段视频合成一个视频 文章目录: 一.方法一:利用文件列表 二.方法二:不利用文件列表 三. 方法三:拼接不同编码格式的文件 四.注意事项 要处理多段视频太费劲啦,如果直接把多段小视频合成 ...
- 两段视频合成一个视频用什么软件 怎么把两段视频合成一段看不出来
两段视频合成一个视频用什么软件?无论是两段视频的合成,还是三段视频的合成,用视频编辑软件都能轻松搞定.但怎么把两段视频合成一段看不出来?这就比较考验制作者的功力了,不过我们还是有捷径的,下面一起来看看 ...
- 好几张图片合成一个PDF,不能错过的小技巧!
图片可以说是我们日常生活中就经常接触的文件啦,我们只要拥有摄像设备,在很多不同场景下都可以实现拍照自由.可是随着我们的图片文件的增多,我们会更多使用一些方法来更好保存这些比较珍贵的图像.比较常用的有把 ...
- 电脑怎样把几个视频合成一个视频
电脑怎样把几个视频合成一个视频?在最近2年的新媒体的运营工作中,我们越来越多地遇到短视频的内容,对于视频的处理工作来说是一种新的需求也是新的职场技能.其实针对那种专业的视频处理工具我们一般运营人员都难 ...
最新文章
- 大数据实验报告总结体会_大数据挖掘流程及方法总结
- 去掉字符串左右的空格
- 《Two Dozen Short Lessons in Haskell》学习(十六)- Definitions with Alternatives
- 绿色vmware 安装后看不到虚拟的网卡
- log4j 新建日志 重启_Log4j 动态修改日志级别,不用重启服务器
- redis 值字符串前面部分乱码_redis key乱码
- 自动出报表,零代码做驾驶舱,我找到了Excel的顶级替代
- vue多页面开发_使用VUE进行移动端H5页面开发前准备
- 文件夹恶意软件WORM_AUTORUN.FIU处理
- 直销立法前狼奔豕突 非法传销组织如何转型
- office2007加载缓慢_word2007打开很慢的解决方法
- eclipse Helio项目简介
- C++:从入门到放弃[2]变量和读入
- win7下l2pt/sec 的789报错解决
- 用iSee图片专家制作淘宝店标教程
- 基于51单片机的频率计
- 未来广播电视新技术的发展和应用
- python基础学习笔记之数据基本类型:逻辑值
- 原生android系统小米4,评测小米手机原生系统4.0怎么样
- cisco 的六种模式(cisco 系统)