AV Foundation系列(四)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];

//指定將讀取的樣本數(shù)據(jù)壓縮為BGRA格式

    NSDictionary *setting =   @{(id)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_32BGRA)};

  //初始化輸出,指定從track軌道中讀取樣本數(shù)據(jù)

   _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];

   }

}

將讀取的數(shù)據(jù)寫入到_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)

           {

                   //樣本數(shù)據(jù)

                    CMSampleBufferRef buffer = [_assetOutPut copyNextSampleBuffer];

                   if (buffer) {

                            [_assetInput appendSampleBuffer:buffer];

                             count++;

                             // 展示第2000幀數(shù)據(jù)

                             if (count == 2000) {

                              CGImageRef imgref = [UIImage imageFromSampleBufferRef:buffer];

                             //讀取CMSampleBuffer中的數(shù)據(jù),將其轉化為CGImageRef

                            參考代碼見:http://www.itdecent.cn/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視頻文件,點擊播放,發(fā)現(xiàn)只有視頻沒有音頻信息,因為我們只有讀取了視頻的樣本數(shù)據(jù)并寫入,并沒有讀取里面的音頻數(shù)據(jù)。所以沒有音頻,AVAsset往往對應的是一個格式容器,里面包含了很多格式的數(shù)據(jù),音頻,視頻,字幕等。

這是第一次使用markdown格式編輯,之前一直不回使用,后來百度才知道,需要在設置中指定markdwon編輯,而非富文本編輯。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容