美文网首页
iOS:AVFoundation视频-分屏

iOS:AVFoundation视频-分屏

作者: 豆浆油条cc | 来源:发表于2020-01-22 16:18 被阅读0次

思路是以我之前写的博客扩展的
https://www.jianshu.com/writer#/notebooks/3738533/notes/58814308

能够实现视频的分屏比例 横竖屏都可:1:1、16:9、9:16
根据比例计算出每一个视频图层的位置、分辨率

效果图

横屏1:1.gif 竖屏1:1.gif 横屏16:9.gif 竖屏16:9.gif 横屏9-16.gif 竖屏9:16.gif

注意:因为在获取竖屏的CVPixelBufferRef,需要旋转90度,否则合成出的图片有旋转角度,
建议先把竖屏旋转之后,再合成,因为虽然单个对CGImageRef进行旋转耗时在30-40ms之间,但是连续读取帧,处理帧会造成耗时严重。

处理frame的核心代码:


- (CGRect)getComposeTypeFromTrackID:(NSInteger)trackID renderSize:(CGSize)renderSize{

    CGRect rect = CGRectZero;
    
    switch (self.type) {
        case composeVideos_1And1_portrait:
            rect = CGRectMake(0, (renderSize.height/2)*(trackID - 1), renderSize.width, renderSize.height/2);
            break;
        case composeVideos_1And1_landscape:
            rect = CGRectMake((renderSize.width/2)*(trackID - 1), 0, renderSize.width/2, renderSize.height);
            break;
        case composeVideos_16And9_portrait:
        {
            CGFloat height = renderSize.width* 9.0/16.0;
            CGFloat y = (renderSize.height - height * 2)/2 + (trackID - 1)*height;
            rect = CGRectMake( 0, y, renderSize.width, height);
        }
            break;
        case composeVideos_16And9_landscape:
            {
                CGFloat height = renderSize.width* 9.0/16.0;
                CGFloat x = (renderSize.width/2)*(trackID - 1);
                CGFloat y = (renderSize.height - height)/2;
                rect = CGRectMake(x, y, renderSize.width/2, height);
            }
            break;
            case composeVideos_9And16_portrait:
                {
                    CGFloat height = renderSize.height/2;
                    CGFloat width = renderSize.width* 9.0/16.0;
                    CGFloat y = height * (trackID - 1);
                    CGFloat x = (renderSize.width - width)/2;
                    rect = CGRectMake(x, y, width, height);
                }
                break;
            
            case composeVideos_9And16_landscape:
                {
                    CGFloat height = renderSize.height;
                    CGFloat width = renderSize.width* 9.0/16.0/2;
                    CGFloat y = 0;
                    CGFloat x = (renderSize.width - width*2)/2 + (trackID - 1)*width;
                    rect = CGRectMake(x, y, width, height);
                }
                break;
            
        default:
            break;
    }
    
    return rect;
}

GitHub:
https://github.com/qw9685/splitVideos

相关文章

网友评论

      本文标题:iOS:AVFoundation视频-分屏

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