就像我的一样。使用它。
我将几个不同的视频剪辑串成一个 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 允许它工作,尽管没有更正资产旋转。
在这一点上,我知道我只是在这里误解了一些东西。有人可以指出什么吗?