短视频SDK

    编辑

    • 编辑的相关接口在VideoProducer.framewrok中。

    视频预览

    • 完成拍摄或选取本地视频,将实时预览窗口与创建的媒体轨道中心(MediaTrackCenter)连接,对已完成拍摄的视频或本地视频根据需要进行编辑,然后生成视频输出.mov格式的文件
    • 代码示例如下:
    	//初始化预览视图
    
        self.previewer = [[RMVPMediaPreviewer alloc] init];
    
        self.previewer.displayView.frame = CGRectMake(65, 9, SCREEN_WIDTH - 65*2, SCREEN_HEIGHT - 9 - 221);
    
        self.previewer.displayView.backgroundColor = [UIColor blackColor];
    
        self.previewer.delegate = self;
    
        self.previewer.needRepeatPlay = YES;
    
        [self.view addSubview:self.previewer.displayView];
    
    
    	//需要视频原始尺寸
    
        RMVPMediaPreviewConfig *previewConfig = [RMVPMediaPreviewConfig defaultConfig];
    
        previewConfig.width = 720;
    
        previewConfig.height = 1280;
    
        previewConfig.gravity = RMVPMediaPreviewGravityAspectFit;
    
        self.previewer.previewConfig = previewConfig;

    插入视频或图片

    • 编辑阶段中的视频,称之为片段(segment),由媒体轨道中心(MediaTrackCenter)管理,负责插入、删除,插入视频完成后,再与配置好的预览参数进行连接,就可以实时预览页面。
    • 代码示例如下:
    	//创建媒体轨道中心
    	self.trackCenter = [[RMVPMediaTracksCenter alloc] init];
    
        RMVPMediaVideoBlendItem *blendItem = [[RMVPMediaVideoBlendItem alloc] initWithBlendMode:RMVPMediaVideoBlendModeNormal];
    
        self.videoTrack = [[RMVPMediaVisibleTrack alloc] initWithBlendItem:blendItem];
    
    
    	//创建视频片段(segment) 
    	RMVPMediaVideoSegment *segment = [[RMVPMediaVideoSegment alloc] initWithVideoAsset:tempAVAsset decoderType:RMVPMediaSegmentDecoderTypeAVPlayer];
    
        [self.videoTrack addSegment:segment];
    
    
    	//插入视频到媒体轨道中心
    	[self.trackCenter addVideoTrack: self.videoTrack];
    
    
    	//连接编辑预览与媒体轨道中心
    	[self.previewer loadTracksCenter:self.trackCenter];
    
    
    	//开始预览
    	[self.previewer resumePreview];

    素材删除

    • 片段/素材删除,片段成功添加到轨道中心后,通过传入片段索引,可以移除轨道中心上对应素材
    • 代码示例如下:
    	//删除轨道中心索引对应视频
    	[self.videoTrack removeSegmentAtIndex:index];
    
    
    	//重新链接预览与轨道中心
    	[self.previewer loadTracksCenter:self.trackCenter];
    
    
    	//重新计算轨道视频长度
    	[self.previewer seekToTime:kCMTimeZero completionBlock:^(BOOL success) {
    
            [self.previewer resumePreview];
    
        }];

    视频裁剪

    • 视频裁剪,通过设置视频出点和入点,基于时间出入点裁剪视频,此接口同样适应于音乐裁剪
    • 代码示例如下:
    	// 拖拽片段头, 向后拖拽 2 秒钟
    	CMTime deltaTime = CMTimeMakeWithSeconds(2, NSEC_PER_SEC);
    
    	[self.videoTrack clipSegmentAtIndex:draggingSegmentIndex forTime:deltaTime
    
    position:RMVPMediaTrackCilpSegmentPositionPre];
    
    
    	// 拖拽片段尾部, 向前拖拽 3 秒钟
    	CMTime deltaTime = CMTimeMakeWithSeconds(-3, NSEC_PER_SEC);
    
    	[self.videoTrack clipSegmentAtIndex:draggingSegmentIndex forTime:deltaTime
    
    position:RMVPMediaTrackCilpSegmentPositionPost];

    视频时码线

    • 视频时码线,素材\片段添加到媒体轨道后,会抽取片段缩略图形式平铺显示,这里使用系统级接口完成,主要提供两个UI组件,一个用于设置视频裁剪出点、入点视频进度条组件。另一个是抽取缩略图组件。
    • 代码示例如下:
    	//初始化视频进度条组件
    	//segments当前媒体轨道中心的片段数据集合
    	_progressBar = [[BDMVPhotoVideoProgressBar alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 58) photoVideoSegments:self.segments totalDuration:duration minDuration:3 maxSellectDuration:60];
    	// 设置代理,用户接收用户拖动行为
        _progressBar.delegate = self;
    	[self.view addSubview:_progressBar];
    	//BDMVPhotoVideoProgressBar中会调用抽取缩略图组件
    	//计算抽取缩略图个数
    	//默认缩略图分辨率{38,50},最大缩略图分辨率{100,100}。视频最大长度不超过60s

    视频截图

    • 视频截图,通过传递参数截取指定媒资的在某时间上的图片
    UIImage *image = [BDMVVideoClipViewController buildImageWithAsset:newSegment.asset maximunSize:CGSizeMake(200.f,200.f) time:CMTimeMake(1, 10)];
    
    
    + (UIImage *)buildImageWithAsset:(AVAsset *)avasset maximunSize:(CGSize)size time:(CMTime)time {
    
        if (avasset) {
    
            AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:avasset];
    
            imageGenerator.appliesPreferredTrackTransform = YES;
    
            if (!CGSizeEqualToSize(size, CGSizeZero)) {
    
                imageGenerator.maximumSize = size;
    
            }
    
            if (CMTIME_IS_INVALID(time) || CMTimeCompare(time, kCMTimeZero) == 0) {
    
                time = CMTimeMake(1, 10);
    
            }
    
            NSError *error = nil;
    
            CGImageRef cgimage = [imageGenerator copyCGImageAtTime:time actualTime:nil error:&error];
    
            
    
            UIImage *image = [UIImage imageWithCGImage:cgimage];
    
            CGImageRelease(cgimage);
    
            return image;
    
        }
    
        return nil;
    
    }

    音乐剪辑

    • 支持将选择的音乐设定入点,进入音乐剪辑页面
    	// 选择的音乐
        BDMVComposeMusictem *item = self.audioConfig.musicItem;
    
        [item setupNetMusicLocalPath];
    
        BDMVMusicClipViewController *vc = [[BDMVMusicClipViewController alloc] initWithItem:item];
    
        vc.delegate = self;
    
        [self presentViewController:vc animated:YES completion:^{}];

    创建剪辑面板

    • 剪辑面板是UI页面,可添加到指定父页面中,用于用户选择入点
        self.waveView = [[BDMVWaveformAbstractView alloc] initWithFrame:CGRectMake(16, 84, self.view.frame.size.width - 32, 52)];
    
        self.waveView.delegate = self;
    
        NSURL *musicUrl = [NSURL fileURLWithPath:self.musicItem.localPathString];
    
        AVAsset *musicAsset = [AVAsset assetWithURL:musicUrl];
    
        self.waveView.asset = musicAsset;
    
    
    	// MusicClipView任意父页面
        [MusicClipView addSubview:self.waveView];

    设置剪辑入点

    • 在选择的音乐基础上(通过初始化BDMVMusicClipViewController类传入),设置入点
        self.musicItem.clipStartPos = time;
    
        self.musicItem.clipOffset = self.startPos;
    上一篇
    录制
    下一篇
    字幕