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多张图片合成一个视频相关推荐

  1. python图片合成视频_把几张图片合成一个视频,有什么软件是免费的?

    看到这个问题我第一个想到的就是自己在用的"万兴喵影"剪辑软件. 用了挺久的,所以对于里面的功能还是很清楚的. 接下来我就分布列出来给你们康康~ 第一步:导入图片 你可以单击&quo ...

  2. python ffmpeg 视频转图片 视频转音频 播放音频 多张图片+音频转视频 多个视频合成一个视频 改变视频播放速度

    文章目录 视频转图片 视频转音频 播放音频 图片+音频 转 视频 多个视频合成一个视频 改变视频播放速度 视频转图片 #!/usr/bin/env python # -*- encoding: utf ...

  3. javaCV学习-1-环境搭建及测试多张图片合成一个mp4的视频

    最近在自学用java语言如何进行处理音视频. 学习时,在网上找了一段代码,测试多张图片合成一个mp4的视频. 代码是: import org.bytedeco.ffmpeg.global.avcode ...

  4. 在python中将多张图片合成为视频

    网上有很多程序示例描述了如何在python中将多张图片合成为视频,但好像都没有关注一个小问题--被合成的那些图片的尺寸应该一致,并且和程序中给定的参数一致.我遇到的问题就是,如果多张图片的尺寸不一致, ...

  5. 想要将多个视频拼接在一起?如何把三个视频合成一个视频

    从事短视频创作行业以来,总是存在着各种挑战.最开始,因为主要负责视频素材的搜集,所以每天虽忙但充实,最近逐步开始学习视频的剪辑工作,可把我难到了!想要将多个视频拼接在一起?如何把三个视频合成一个视频? ...

  6. 多个视频如何合成一个视频?

    多个视频如何合成一个视频?想必大家都有录制视频的经历,在录视频的时候,我们总会挑一些比较经典,比较重要的场景进行录制,这样到最后我们就得到了几段不同的视频文件.如果后期我们要分享这几段视频,大家说是一 ...

  7. ffmeg将多段视频合成一个视频

    ffmeg将多段视频合成一个视频 文章目录: 一.方法一:利用文件列表 二.方法二:不利用文件列表 三. 方法三:拼接不同编码格式的文件 四.注意事项 要处理多段视频太费劲啦,如果直接把多段小视频合成 ...

  8. 两段视频合成一个视频用什么软件 怎么把两段视频合成一段看不出来

    两段视频合成一个视频用什么软件?无论是两段视频的合成,还是三段视频的合成,用视频编辑软件都能轻松搞定.但怎么把两段视频合成一段看不出来?这就比较考验制作者的功力了,不过我们还是有捷径的,下面一起来看看 ...

  9. 好几张图片合成一个PDF,不能错过的小技巧!

    图片可以说是我们日常生活中就经常接触的文件啦,我们只要拥有摄像设备,在很多不同场景下都可以实现拍照自由.可是随着我们的图片文件的增多,我们会更多使用一些方法来更好保存这些比较珍贵的图像.比较常用的有把 ...

  10. 电脑怎样把几个视频合成一个视频

    电脑怎样把几个视频合成一个视频?在最近2年的新媒体的运营工作中,我们越来越多地遇到短视频的内容,对于视频的处理工作来说是一种新的需求也是新的职场技能.其实针对那种专业的视频处理工具我们一般运营人员都难 ...

最新文章

  1. 大数据实验报告总结体会_大数据挖掘流程及方法总结
  2. 去掉字符串左右的空格
  3. 《Two Dozen Short Lessons in Haskell》学习(十六)- Definitions with Alternatives
  4. 绿色vmware 安装后看不到虚拟的网卡
  5. log4j 新建日志 重启_Log4j 动态修改日志级别,不用重启服务器
  6. redis 值字符串前面部分乱码_redis key乱码
  7. 自动出报表,零代码做驾驶舱,我找到了Excel的顶级替代
  8. vue多页面开发_使用VUE进行移动端H5页面开发前准备
  9. 文件夹恶意软件WORM_AUTORUN.FIU处理
  10. 直销立法前狼奔豕突 非法传销组织如何转型
  11. office2007加载缓慢_word2007打开很慢的解决方法
  12. eclipse Helio项目简介
  13. C++:从入门到放弃[2]变量和读入
  14. win7下l2pt/sec 的789报错解决
  15. 用iSee图片专家制作淘宝店标教程
  16. 基于51单片机的频率计
  17. 未来广播电视新技术的发展和应用
  18. python基础学习笔记之数据基本类型:逻辑值
  19. 原生android系统小米4,评测小米手机原生系统4.0怎么样
  20. cisco 的六种模式(cisco 系统)

热门文章

  1. 浏览器被7654和2345网页劫持解决办法
  2. 重新定义QLabel的clicked事件
  3. Docker--一门值得你学习的手艺
  4. dota2 服务器尚未更新到最新版本,dota2更新不动_steam dota2更新不动
  5. MYSQL 安装时出现的问题error: Failed dependencies
  6. python结束函数_python函数结束
  7. 分而治之——最大子列和
  8. 几个大学生7天涨粉百万,月入超过10万,5000字长文拆解
  9. 英语长难句之分裂结构-学习笔记
  10. docker批量导出导入全部镜像