2011-08-17 47 views
2

和我一樣。使用它。AVVideoComposition Failure

我將幾個不同的視頻剪輯串在一起成AVMutableComposition並試圖糾正其方向,如果需要。

這裏是我的代碼:

composition = [[AVMutableComposition alloc] init]; 
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 

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

CMTime nextClipStartTime = kCMTimeZero; 

// orientation compensation vars 
AVMutableVideoCompositionInstruction *inst = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
NSMutableArray *compInst = [[NSMutableArray alloc] init]; 

// get view size 
CGSize viewSize = playerView.frame.size; 

// generate movie assets 
for (NSString* moviePath in [currentBlam valueForKey:@"movies"]) { 
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath]; 
    AVURLAsset *movieAsset = [AVURLAsset URLAssetWithURL:movieURL options:nil]; 

    // scale asset to fit screen 

    CMTimeRange tr = CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(0.0f, 1), CMTimeMakeWithSeconds(0.0f, 1)); 

    // create video track 
    AVAssetTrack *clipVideoTrack = [[movieAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    // create audio track 
    AVAssetTrack *clipAudioTrack = [[movieAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

    tr = CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(0.0f, 1), CMTimeMakeWithSeconds(CMTimeGetSeconds([movieAsset duration]), 1)); 

    AVMutableVideoCompositionLayerInstruction *layerInst; 
    layerInst = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack]; 

    int or = [self orientationForTrack:movieAsset]; 
    if (or==1) { 
     float rot = (0.0f); 
     [layerInst setTransform:CGAffineTransformMakeRotation(rot) atTime:nextClipStartTime]; 
    } else if (or==2) { 
     float rot = (M_PI); 
     [layerInst setTransform:CGAffineTransformMakeRotation(rot) atTime:nextClipStartTime]; 
    } else if (or==3) { 
     float rot = (M_PI*-0.5f); 
     [layerInst setTransform:CGAffineTransformMakeRotation(rot) atTime:nextClipStartTime]; 
    } else if (or==4) { 
     float rot = (M_PI*0.5f); 
     [layerInst setTransform:CGAffineTransformMakeRotation(rot) atTime:nextClipStartTime]; 
    } 

    [layerInst setTransform:clipVideoTrack.preferredTransform atTime:nextClipStartTime]; 
    [compInst addObject:layerInst]; 

    // insert video track 
    [compositionVideoTrack insertTimeRange:tr 
            ofTrack:clipVideoTrack 
            atTime:nextClipStartTime 
            error:nil]; 
    // insert audio track 
    [compositionAudioTrack insertTimeRange:tr 
            ofTrack:clipAudioTrack 
            atTime:nextClipStartTime 
            error:nil]; 

    nextClipStartTime = CMTimeAdd(nextClipStartTime, tr.duration); 
} 

//set size and duration 
composition.naturalSize = viewSize; 
videoComposition.frameDuration = composition.duration; 
videoComposition.renderSize = viewSize; 
videoComposition.renderScale = 1.0f; 

//apply instructions 
inst.timeRange = CMTimeRangeMake(kCMTimeZero, composition.duration); 
inst.layerInstructions = compInst; 
videoComposition.instructions = [NSArray arrayWithObject:inst]; 

playerItem = [[AVPlayerItem alloc] initWithAsset:composition]; 
playerItem.videoComposition = videoComposition; 
[playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemDidReachEnd:) 
              name:AVPlayerItemDidPlayToEndTimeNotification 
              object:playerItem]; 
player = [AVPlayer playerWithPlayerItem:playerItem]; 

[playerView setPlayer:player]; 

當我運行這一點,與內容無關填充顯示。

這是以前沒有AVVideoComposition應用於播放器。實際上,註釋掉playerItem.videoComposition = videoComposition可以使其工作,儘管沒有更正資產輪換。

在這一點上我知道我只是在這裏誤解了一些東西。有人能指出什麼嗎?

+0

我會跟進並說我知道視頻仍然可以播放。聲音播放和擦洗滑塊正常前進。我只是沒有看到視頻中的任何內容。 – Lane

+0

有沒有想到這一點? – scttnlsn

回答

2

您是否認爲視頻旋轉的關鍵點不是中心,視頻是從屏幕上拖出來的?這可能完全是錯誤的,但它只是我的第一個想法。

1

我想你設置每個單個幀是整個剪輯的長度:

videoComposition.frameDuration = composition.duration;