2016-04-05 30 views
1

ile bölmeye çalışıyorum Bir videoyu AVAssetExportSession ile 4 saniyelik parçalara ayırmaya çalışıyorum. İlk bölünme çalışır ve 8mb/4 saniyelik bir yığın döndürür. Ama ikinci orijinal video os sadece 18mb olduğunda yanlış olan 12mb döner.Bir videoyu `AVAssetExportSession`

- (void) splitVideo{ 

    AVURLAsset *vidAsset = [AVURLAsset URLAssetWithURL:output options:nil]; 
    CMTime duration = vidAsset.duration; 

    NSLog(@"File size is : %.2f MB And Duration: %f",(float)[NSData dataWithContentsOfURL:output].length/1024.0f/1024.0f, CMTimeGetSeconds(duration)); 
    splitArray = [[NSMutableArray alloc]init]; 

    CMTime end = CMTimeMake(4, 1); 
    CMTimeRange range = CMTimeRangeMake(kCMTimeZero, end); 

    NSString *outputPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"output0.mp4"]; 
    totalSeconds = 4.0f; 
    [self cutVideo:output withRange:range withOutput:outputPath]; 

} 

- (void) cutVideo:(NSURL *)url withRange:(CMTimeRange)range withOutput:(NSString*)path{ 
    AVAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 
    NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:asset]; 
    if ([compatiblePresets containsObject:AVAssetExportPresetHighestQuality]) { 
     AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality]; 

     NSURL *finalUrl = [NSURL fileURLWithPath:path]; 
      [[NSFileManager defaultManager] removeItemAtURL:finalUrl error:NULL]; 

     exportSession.outputURL = finalUrl; 
     exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
     exportSession.shouldOptimizeForNetworkUse = YES; 
     exportSession.timeRange = range; 
      NSLog(@"start: %f end: %f", CMTimeGetSeconds(range.start), CMTimeGetSeconds(range.duration)); 

     [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 

      }); 
      if ([exportSession status] == AVAssetExportSessionStatusCompleted){ 

       NSData *videoData = [[NSData alloc]initWithContentsOfURL:exportSession.outputURL]; 
       NSLog(@"DL: %f", (float)videoData.length/1024.0f/1024.0f); 

       [self makeFile:finalUrl]; 

       AVURLAsset *fullVid = [AVURLAsset URLAssetWithURL:output options:nil]; 

       CMTime start = CMTimeMake(totalSeconds, 1); 
       totalSeconds = totalSeconds + 4.0f; 
       CMTime end; 
       if ((CMTimeGetSeconds(start) + 4) > CMTimeGetSeconds(fullVid.duration)) { 
        end = fullVid.duration; 
       }else{ 
        end = CMTimeMake(CMTimeGetSeconds(start) + 4, 1); 
       } 
       CMTimeRange range2 = CMTimeRangeMake(start, end); 
       NSLog(@"%f < %f\n\n", CMTimeGetSeconds(start), CMTimeGetSeconds(fullVid.duration)); 

       if (CMTimeGetSeconds(start) < CMTimeGetSeconds(fullVid.duration)) { 
        NSString *outputPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"output%lu.mp4", splitArray.count]]; 
        [self cutVideo:output withRange:range2 withOutput:outputPath]; 
       }else{ 
        [self saveVideo:true]; 
       } 
      }else if ([exportSession status] == AVAssetExportSessionStatusFailed){ 
       NSLog(@"Export failed: %@", [[exportSession error] localizedDescription]); 
      }else if ([exportSession status] == AVAssetExportSessionStatusCancelled){ 
       NSLog(@"Export canceled"); 
      } 
     }]; 
    } 
} 

Dosya boyutu: 18.86 MB Ve Süre: 9,171667

ilk

başlangıç: 0.000000 bitiş: 4,000000

DL: 8,194733

4,000000 < 9,171667

ikinci

başlangıç: 4,000000 bitiş: 8,000000

DL: 12,784523

cevap

1

O değil yanlış, çünkü video kod çözücüleri sadece bir set o değil, son karedeki değişiklikleri kaydeder f "görüntüler". Sanırım videonuz ikinci yığınta daha fazla renk değişikliğine sahip, bu yüzden daha fazla yer kaplıyorsunuz.

+0

Video boyutunun tamamı 19mb'dir. Eğer ilkini 1-4 saniye arayla 8 mb, sonra da 4-8 saniye arayla bölerseniz, 12 mb olması gerekmez. – Peter

+0

Ayrıca ilk 0-4 ikinci bölünme 2-4 değiştirdim ve bu 10mb geri döner. Yani bir şey ile CMTime 's – Peter

+0

nvm olduğunu düşünüyorum doğru teşekkürler. – Peter

İlgili konular