2016-08-02 7 views
8

मैं उच्च गुणवत्ता वाले वीडियो को कम आकार में संपीड़ित करने की कोशिश कर रहा हूं और मैं निम्न उद्देश्य-सी कोड का उपयोग करके संपीड़ित वीडियो के आकार को कम करने में सक्षम हूं:लाइब्रेरी या अल्गो का उपयोग करके वीडियो आकार को संपीड़ित करने का सबसे तेज़ तरीका

- (BOOL)convertMovieToMP4:(NSString) originalMovPath andStoragePath:(NSString) compMovPath 
     { 
      NSURL *tmpSourceUrl = [NSURL fileURLWithPath:originalMovPath]; 

      compMovPath = [compMovPath stringByReplacingOccurrencesOfString:[compMovPath pathExtension] withString:@"mp4"]; 
      NSURL *tmpDestUrl = [NSURL fileURLWithPath:compMovPath]; 

      AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:tmpSourceUrl options:nil]; 
      AVMutableComposition* mixComposition = [AVMutableComposition composition]; 

      AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 

      AVAssetTrack *clipVideoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
      [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
              ofTrack:clipVideoTrack 
              atTime:kCMTimeZero error:nil]; 

      [compositionVideoTrack setPreferredTransform:[[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] preferredTransform]]; 

      CGSize videoSize = [[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize]; 

      CATextLayer *titleLayer = [CATextLayer layer]; 
      titleLayer.string = @"Ojatro"; 
      titleLayer.font = (_bridge CFTypeRef Nullable)(@"Helvetica"); 
      titleLayer.fontSize = videoSize.height/8; 
      titleLayer.shadowOpacity = 0.2; 
      titleLayer.alignmentMode = kCAAlignmentCenter; 
      titleLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height/6); 
      titleLayer.position=CGPointMake(videoSize.width/2, videoSize.height/2); 

      CALayer *parentLayer = [CALayer layer]; 
      CALayer *videoLayer = [CALayer layer]; 
      parentLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height); 
      videoLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height); 
      [parentLayer addSublayer:videoLayer]; 
      [parentLayer addSublayer:titleLayer]; 

      AVMutableVideoComposition* videoComp = [AVMutableVideoComposition videoComposition]; 
      videoComp.renderSize = videoSize; 
      videoComp.frameDuration = CMTimeMake(1, 30); 
      videoComp.animationTool = [AVVideoCompositionCoreAnimationTool  videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 

      AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
      instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mixComposition duration]); 

      AVAssetTrack *videoTrack = [[mixComposition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

      AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; 

      instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 
      videoComp.instructions = [NSArray arrayWithObject: instruction]; 

      AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality];//AVAssetExportPresetPasst 
      _assetExport.videoComposition = videoComp; 
      //NSString* videoName = @"mynewwatermarkedvideo.mov"; 
      NSString *tmpDirPath = [compMovPath stringByReplacingOccurrencesOfString:[compMovPath lastPathComponent] withString:@""]; 
      if ([Utility makeDirectoryAtPath:tmpDirPath]) 
      { 
       NSLog(@"Directory Created"); 
      } 
      //exportPath=[exportPath stringByAppendingString:videoName]; 
      NSURL *exportUrl = tmpDestUrl; 

      if ([[NSFileManager defaultManager] fileExistsAtPath:compMovPath]) 
      { 
       [[NSFileManager defaultManager] removeItemAtPath:compMovPath error:nil]; 
      } 

      _assetExport.outputURL = exportUrl; 
      _assetExport.shouldOptimizeForNetworkUse = YES; 
      _assetExport.outputFileType = AVFileTypeMPEG4; 

      //[strRecordedFilename setString: exportPath]; 

      [_assetExport exportAsynchronouslyWithCompletionHandler: 
      ^(void) { 
       switch (_assetExport.status) 
       { 
        case AVAssetExportSessionStatusUnknown: 
         NSLog(@"Export Status Unknown"); 

         break; 
        case AVAssetExportSessionStatusWaiting: 
         NSLog(@"Export Waiting"); 

         break; 
        case AVAssetExportSessionStatusExporting: 
         NSLog(@"Export Status"); 

         break; 
        case AVAssetExportSessionStatusCompleted: 
         NSLog(@"Export Completed"); 
         totalFilesCopied++; 
         [self startProgressBar]; 

         break; 
        case AVAssetExportSessionStatusFailed: 
         NSLog(@"Export failed"); 

         break; 
        case AVAssetExportSessionStatusCancelled: 
         NSLog(@"Export canceled"); 

         break; 
       } 
      } 
      ]; 
      return NO; 
     } 

लेकिन मेरी मुख्य समस्या यह है कि जब मैं 500 एमबी वीडियो (यानी औसत वीडियो) फ़ाइल को संपीड़ित करता हूं और इसमें लगभग 20 से 30 मिनट लगते हैं। यह वीडियो आकार को लगभग 130 एमबी तक कम करता है। मैं अपने आकार को कम करने के लिए वीडियो को संपीड़ित करने के लिए मूल AVFoundation लाइब्रेरी का उपयोग कर रहा हूं।

मैं बस की तरह एप्पल कंप्रेसर आवेदन बहुत तेजी से वीडियो आकार सेक करने की जरूरत है, यह केवल 30 सेकंड के भीतर 500MB फ़ाइल संपीड़ित करता है ...

https://itunes.apple.com/en/app/compressor/id424390742?mt=12

मैं भी है कि के लिए FFMPEG पुस्तकालय का उपयोग किया है, लेकिन यह भी धीमा है कि मुझे पुस्तकालय अब और उपयोगी नहीं मिला।

मैंने जावा, पायथन जैसी अन्य भाषाओं का उपयोग करके समाधान खोजने का भी प्रयास किया है। लेकिन कोई समाधान नहीं मिला।

अगर किसी के पास इस विशेष समस्या का समाधान है, या कुछ पुस्तकालय हैं (यानी पेड लाइब्रेरी या ओपन सोर्स लाइब्रेरी) जो कम से कम 1 मिनट के साथ संपीड़न कर सकते हैं ... कृपया मेरे साथ साझा करें। या कोड का कुछ अन्य टुकड़ा जो संपीड़न समय की समस्या को 20 से 30 मिनट से कम से कम 1 मिनट तक दूर कर सकता है। https://drive.google.com/file/d/0BySTUFVtfzJmM3pYeVRiWmxSLVU/view

यह भी उद्देश्य सी में वीडियो के त्वरित संपीड़न के लिए एक नमूना कोड शामिल हैं:

धन्यवाद ...

उत्तर

2

यहाँ एक दस्तावेज है, जो वीडियो संपीड़न पर कुछ राउंड होता है। यह वीडियो संपीड़ित करने के लिए AVAssetExportSession का उपयोग करता है।

+0

मूल्यवान जानकारी साझा करने के लिए बहुत बहुत धन्यवाद। –

+0

कोई समस्या नहीं, आपका स्वागत है :) –

संबंधित मुद्दे

 संबंधित मुद्दे