2013-03-26 21 views
10

Amacım, kameradan kaydedilmiş bir dizi klip oluşturmak ve bunları belirli bir boyutta dışa aktarmaktır. Tabii ki, video oryantasyonu dışa aktarmadan önce döndürülmelidir.Dönüştürme sırasında AVMutableVideoComposition içinde çalışma dönüşümü yok

Bunu, AVMutableComposition'ı aşağıdaki video kümelerinde saklanan bir dizi video klipten oluşturarak yapıyorum. Onları iyi bir şekilde oluşturabiliyorum ve ihraç edebiliyorum. Ancak, AVMutableVideoComposition üzerinde ayarlandığım döndürme dönüşümü onurlandırılmıyor. Aynı dönüşümü kullanırsam ve video parçasının tercih edilenTransform özelliğinde ayarlarsam çalışır. Her iki durumda da, video renderSize onurlandırılmamaktadır. Ihracatçı tamamen videoComposition yok sayar gibi. Ne olabileceği hakkında bir fikrin var mı?

Bir AVCaptureSession çalışıyor, ancak dışa aktarmadan önce kapattım ve bu hiç farketmedi. IOS programlamaya oldukça yeni geldim, bu yüzden temel bir şey eksik olabilir. :)

Kodum:

-(void) finalRecord{ 
NSError *error = nil; 

AVMutableComposition *composition = [AVMutableComposition composition]; 

AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
NSLog(@"Video track id is %d", [compositionVideoTrack trackID]); 

AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

// avAssets hold the video clips to be composited 
int pieces = [avAssets count]; 

CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_2); 
// [compositionVideoTrack setPreferredTransform:transform]; 

for (int i = 0; i<pieces; i++) { 

    AVURLAsset *sourceAsset = [avAssets objectAtIndex:i]; 

    AVAssetTrack *sourceVideoTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    AVAssetTrack *sourceAudioTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

    [timeRanges addObject:[NSValue valueWithCMTimeRange:CMTimeRangeMake(kCMTimeZero, sourceAsset.duration)]]; 
    [videoTracks addObject:sourceVideoTrack]; 
    [audioTracks addObject:sourceAudioTrack]; 
} 

[compositionVideoTrack insertTimeRanges:timeRanges ofTracks:videoTracks atTime:kCMTimeZero error:&error]; 
[compositionAudioTrack insertTimeRanges:timeRanges ofTracks:audioTracks atTime:kCMTimeZero error:&error]; 

AVMutableVideoCompositionInstruction *vtemp = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
vtemp.timeRange = CMTimeRangeMake(kCMTimeZero, [composition duration]); 
NSLog(@"\nInstruction vtemp's time range is %f %f", CMTimeGetSeconds(vtemp.timeRange.start), 
     CMTimeGetSeconds(vtemp.timeRange.duration)); 

// Also tried videoCompositionLayerInstructionWithAssetTrack:compositionVideoTrack  
AVMutableVideoCompositionLayerInstruction *vLayerInstruction = [AVMutableVideoCompositionLayerInstruction 
                   videoCompositionLayerInstructionWithAssetTrack:composition.tracks[0]]; 
[vLayerInstruction setTransform:transform atTime:kCMTimeZero]; 
vtemp.layerInstructions = @[vLayerInstruction]; 

AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 
videoComposition.renderSize = CGSizeMake(320.0, 240.0); 
videoComposition.frameDuration = CMTimeMake(1,30); 

videoComposition.instructions = @[vtemp]; 

AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:gVideoExportQuality]; 

NSParameterAssert(exporter != nil); 
exporter.videoComposition = videoComposition; 
exporter.outputFileType = AVFileTypeQuickTimeMovie; 

NSString *rootName = [[self captureManager] tempFileRoot]; 

NSString *temp = [NSString stringWithFormat:@"%@%@.mov", NSTemporaryDirectory(), rootName]; 
exporter.outputURL = [NSURL fileURLWithPath:temp ]; 

[exporter exportAsynchronouslyWithCompletionHandler:^{ 
    switch ([exporter status]) { 
     case AVAssetExportSessionStatusFailed: 
      NSLog(@"Export failed: %@", [exporter error]); 
      break; 
     case AVAssetExportSessionStatusCancelled: 
      NSLog(@"Export canceled"); 
      break; 
     case AVAssetExportSessionStatusCompleted: 
      NSLog(@"Export successfully"); 
      [self exportFile:exporter.outputURL]; 
      [self.delegate recordingEndedWithFile:exporter.outputURL]; 
      isExporting = FALSE; 
      [[[self captureManager] session] startRunning]; 
      break; 
     default: 
      break; 
    } 
    if (exporter.status != AVAssetExportSessionStatusCompleted){ 
     NSLog(@"Retry export"); 
    } 
}]; 

} 

cevap

9

Tamam anladım ve diğer insanların benim yaptığım zaman kaybetmeyin yardımcı olmak için burada gönderme.

Sorun, bir AVExportSession üzerinde AVAssetExportPresetPassthrough kullanırsanız, ihracatçı video kompozisyonu yönergelerini yok sayar. Formatından vb. Geçerken video kompozisyonu talimatlarını en azından onurlandırmak için bekliyordum ama görünüşe göre bu şekilde çalışmıyor. Bir dokümantasyon hatasını doldurduktan sonra, Technical Q&A'da bulabilirsiniz.

+4

Peki çözüm neydi? – jpswain

+1

Bunu nasıl çözdünüz? – MAMN84

+0

Çözmek için, uygulamanız için anlamlı olan AVAssetExportPresetPassthrough dışındaki başka bir ayar kullanmanız yeterlidir. – BooTooMany

İlgili konular