视频分解图片,图片合成视频
工作当中用到了相关的技术,现在特别记录一下
分解视频
//分解视频
- (void)resolveMovWithUrl:(NSURL *)movUrl{//得到url的资源,转为assetAVAsset *myAsset = [[AVURLAsset alloc] initWithURL:movUrl options:nil];NSParameterAssert(myAsset);//初始化AVAssetImageGeneratorself.imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:myAsset] ;self.imageGenerator.appliesPreferredTrackTransform = YES;//加这句话,取出的是正确方向的图片self.imageGenerator.requestedTimeToleranceBefore = kCMTimeZero;self.imageGenerator.requestedTimeToleranceAfter = kCMTimeZero;//得到秒数Float64 _durationSeconds = CMTimeGetSeconds([myAsset duration]);__block float Second = 0.0;__block int num = 0;NSString *path = [self backPath];NSLog(@"%@",path);dispatch_semaphore_t sem = dispatch_semaphore_create(0);dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{dispatch_async(dispatch_get_main_queue(), ^{[MBProgressHUD showHUDAddedTo:self.view animated:YES];});while ((_durationSeconds - Second)>0) {NSLog(@"%f",_durationSeconds - Second);CMTime rTime = CMTimeMakeWithSeconds(Second, NSEC_PER_SEC);dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{@autoreleasepool{//根据帧数取出图片CGImageRef image= [self.imageGenerator copyCGImageAtTime:rTime actualTime:NULL error:NULL];if (image){UIImage *img = [[UIImage alloc] initWithCGImage:image];NSData *imageData = UIImagePNGRepresentation(img);NSString *pathNum = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.png",num]];[imageData writeToFile:pathNum atomically:NO];CGImageRelease(image);NSString *actualTimeString =CFBridgingRelease(CMTimeCopyDescription(NULL, rTime));NSLog(@"photo:%d",num);NSLog(@"%@",actualTimeString);//调用dispatch_semaphore_signal函数,使计数器+1dispatch_semaphore_signal(sem);}else{dispatch_async(dispatch_get_main_queue(), ^{[MBProgressHUD hideAllHUDsForView:self.view animated:YES];});}}});Second +=0.083;//一直等待,直到信号量计数器大于等于1dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);num+=1;}dispatch_async(dispatch_get_main_queue(), ^{num = 0;Second = 0.0;[MBProgressHUD hideAllHUDsForView:self.view animated:YES];});});}
图片合成视频
- (void)initRecord
{//是否是第一次添加图片self.firstImgAdded = FALSE;//video路径NSString* fileName = [NSString stringWithFormat:@"%d.mov", (int)[[NSDate date] timeIntervalSince1970]];self.videoPath = [NSString stringWithFormat:@"%@/%@", [self getLibarayPath], fileName];//设置一个gcd队列writeQueue = dispatch_queue_create("recording_queue", DISPATCH_QUEUE_PRIORITY_DEFAULT);CGSize frameSize = imageRect.size;NSError* error = nil;//创建写入对象self.videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:self.videoPath] fileType:AVFileTypeQuickTimeMovie error:&error];//如果出错,打印错误内容if(error){NSLog(@"error creating AssetWriter: %@",[error description]);self.videoWriter = nil;return;}//设置参数NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecH264, AVVideoCodecKey,[NSNumber numberWithInt:frameSize.width], AVVideoWidthKey,[NSNumber numberWithInt:frameSize.height], AVVideoHeightKey,nil];//输入对象self.writerInput = [AVAssetWriterInputassetWriterInputWithMediaType:AVMediaTypeVideooutputSettings:videoSettings];//属性设置NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];[attributes setObject:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32ARGB] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey];[attributes setObject:[NSNumber numberWithUnsignedInt:frameSize.width] forKey:(NSString*)kCVPixelBufferWidthKey];[attributes setObject:[NSNumber numberWithUnsignedInt:frameSize.height] forKey:(NSString*)kCVPixelBufferHeightKey];//通过属性和writerInput 创建一个新的Adaptorself.adaptor = [AVAssetWriterInputPixelBufferAdaptorassetWriterInputPixelBufferAdaptorWithAssetWriterInput:self.writerInputsourcePixelBufferAttributes:attributes];//添加输入,必须在开始写入之前[self.videoWriter addInput:self.writerInput];self.writerInput.expectsMediaDataInRealTime = YES;//开始写入[self.videoWriter startWriting];[self.videoWriter startSessionAtSourceTime:kCMTimeZero];
}#pragma mark - 视频合成
static int count = 0;
- (void)startCamera
{NSMutableArray *arr = [self allFilesAtPath:[self backPath]];dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{dispatch_async(dispatch_get_main_queue(), ^{[MBProgressHUD showHUDAddedTo:self.view animated:YES];});while (arr.count -count) {UIImage *image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%d.png",[self backPath],count]];CGImageRef image1 = image.CGImage;[self writeImage:image1 withIndex:count];NSLog(@"%d",count);count ++;}[self.writerInput markAsFinished];[self.videoWriter finishWriting];// [self combineWithAudio:num];dispatch_async(dispatch_get_main_queue(), ^{count = 0;[MBProgressHUD hideAllHUDsForView:self.view animated:YES];});});
}- (void)writeImage:(CGImageRef)img withIndex:(NSInteger)curCount
{CVPixelBufferRef buffer = NULL;if (self.videoWriter == nil){NSLog(@"error~~~~~~~~~~~");}if (self.firstImgAdded == FALSE){buffer = [self pixelBufferFromCGImage:img];BOOL result = [self.adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero];if (result == NO) //failes on 3GS, but works on iphone 4{NSLog(@"failed to append buffer");}if(buffer){CVBufferRelease(buffer);}self.firstImgAdded = TRUE;}else{if (self.adaptor.assetWriterInput.readyForMoreMediaData){CMTime frameTime = CMTimeMake(1, FramePerSec);CMTime lastTime = CMTimeMake(curCount, FramePerSec);CMTime presentTime = CMTimeAdd(lastTime, frameTime);buffer = [self pixelBufferFromCGImage:img];BOOL result = [self.adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];if (result == NO) //failes on 3GS, but works on iphone 4{NSLog(@"failed to append buffer");NSLog(@"The error is %@", [self.videoWriter error]);}else{NSLog(@"write ok");}if(buffer){CVBufferRelease(buffer);}}else{NSLog(@"error");}}}- (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image
{NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:TRUE], kCVPixelBufferCGImageCompatibilityKey,[NSNumber numberWithBool:TRUE],kCVPixelBufferCGBitmapContextCompatibilityKey,nil];//是否兼容CVPixelBufferRef pxbuffer = NULL;CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, imageRect.size.width,imageRect.size.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,&pxbuffer);//返回kCVReturnSuccess kCFAllocatorDefault = nilstatus=status;NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);//判断类型CVPixelBufferLockBaseAddress(pxbuffer, 0);//访问地址void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);NSParameterAssert(pxdata != NULL);CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef context = CGBitmapContextCreate(pxdata, imageRect.size.width,imageRect.size.height, 8, 4*imageRect.size.width, rgbColorSpace,kCGImageAlphaNoneSkipFirst);NSParameterAssert(context);CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));CGContextDrawImage(context, CGRectMake(0, 0, imageRect.size.width, imageRect.size.height), image);CGColorSpaceRelease(rgbColorSpace);CGContextRelease(context);CVPixelBufferUnlockBaseAddress(pxbuffer, 0);return pxbuffer;
}
视频分解图片,图片合成视频相关推荐
- python视频操作——python实现将视频分解为图片序列
python将视频分解为图片序列 内容参考自博客~ 详细实现代码如下: import cv2# 读取视频,方法是来自cv2库的VideoCapture cap = cv2.VideoCapture(& ...
- 用python把视频分解成图片
# 用python把视频分解成图片 import cv2 # 读取一段视频 cap=cv2.VideoCapture("d:/1.mp4") # 用作计数 i=0 # 循环判断视频 ...
- python将视频分解为图片+将图片合成为视频
系列文章目录 文章目录 系列文章目录 前言 一.python视频拆分+图片合成(源码一) 1.python视频拆分 1.python图片合成 二.python视频拆分+图片合成(源码二) 三.pyth ...
- 如何把视频分解成图片?怎么逐帧提取视频中的图片?
在工作中遇到需要将一段视频逐帧分解成图片该怎么做?小编在这这里给大家分享一款视频提取图片(https://www.yasuoshipin.com工具,一起来了解一下吧. 在所有功能中,选择视频提取图片 ...
- 视频分解图片原理;图片合成视频原理
(1)加载视频 (2)读取视频信息 (3)解码视频,拿到单帧信息 帧率:视频每秒钟展示多少张图片:帧率高我们看到的图片才是连续的:帧率低我们看到的图片就相当于非连续的: 宽度:高度 接下来是视频保存成 ...
- 用OpenCV将视频分解成单帧图片,图片合成视频
本文做的是基于opencv将视频帧转成图片输出,由于一个视频包含的帧数过多,经常我们并不是需要它的全部帧转成图片,因此我们希望可以设置每隔多少帧再转一次图片(本文设置为30帧),若有人需求是只需要前多 ...
- ffmpeg将视频流转化成图片帧,将图片帧转化为视频(基本无损)
ffmpeg将视频流转化成图片帧,将图片帧转化为视频(基本无损) 其中-r 和-framerate 都是代表帧率(这个属性属于图片的属性,需要放在图片之前) -s 控制输出格式大小 本人在一个视频稳定 ...
- Ffmpeg 将视频分解成多张图片以及多张图片合成视频
1.将视频分解成多张图片 -y 覆盖以前的图片 %04d 输出的图片的命名格式 ffmpeg -y -i Desktop/FfmpegVideos/10.avi Desktop/FfmpegImage ...
- IOS视频分解图片、图片合成视频
在IOS视频处理中,视频分解图片和图片合成视频是IOS视频处理中经常遇到的问题,这篇博客就这两个部分对IOS视频图像的相互转换做一下分析. (1)视频分解图片 这里视频分解图片使用的是AVAsse ...
最新文章
- 移动硬盘无法停止,竟然是TM的原因
- 大二下学期软件工程概论总结
- Java即时类| toString()方法与示例
- linux HZ 值_Linux的serial串口控制台
- mipi和isp处理_图像信号处理 (ISP) 流水线
- Flask-SQLALchemy 连接数据库
- cdr怎样把一张图片随意变形_CDR钢笔工具怎么抠图?原来使用起来这么简单!
- 在Web上运行Linux
- 北京协和医院付海鸿:医学精准要影像先行,影像精准就要技术先行
- 8051单片机Proteus仿真与开发实例-RS485协议通信仿真
- linux ubuntu 联网问题
- iMeta | 南农沈其荣团队发布微生物网络分析和可视化R包ggClusterNet
- Android 集成腾讯播放器sdk(支持多格式,直播,m3u8等)重点是免费
- 洛谷P4061 大吉大利,晚上吃鸡
- PDF太大如何压缩变小?
- 30天自制操作系统:第五天 结构体、文字显示与 GDT/IDT初始化
- win10 损坏的映像 0xc000012f
- 微信公众号新手运营指南——四种类别如何选择
- 详解Unity中的车轮碰撞器Wheel Collider
- 对口升学计算机学校录取分,中职对口升学本科第一批院校录取分数线划定
热门文章
- 电动车断码屏为什么更适宜选用LCD显示屏
- NewbieGuide setBackgroundColor为transparent无效
- echarts地图可视化 中国地图及各省级js文件分享
- 亚信安全服务器深度安全防御系统,亚信安全服务器深度安全防护系统即服务 为云端用户筑起安全壁垒...
- OpenShift 3.11单机安装和使用
- JTAG和SWD接口
- dl dt dd标签具体用法
- 六款好用的Python IDE
- Python3根据URL下载图片
- Vue+ElementUI+SpringBoot实现的前后端分离框架