我在 IOS6 中有一个可以正常工作的应用程序,在使用 AVComposition 时会在 IOS7 中中断。
这是问题所在:在以前的视图控制器中,我使用AVPlayerItemVideoOutput
&捕获用户屏幕AVAssetWriterInputPixelBufferAdaptor
以生成视频输出文件。在我当前的视图控制器中,我将生成的视频文件添加到 AVComposition 以在此文件和一些音频之间生成视频合成。在 IOS6 中,此过程完美运行,并且 AVExportSession 完成。在 IOS7 中,导出过程未完成(从不调用完成处理程序,状态始终为AVAssetExportSessionStatusExporting
)。
这是我的伪代码:
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.metaInfo.videoCaptureFile options:nil];
AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:&error];
AVMutableCompositionTrack *audioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:&error];
AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
/// Code for processing the composition
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset640x480];
// Code for setting up exporter
[exporter exportAsynchronouslyWithCompletionHandler:^
{
dispatch_async(dispatch_get_main_queue(), ^{
[self exportDidFinished:exporter];
});
}];
调试我的代码后,问题归结为正在使用的生成的视频文件。如果我更改asset
为硬编码文件,则导出器完成。有趣的是,生成的视频文件AVPlayerItemVideoOutput
在MPMoviePlayerViewController
. AVPlayerItemVideoOutput
在 IOS7 中或在 IOS7 中是否发生了一些变化AVAssetWriterInputPixelBufferAdaptor
,会阻止输出文件在合成中使用?我需要在合成中添加额外的规格吗?它必须处理不同的帧速率吗?
谢谢您的帮助!