工作当中用到了相关的技术,现在特别记录一下

分解视频


//分解视频
- (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;
}

视频分解图片,图片合成视频相关推荐

  1. python视频操作——python实现将视频分解为图片序列

    python将视频分解为图片序列 内容参考自博客~ 详细实现代码如下: import cv2# 读取视频,方法是来自cv2库的VideoCapture cap = cv2.VideoCapture(& ...

  2. 用python把视频分解成图片

    # 用python把视频分解成图片 import cv2 # 读取一段视频 cap=cv2.VideoCapture("d:/1.mp4") # 用作计数 i=0 # 循环判断视频 ...

  3. python将视频分解为图片+将图片合成为视频

    系列文章目录 文章目录 系列文章目录 前言 一.python视频拆分+图片合成(源码一) 1.python视频拆分 1.python图片合成 二.python视频拆分+图片合成(源码二) 三.pyth ...

  4. 如何把视频分解成图片?怎么逐帧提取视频中的图片?

    在工作中遇到需要将一段视频逐帧分解成图片该怎么做?小编在这这里给大家分享一款视频提取图片(https://www.yasuoshipin.com工具,一起来了解一下吧. 在所有功能中,选择视频提取图片 ...

  5. 视频分解图片原理;图片合成视频原理

    (1)加载视频 (2)读取视频信息 (3)解码视频,拿到单帧信息 帧率:视频每秒钟展示多少张图片:帧率高我们看到的图片才是连续的:帧率低我们看到的图片就相当于非连续的: 宽度:高度 接下来是视频保存成 ...

  6. 用OpenCV将视频分解成单帧图片,图片合成视频

    本文做的是基于opencv将视频帧转成图片输出,由于一个视频包含的帧数过多,经常我们并不是需要它的全部帧转成图片,因此我们希望可以设置每隔多少帧再转一次图片(本文设置为30帧),若有人需求是只需要前多 ...

  7. ffmpeg将视频流转化成图片帧,将图片帧转化为视频(基本无损)

    ffmpeg将视频流转化成图片帧,将图片帧转化为视频(基本无损) 其中-r 和-framerate 都是代表帧率(这个属性属于图片的属性,需要放在图片之前) -s 控制输出格式大小 本人在一个视频稳定 ...

  8. Ffmpeg 将视频分解成多张图片以及多张图片合成视频

    1.将视频分解成多张图片 -y 覆盖以前的图片 %04d 输出的图片的命名格式 ffmpeg -y -i Desktop/FfmpegVideos/10.avi Desktop/FfmpegImage ...

  9. IOS视频分解图片、图片合成视频

    在IOS视频处理中,视频分解图片和图片合成视频是IOS视频处理中经常遇到的问题,这篇博客就这两个部分对IOS视频图像的相互转换做一下分析.  (1)视频分解图片  这里视频分解图片使用的是AVAsse ...

最新文章

  1. 移动硬盘无法停止,竟然是TM的原因
  2. 大二下学期软件工程概论总结
  3. Java即时类| toString()方法与示例
  4. linux HZ 值_Linux的serial串口控制台
  5. mipi和isp处理_图像信号处理 (ISP) 流水线
  6. Flask-SQLALchemy 连接数据库
  7. cdr怎样把一张图片随意变形_CDR钢笔工具怎么抠图?原来使用起来这么简单!
  8. 在Web上运行Linux
  9. 北京协和医院付海鸿:医学精准要影像先行,影像精准就要技术先行
  10. 8051单片机Proteus仿真与开发实例-RS485协议通信仿真
  11. linux ubuntu 联网问题
  12. iMeta | 南农沈其荣团队发布微生物网络分析和可视化R包ggClusterNet
  13. Android 集成腾讯播放器sdk(支持多格式,直播,m3u8等)重点是免费
  14. 洛谷P4061 大吉大利,晚上吃鸡
  15. PDF太大如何压缩变小?
  16. 30天自制操作系统:第五天 结构体、文字显示与 GDT/IDT初始化
  17. win10 损坏的映像 0xc000012f
  18. 微信公众号新手运营指南——四种类别如何选择
  19. 详解Unity中的车轮碰撞器Wheel Collider
  20. 对口升学计算机学校录取分,中职对口升学本科第一批院校录取分数线划定

热门文章

  1. 电动车断码屏为什么更适宜选用LCD显示屏
  2. NewbieGuide setBackgroundColor为transparent无效
  3. echarts地图可视化 中国地图及各省级js文件分享
  4. 亚信安全服务器深度安全防御系统,亚信安全服务器深度安全防护系统即服务 为云端用户筑起安全壁垒...
  5. OpenShift 3.11单机安装和使用
  6. JTAG和SWD接口
  7. dl dt dd标签具体用法
  8. 六款好用的Python IDE
  9. Python3根据URL下载图片
  10. Vue+ElementUI+SpringBoot实现的前后端分离框架