我正在通过iOS7 SDK中的AVMutableVideoCompositionLayerInstruction
修改一些视频。
以下代码用于iOS 6.1.3,但在iOS7中,视频在第一帧被冻结(尽管我仍然可以听到音频确定)。我摆脱了我申请的所有实际转换,以验证单独添加视频合成会导致问题。
AVURLAsset* videoAsset = [[AVURLAsset alloc] initWithURL:inputFileURL options:NULL];
AVAssetTrack *videoAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVMutableVideoCompositionLayerInstruction *layerInstruction =
[AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack];
AVMutableVideoComposition *mainComposition = [AVMutableVideoComposition videoComposition];
AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
mainInstruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration);
mainComposition.instructions = [NSArray arrayWithObject:mainInstruction];
mainComposition.frameDuration = videoAsset.duration;
mainComposition.renderSize = CGSizeMake(320, 320);
...
exportSession.videoComposition = mainComposition;
如果我没有设置videoComposition
的{{1}}属性,那么视频记录正常,但我无法应用任何转换。任何人都知道可能导致这种情况的原因吗?
感谢。
答案 0 :(得分:1)
我一直在与AVMutableVideoCompositionLayerInstruction一起努力,并将视频与CALayers混合在一起。经过几天尝试不同的方式,我意识到资产的时间非常重要。 找出每个资产的时间的正确方法是使用属性:
loadValuesAsynchronouslyForKeys:@ [@ “持续时间”]
//Asset url
NSURL *assetUrl = [NSURL fileURLWithPath:_firstVideoFilePath];
//audio/video assets
AVURLAsset * videoAsset = [[AVURLAsset alloc]initWithURL:assetUrl options:nil];
//var to store the duration
CMTime __block durationTime;
//And here we'll be able to proper get the asset duration
[videoAsset loadValuesAsynchronouslyForKeys:@[@"duration"] completionHandler: ^{
Float64 durationSeconds = CMTimeGetSeconds([videoAsset duration]);
durationTime = [videoAsset duration];
//At this point you have the proper asset duration value, you can start any video processing from here.
}];
希望这有助于遇到同样问题的任何人。
答案 1 :(得分:0)
调试视频合成问题的好方法是使用[AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:asset]
。返回的AVMutableVideoComposition
应该可以正常工作。然后,您可以将instructions
数组的内容与您的说明进行比较。
为了增加混淆程度,asset
也可能有AVComposition
。我认为AVFoundation
团队在命名这些事情时并没有做到最好......