ios 10中的AVAssetExportSession不适用于iPhone 7 [英] AVAssetExportSession in ios 10 not working for iPhone 7

查看:95
本文介绍了ios 10中的AVAssetExportSession不适用于iPhone 7的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我在ios 9中使用AVAssetExportSession混合两个视频时,它可以完美地工作。但是当我在iOS 10中与AVAssetExportSession混合时,它无法正常工作。如果有任何人知道原因,请帮助我。谢谢。

When I am blending two videos with AVAssetExportSession in ios 9 its working perfectly. but when i blend with AVAssetExportSession in iOS 10, it in not working. Please help me if any know the reason, Thank you.

实际代码适用于iphone 6s及更早版本,但不适用于iPhone 7

actualy code is working for iphone 6s and earlier, but not for working for iPhone 7

例如

-(void) blendVideoOverVideo:(NSURL*)mainVideoUrl andBlendVideoUrl:(NSURL*)liveEffectUrl
{
    AVURLAsset  *mainVideoUrlAsset =[AVURLAsset URLAssetWithURL:mainVideoUrl options:nil];
    //    AVPlayerItem* mainVideoPlayerItem =[[AVPlayerItem alloc]initWithAsset:mainVideoUrlAsset];
    AVAssetTrack* mainVideoTrack =[[mainVideoUrlAsset tracksWithMediaType:AVMediaTypeVideo]firstObject];
    CGSize mainVideoSize = [mainVideoTrack naturalSize];

    AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];

    AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:mainVideoUrl options:nil];
    if(mainVideoUrl!=nil)
    {
        if([[audioAsset tracksWithMediaType:AVMediaTypeAudio] count])
        {
            AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                                                preferredTrackID:kCMPersistentTrackID_Invalid];
            [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, mainVideoUrlAsset.duration )
                                                ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
                                                 atTime:kCMTimeZero
                                                  error:nil];
        }
    }

    AVMutableCompositionTrack *mainVideoConpositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

    [mainVideoConpositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, mainVideoUrlAsset.duration) ofTrack:mainVideoTrack atTime:kCMTimeZero error:nil];

    AVMutableVideoCompositionLayerInstruction *mainVideoLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:mainVideoConpositionTrack];

    //SEcond Track
    AVURLAsset  *blendVideoUrlAsset =[AVURLAsset URLAssetWithURL:liveEffectUrl options:nil];
    //    AVPlayerItem* blendVideoPlayerItem =[[AVPlayerItem alloc]initWithAsset:blendVideoUrlAsset];
    AVAssetTrack* blendVideoTrack =[[blendVideoUrlAsset tracksWithMediaType:AVMediaTypeVideo]firstObject];
    CGSize blendVideoSize = [blendVideoTrack naturalSize];

    AVMutableCompositionTrack *blendVideoConpositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

    CMTime oldTime=CMTimeMakeWithSeconds(CMTimeGetSeconds(blendVideoUrlAsset.duration), blendVideoUrlAsset.duration.timescale);

//    CMTime timeNew=CMTimeMakeWithSeconds(CMTimeGetSeconds(blendVideoUrlAsset.duration)/2, blendVideoUrlAsset.duration.timescale);


    [blendVideoConpositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, oldTime) ofTrack:blendVideoTrack atTime:kCMTimeZero error:nil];

    AVMutableVideoCompositionLayerInstruction *blendVideoLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:blendVideoConpositionTrack];

    AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
    MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, mainVideoUrlAsset.duration);

    CGAffineTransform Scale = CGAffineTransformMakeScale(1.0f,1.0f);
    CGAffineTransform Move = CGAffineTransformMakeTranslation(0,0);
    [mainVideoLayerInstruction setTransform:CGAffineTransformConcat(Scale,Move) atTime:kCMTimeZero];

    [blendVideoLayerInstruction setOpacity:0.5 atTime:kCMTimeZero];
