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 对视频进行编码的更多相关文章

  1. 第五十七篇:webpack打包发布

    好家伙,到了打包发布这一步了 1.配置打包命令: 在package.json 文件的 scripts 节点下,新增 build 命令如下: "scripts": { "d ...

  2. Egret入门学习日记 --- 第十七篇(书中 7.4~8.2节 内容)

    第十七篇(书中 7.4~8.2节 内容) 昨天看到 7.3 节,那么今天. 开始 7.4节.     好吧,这些其他的服务器运行知识,就不搞了... 至此,7.4节 内容结束. 开始 7.5节 内容. ...

  3. 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)

    解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...

  4. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  5. Python之路【第十七篇】:Django之【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  6. Python之路【第十七篇】:Django【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  7. 第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码

    第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码 scrapy-redis是一个可以scrapy结合redis搭建分布式爬虫的开 ...

  8. “全栈2019”Java第五十七章:多态与构造方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库

    孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第三天.感觉这个东西学习起来还是那么困 ...

随机推荐

  1. bash学习之变量的显示和设置

    显示变量:echo $MAIL或者 echo ${MAIL} [CJP@CJP ~]$ echo $MAIL /var/spool/mail/CJP [CJP@CJP ~]$ echo ${MAIL} ...

  2. ASP.NET MVC 3 入门级常用设置、技巧和报错

    1.ASP.NET MVC 3 如何去除默认验证 这个默认验证是在web.config配置文件中设置的    <add key="ClientValidationEnabled&quo ...

  3. 详解Android Handler的使用-别说你不懂handler

    我们进行Android开发时,Handler可以说是使用非常频繁的一个概念,它的用处不言而喻.本文就详细介绍Handler的基本概念和用法. Handler的基本概念         Handler主 ...

  4. 打开Excel时提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致"

    问题描述:     系统安装了WPS时,Analyzer导出excel时候,会提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致",这是Excel的安全问题,   ...

  5. Ruby on Rails Tutorial 第一章 之 搭建开发环境

    云端开发环境,Cloud9(https://ide.c9.io/).这个开发环境预先安装好了Rails开发所需要的大多数软件,包括Ruby.RubyGems和Git,需要自己安装Rails. 1.安装 ...

  6. 高级I/O之存储映射I/O

    存储映射I/O(Memory-mapped I/O)使一个磁盘文件与存储空间中的一个缓冲区相映射.于是当从缓冲区中取数据,就相当于读文件中的相应字节.与此类似,将数据存入缓冲区,则相应字节就自动地写入 ...

  7. 申请TexturePacker 或 PhysicsEditor free licenses

    有一个跟开发有关的blog,就可以去 http://www.codeandweb.com/request-free-license 申请一个free licenses. 可以申请TexturePack ...

  8. 关于使用NotificationComat导致android2.3及以下版本无法显示自定义布局的解决方法.

    大伙都知道 android-support-v4为我们提供了很多兼容的解决方案, 其中就有关于通知栏的. NotificationCompat, 顺利成章操刀显示通知. eg: Intent inte ...

  9. KMeans聚类 K值以及初始类簇中心点的选取 转

    本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法, ...

  10. debian root用户在shell下如何能够使用颜色

    转载:http://hi.baidu.com/aivera/item/f31c4a590ef72609e6c4a596 编辑 /root/.bashrc 这个文件, 把里面这几行前面的#号去掉就可以了 ...