第五十七篇、AVAssetReader和AVAssetWrite 对视频进行编码
AV Foundation提供了直接处理媒体样本的低级功能,其中需要使用的两个重要的类,AVAssetReader和AVAssetWrite,AVAssetReader用于从AVAsset资源读取媒体样本,AVAssetWrite用于对媒体资源进行编码并写入到容器文件中。下面简单的使用一下:
初始化AVAssetReader
-(void)configAssetReader { NSURL *videoUrl = [NSURL fileURLWithPath:[self resoucePath]]; _asset = [AVAsset assetWithURL:videoUrl]; //获取资源的一个视频轨道 AVAssetTrack *track = [[_asset tracksWithMediaType:AVMediaTypeVideo] firstObject]; _assetReader = [[AVAssetReader alloc] initWithAsset:_asset error:nil]; //指定将读取的样本数据压缩为BGRA格式 NSDictionary *setting = @{(id)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_32BGRA)}; //初始化输出,指定从track轨道中读取样本数据 _assetOutPut = [[AVAssetReaderTrackOutput alloc] initWithTrack:track outputSettings:setting]; //添加输出 [_assetReader addOutput:_assetOutPut]; //开始读取过程 [_assetReader startReading]; }
初始化AVAssetWrite
-(void)configWriteInput { NSString *storePath = nil; NSString *path = [self resoucePath]; NSRange range = [path rangeOfString:@"/" options:NSBackwardsSearch]; if (range.location != NSNotFound) { NSString *pathRoot = [path substringToIndex:range.location]; storePath = [pathRoot stringByAppendingPathComponent:@"copy.mp4"]; } if (storePath) { _assetWrite = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:storePath] fileType:AVFileTypeQuickTimeMovie error:nil]; //指定编码格式,像素宽高等信息 NSDictionary *setting = @{ AVVideoCodecKey:AVVideoCodecH264, AVVideoWidthKey:@, AVVideoHeightKey:@, AVVideoCompressionPropertiesKey:@{ AVVideoMaxKeyFrameIntervalKey:@, AVVideoAverageBitRateKey:@, AVVideoProfileLevelKey:AVVideoProfileLevelH264Main31 } }; 初始化写入器,并制定了媒体格式 _assetInput = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSettings:setting]; //添加写入器 [_assetWrite addInput:_assetInput]; [_assetWrite startWriting]; } }
将读取的数据写入到_assetInput写入器中
-(void)assertReadToAssetInput { dispatch_queue_t queue = dispatch_queue_create("com.writequeue", DISPATCH_QUEUE_CONCURRENT); if (_assetInput) { __block NSInteger count = ; __block BOOL isComplete = NO; //开启写入会话,并指定样本的开始时间 [_assetWrite startSessionAtSourceTime:kCMTimeZero]; [_assetInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{ if (!isComplete && _assetInput.readyForMoreMediaData) { //样本数据 CMSampleBufferRef buffer = [_assetOutPut copyNextSampleBuffer]; if (buffer) { [_assetInput appendSampleBuffer:buffer]; count++; // 展示第2000帧数据 if (count == ) { CGImageRef imgref = [UIImage imageFromSampleBufferRef:buffer]; //读取CMSampleBuffer中的数据,将其转化为CGImageRef 参考代码见:http://www.jianshu.com/p/3d5ccbde0de1 UIImage *img = [UIImage imageWithCGImage:imgref]; dispatch_sync(dispatch_get_main_queue(), ^{ _imageView.image = img; }); } } else { isComplete = YES; } if(isComplete) { //关闭写入会话 [_assetWrite finishWritingWithCompletionHandler:^{ AVAssetWriterStatus status = self.assetWrite.status; if (status == AVAssetWriterStatusCompleted) { NSLog(@"finsished"); } else { NSLog(@"failure"); } }]; } } }]; } }
-(void)assertReadToAssetInput { dispatch_queue_t queue = dispatch_queue_create("com.writequeue", DISPATCH_QUEUE_CONCURRENT); if (_assetInput) { __block NSInteger count = ; __block BOOL isComplete = NO; //开启写入会话,并指定样本的开始时间 [_assetWrite startSessionAtSourceTime:kCMTimeZero]; [_assetInput requestMediaDataWhenReadyOnQueue:queue usingBlock:^{ if (!isComplete && _assetInput.readyForMoreMediaData) { //样本数据 CMSampleBufferRef buffer = [_assetOutPut copyNextSampleBuffer]; if (buffer) { [_assetInput appendSampleBuffer:buffer]; count++; // 展示第2000帧数据 if (count == ) { CGImageRef imgref = [UIImage imageFromSampleBufferRef:buffer]; //读取CMSampleBuffer中的数据,将其转化为CGImageRef 参考代码见:http://www.jianshu.com/p/3d5ccbde0de1 UIImage *img = [UIImage imageWithCGImage:imgref]; dispatch_sync(dispatch_get_main_queue(), ^{ _imageView.image = img; }); } } else { isComplete = YES; } if(isComplete) { //关闭写入会话 [_assetWrite finishWritingWithCompletionHandler:^{ AVAssetWriterStatus status = self.assetWrite.status; if (status == AVAssetWriterStatusCompleted) { NSLog(@"finsished"); } else { NSLog(@"failure"); } }]; } } }]; } }
第五十七篇、AVAssetReader和AVAssetWrite 对视频进行编码的更多相关文章
- 第五十七篇:webpack打包发布
好家伙,到了打包发布这一步了 1.配置打包命令: 在package.json 文件的 scripts 节点下,新增 build 命令如下: "scripts": { "d ...
- Egret入门学习日记 --- 第十七篇(书中 7.4~8.2节 内容)
第十七篇(书中 7.4~8.2节 内容) 昨天看到 7.3 节,那么今天. 开始 7.4节. 好吧,这些其他的服务器运行知识,就不搞了... 至此,7.4节 内容结束. 开始 7.5节 内容. ...
- 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)
解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十七篇】:Django之【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十七篇】:Django【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- 第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码
第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码 scrapy-redis是一个可以scrapy结合redis搭建分布式爬虫的开 ...
- “全栈2019”Java第五十七章:多态与构造方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库
孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第三天.感觉这个东西学习起来还是那么困 ...
随机推荐
- 小学生玩ACM----广搜
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- 【灵感】wifi通过wifi发送优惠信息
1.[灵感]wifi通过wifi发送优惠信息 http://content.businessvalue.com.cn/post/15362.html 2.手机彩票大爆发 http://content. ...
- 使用Filter防止浏览器缓存页面或请求结果
仅仅须要两步: 1.定义一个Filter: /** * 防止浏览器缓存页面或请求结果 * @author XuJijun * */ public class NoCacheFilter impleme ...
- myeclipse 10创建maven项目
创建maven项目,这里使用的不是myeclipse自带的maven插件.而是自己 又一次安装的插件,就不啰嗦了,直接上图吧 1.先是安装maven插件.将maven插件解压把它放进E:\xuan\M ...
- 在WCF中不使用svc文件直接使用cs文件
在 配置中有个节点可以实现 此功能 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" > &l ...
- OpenGL 3:画圆
这次使用OpenGL画圆,而且中间画一个实心的五角星. 1. 画实心五角: 由于之前使用Polygen画会出现故障,或许是各个GPU硬件也会不一样的,所以使用Polygen画实心五角星并不可靠: 所以 ...
- [MODX] 0. Mangement System Overview
In Modex, there are three tabs: Resoources, Elements & Files First: 'Files' is the place where t ...
- ios--uitextfield动态限制输入的字数(解决方式)
1.定义一个事件: -(IBAction)limitLength:(UITextField *)sender { bool isChinese;//推断当前输入法是否是中文 if ([[[UIText ...
- 如何通过VIM把代码格式化后生成HTML网页代码
本文转自http://wangxiaoyu.blog.51cto.com/922065/203471 需求及思路:演示需要,需要网站上嵌入一些代码,我的建议做法是根据代码文件,生成相应的HTML代码, ...
- 安装Laravel遇到You must enable the openssl extension to download files via https问题
刚看了一篇文章说了2014年最火的10个php框架,看到了Laravel,于是便自己试试,孰料刚安装便遇到了一个问题(由于一不小心关掉了cmd,此处无法截图显示),便是如文章标题中所说的那样,goog ...