//    [blendVideoLayerInstruction setOpacity:0.0 atTime:timeNew];

    CGFloat cropOffX = 1.0;
    CGFloat cropOffY = 1.0;
    if(blendVideoSize.height>mainVideoSize.height)
    {
        cropOffY = mainVideoSize.height/blendVideoSize.height;
    }else{

        cropOffY = mainVideoSize.height/blendVideoSize.height;

    }
    if(blendVideoSize.width>mainVideoSize.width)
    {
        cropOffX = mainVideoSize.width/blendVideoSize.width;
    }
    Scale = CGAffineTransformMakeScale(cropOffX,cropOffY);
    Move = CGAffineTransformMakeTranslation(0.1,  0.1);
    [blendVideoLayerInstruction setTransform:CGAffineTransformConcat(Scale,Move) atTime:kCMTimeZero];

    MainInstruction.layerInstructions = [NSArray arrayWithObjects:blendVideoLayerInstruction,mainVideoLayerInstruction,nil];

    AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition];
    MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction];
    MainCompositionInst.frameDuration = CMTimeMake(1, 30);
    MainCompositionInst.renderSize = mainVideoSize;


    NSString *fullName= [NSString stringWithFormat:@"video%d.mov",arc4random() % 1000];



    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:fullName];
    if([[NSFileManager defaultManager] fileExistsAtPath:myPathDocs])
    {
        [[NSFileManager defaultManager] removeItemAtPath:myPathDocs error:nil];
    }
    NSURL *url = [NSURL fileURLWithPath:myPathDocs];
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality];
    exporter.outputURL=url;

    CMTime start;
    CMTime duration;

    NSLog(@"Main Video dura %f blend dura - %f, ",CMTimeGetSeconds(mainVideoUrlAsset.duration),CMTimeGetSeconds(blendVideoUrlAsset.duration));


    if(CMTimeGetSeconds(blendVideoUrlAsset.duration)>CMTimeGetSeconds(mainVideoUrlAsset.duration))
    {
        start = CMTimeMakeWithSeconds(0.0, blendVideoUrlAsset.duration.timescale);
        duration = CMTimeMakeWithSeconds(CMTimeGetSeconds(mainVideoUrlAsset.duration), blendVideoUrlAsset.duration.timescale);
    }
    else if(CMTimeGetSeconds(mainVideoUrlAsset.duration)>CMTimeGetSeconds(blendVideoUrlAsset.duration))
    {
        start = CMTimeMakeWithSeconds(0.0, mainVideoUrlAsset.duration.timescale);
        duration = CMTimeMakeWithSeconds(CMTimeGetSeconds(mainVideoUrlAsset.duration), mainVideoUrlAsset.duration.timescale);
    }
    CMTimeRange range = CMTimeRangeMake(start, duration);

    exporter.timeRange = range;
    [exporter setVideoComposition:MainCompositionInst];
    exporter.outputFileType = AVFileTypeQuickTimeMovie;

    __weak typeof(self) weakSelf = self;

    [weakSelf createMBCircularProgress:exporter];


    [exporter exportAsynchronouslyWithCompletionHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf exportDidFinish:exporter];
        });
    }];
}

此代码将在iPhone 6s中运行ios 9甚至iOS 10,6 ,5等但这段代码不能在iPhone 7模拟器中运行。

this code will run in ios 9 and even iOS 10 in iPhone 6s, 6,5 etc but this code will not run in iPhone 7 simulator.

解决方案是我们需要使用最新的XCode 8.1 beta来运行这个

The solution is we need to use latest XCode 8.1 beta for running this

推荐答案

It's a bug.

It's fixed in Xcode 8.1 beta.

Xcode 8.1 beta [AVAssetExportSession allExportPresets] iPhone 7模拟器现在返回

Xcode 8.1 beta [AVAssetExportSession allExportPresets] iPhone 7 Simulator now returns

AVAssetExportPreset1920x1080,
AVAssetExportPresetLowQuality,
AVAssetExportPresetAppleM4A,
AVAssetExportPreset640x480,
AVAssetExportPreset3840x2160,
AVAssetExportPresetHighestQuality,
AVAssetExportPreset1280x720,
AVAssetExportPresetMediumQuality,
AVAssetExportPreset960x540

Xcode 8.0 [AVAssetExportSession allExportPresets] iPhone 7 Simulator返回一个空数组

Xcode 8.0 [AVAssetExportSession allExportPresets] iPhone 7 Simulator returns an empty array

这篇关于ios 10中的AVAssetExportSession不适用于iPhone 7的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