第五十七篇、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数据库的第三天.感觉这个东西学习起来还是那么困 ...
随机推荐
- python函数介绍
1.向函数传递信息 def greet_user(username): print('Hello,' + username.title() + '!') greet_user('jesse') 2.位 ...
- 【android-cocos2d-X 环境配置】在Mac下搭建Cocos2d-X-android开发环境!
转自:http://blog.csdn.net/dingkun520wy/article/details/17097593 (1)下载 首先要下载好要用到的东西: 1.android-SDK 地址是 ...
- PROCESS_YIELD()宏和C语言的switch语句< contiki学习笔记之七>
写在前面: 按照main()函数的代码一行一行的分析,该是看到了 etimer_process 这个位置.但是etimer_process实现里的一个宏 PROCESS_YIELD()引出了很多故事 ...
- UVa297 Quadtrees
// UVa297 Quadtrees // 题意:给两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数.p表示中间结点,f表示黑色(full),e表示白色(empty) // 算法: ...
- Codeforces gym 100685 F. Flood bfs
F. FloodTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/F Desc ...
- 发布站点到远程FTP根目录
第一步:修改 phpcms/modules/admin/templates/site_add.tpl.php 找到 <legend><?php echo L('release_poi ...
- leetcode -- Search for a Range (TODO)
Given a sorted array of integers, find the starting and ending position of a given target value. You ...
- You Need This One Skill to Succeed in IT--reference
The ability to program in five languages, including one machine-level? Not it. Project management sk ...
- The Famous Clock
描述 Mr. B, Mr. G and Mr. M are now in Warsaw, Poland, for the 2012’s ACM-ICPC World Finals Contest. T ...
- javaEE学习笔记-利用DOM4J解析xml至数据库
xml代码文件名:test02.xml <ACCESOS> <item> <SOCIO> <NUMERO>00045050</NUMERO> ...