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. UVa 112 Tree Summing

    题意: 计算从根到叶节点的累加值,看看是否等于指定值.是输出yes,否则no.注意叶节点判断条件是没有左右子节点. 思路: 建树过程中计算根到叶节点的sum. 注意: cin读取失败后要调用clear ...

  2. python的一些总结5

    上面4都是水的 恩每篇都一点知识点 用来写给不耐烦的人看..哈哈这篇 争取不水. 上面4篇如果 掌握 基本上是 80%常用的代码了. 1.下面讲一下 比较常用的代码: macro(jinja 上的功能 ...

  3. 用Eclipse来开发STM32

    先贴一个官方说明文档:http://www.keil.com/support/man/docs/ecluv/default.htm

  4. 理解 strcpy方法

    char* strcpy(char* strDest, const char* strSrc) { assert((strDest!=NULL) && (strSrc !=NULL)) ...

  5. poj1190生日蛋糕

    生日蛋糕 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12277 Accepted: 4325 Description 7月1 ...

  6. 奇妙华为3c手机, 出现安装未成功问题。

    1.我会命令adb uninstall 先卸载我们有签名的安装包. 2.用开发模式在手机上执行我们的应用. 3.然后測试就把手机拿走了,就用应用管理器把我们的应用卸载了. 4.继续装我们的开发包,死活 ...

  7. 第29题:推断一个序列是否是还有一个push序列的pop序列

    github:https://github.com/frank-cq/MyTest 第29题:输入两个整数序列,当中一个序列表示栈的push顺序,推断还有一个序列有没有可能是相应的pop顺序.为了简单 ...

  8. sed常见使用方法总结

    编辑文本 sed -i '1i xyz' test.txt 在第一行之前 sed -i '1a xyz' test.txt 在第一行之后插入 sed -i '1c xyz' test.txt 把第一行 ...

  9. target=_parent与target=_top的区别与用途

    转自:http://www.taoshaw.com/taoshaw/article.asp?id=1868 在手动改HTML代码时经常会用到target参数,常用的有两个target=_blank 和 ...

  10. 工作vs.学�

    近一两年来,我先后对[工作与学习]的复杂过程有过多次的头脑风暴,而且感觉在这方面略有所成(看这里和这里):当然既然仅仅是头脑风暴,所谓的所成也仅仅是一些粗糙的想法,一些没有实证过的如果,算是积累而已, ...