美文网首页iOS 菜鸟之旅
iOS 播放本地视频不能全屏 旋转90°

iOS 播放本地视频不能全屏 旋转90°

作者: 涛涛灬灬 | 来源:发表于2019-11-07 17:25 被阅读0次

    从本地相册播放视频时,不能全屏显示 上下有黑边 并且视频旋转了90°


    WechatIMG1803.jpeg
    -(void)theTranerVideoWithVideoURL:(NSURL *)videoURL
    {
        //视频来源路径
        NSURL   *video_inputFileUrl = videoURL;
      
        //最终合成输出路径
     NSString *documentsDirectory =[NSHomeDirectory()
                                       stringByAppendingPathComponent:@"Documents"];
        NSString *outputFilePath =[documentsDirectory stringByAppendingPathComponent:@"finalchange_video2222.mp4"];
        NSURL   *outputFileUrl = [NSURL fileURLWithPath:outputFilePath];
        
        if([[NSFileManager defaultManager]fileExistsAtPath:outputFilePath])
            [[NSFileManager defaultManager]removeItemAtPath:outputFilePath error:nil];
        
        CMTime nextClipStartTime =kCMTimeZero;
        
        //创建可变的音频视频组合
        AVMutableComposition* mixComposition =[AVMutableComposition composition];
        
         //视频采集
        AVURLAsset* videoAsset =[[AVURLAsset alloc]initWithURL:video_inputFileUrl options:nil];
        CMTimeRange video_timeRange =CMTimeRangeMake(kCMTimeZero,videoAsset.duration);
    //    AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    //    [a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0]atTime:nextClipStartTime error:nil];
        
        // 视频轨道
        AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        // 插入视频轨道
        [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMake(videoAsset.duration.value, videoAsset.duration.timescale)) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] firstObject] atTime:kCMTimeZero error:nil];
    
        // 音频轨道
        AVMutableCompositionTrack *compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        // 插入音频轨道
        [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMake(videoAsset.duration.value, videoAsset.duration.timescale)) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] firstObject] atTime:kCMTimeZero error:nil];
      
        //创建一个输出
        AVAssetExportSession* _assetExport =[[AVAssetExportSession alloc]initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality];
        _assetExport.outputFileType =AVFileTypeQuickTimeMovie;
        _assetExport.outputURL =outputFileUrl;
        _assetExport.shouldOptimizeForNetworkUse=YES;
        _assetExport.videoComposition = [self getVideoComposition:videoAsset];
        self.endVideoPath=outputFileUrl;
        __weak typeof(self)weakSelf = self;
        [_assetExport exportAsynchronouslyWithCompletionHandler:
         ^(void ) {
        NSLog(@"完成!输出路径==%@",outputFilePath);
    //         [weakSelf pushResult:outputFileUrl WithCoverImage:nil];
         }
         ];
    }
    
    

    //调整视频方向 关键代码

    - (AVMutableVideoComposition *)getVideoComposition:(AVAsset *)asset {
        AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
        AVMutableComposition *composition = [AVMutableComposition composition];
        AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
        CGSize videoSize = videoTrack.naturalSize;
        
        NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
        if([tracks count] > 0) {
            AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
            CGAffineTransform t = videoTrack.preferredTransform;
            if((t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0) ||
               (t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0)){
                videoSize = CGSizeMake(videoSize.height, videoSize.width);
            }
        }
        composition.naturalSize    = videoSize;
        videoComposition.renderSize = videoSize;
        videoComposition.frameDuration = CMTimeMakeWithSeconds( 1 / videoTrack.nominalFrameRate, 600);
        
        AVMutableCompositionTrack *compositionVideoTrack;
        compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:videoTrack atTime:kCMTimeZero error:nil];
        AVMutableVideoCompositionLayerInstruction *layerInst;
        layerInst = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
        [layerInst setTransform:videoTrack.preferredTransform atTime:kCMTimeZero];
        AVMutableVideoCompositionInstruction *inst = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
        inst.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
        inst.layerInstructions = [NSArray arrayWithObject:layerInst];
        videoComposition.instructions = [NSArray arrayWithObject:inst];
        return videoComposition;
    }
    

    ps:以下代码未验证

     // 获取视频
        AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:_fileURL options:nil];
                                  
        // 视频混合
        AVMutableComposition* mixComposition = [AVMutableComposition composition];
       // 视频轨道
       AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        // 音频轨道
      AVMutableCompositionTrack *compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
      // 视频的方向
     CGAffineTransform videoTransform = [videoAsset tracksWithMediaType:AVMediaTypeVideo].lastObject.preferredTransform;
    if (videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0) {
        NSLog(@"垂直拍摄");
        videoTransform = CGAffineTransformMakeRotation(M_PI_2);
        
     }else if (videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0) {
        NSLog(@"倒立拍摄"); videoTransform = CGAffineTransformMakeRotation(-M_PI_2);
        
    }else if (videoTransform.a == 1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == 1.0) {
         NSLog(@"Home键右侧水平拍摄");
         videoTransform = CGAffineTransformMakeRotation(0);
        
    }else if (videoTransform.a == -1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == -1.0) {
            NSLog(@"Home键左侧水平拍摄");
            videoTransform = CGAffineTransformMakeRotation(M_PI);
            
    }
       // 根据视频的方向同步视频轨道方向
       compositionVideoTrack.preferredTransform = videoTransform;
    

    相关文章

      网友评论

        本文标题:iOS 播放本地视频不能全屏 旋转90°

        本文链接:https://www.haomeiwen.com/subject/gnbvbctx.html