AV Foundation系列(四)AVAssetReader和AVAssetWrite
来源:互联网 发布:中文安卓编程开创e4a 编辑:程序博客网 时间:2024/05/23 21:39
http://www.jianshu.com/p/aeb441816a7d
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:@1280, AVVideoHeightKey:@720, AVVideoCompressionPropertiesKey:@{ AVVideoMaxKeyFrameIntervalKey:@1, AVVideoAverageBitRateKey:@10500000, 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 = 0; __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 == 2000) { 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"); } }]; } } }]; }}
运行结果生成了copy.mp4视频文件,点击播放,发现只有视频没有音频信息,因为我们只有读取了视频的样本数据并写入,并没有读取里面的音频数据。所以没有音频,AVAsset往往对应的是一个格式容器,里面包含了很多格式的数据,音频,视频,字幕等。
文/jiangamh(简书作者)
原文链接:http://www.jianshu.com/p/aeb441816a7d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/aeb441816a7d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
0 0
- AV Foundation系列(四)AVAssetReader和AVAssetWrite
- 《AV Foundation 开发秘籍》读书笔记(待续)
- AV Foundation学习之(二)
- AV Foundation学习之补充(二)
- 《AV Foundation 开发秘籍》读书笔记(二)
- 《AV Foundation 开发秘籍》读书笔记(三)
- AVAssetReader和AVAssetWriter
- iphone ios AV Foundation
- AV Foundation - 播放音乐
- AV Foundation - 录制音频
- AV Foundation 框架图
- FFmpeg总结(四)AV系列结构体之AVBuffer、AVBufferRef、AVBufferPool
- 简单研究利用AV Foundation框架实现模仿微信语音录制和播放功能
- iPhone 6和iPhone 6 plus的AV Foundation框架特性
- iOS 7 What’s New in AV Foundation之二维码扫描(上)
- iOS 7 What’s New in AV Foundation之二维码扫描(中)
- iOS 7 What’s New in AV Foundation之二维码扫描(下)
- 【IOS学习】AV Foundation 学习笔记
- SSM框架整合(IntelliJ IDEA + maven + Spring + SpringMVC + MyBatis)
- AVFoundation(一):基础知识
- 多线程下载
- 自定义实现侧滑菜单栏
- spring-data-jpa学习(一)环境配置1.1
- AV Foundation系列(四)AVAssetReader和AVAssetWrite
- Gift (Standard IO)
- java文件及读写操作
- Gzip压缩技术
- 排序专题
- 安卓速记1--布局
- JZOJ 4647 寻找 【NOIP2016提高A组模拟7.17】
- 利用 libevent 实现简单 http client GET、POST
- <s:iterator/>标签取循环索引的问题