文档首页 > > 短视频解决方案> 短视频SDK> iOS SDK> 视频编辑

视频编辑

分享
更新时间: 2019/08/02 GMT+08:00

编辑流程

初始化NvsStreamingContext

实现视频编辑需首先初始化NvsStreamingContext。

//NvsStreamingContext初始化,若已经初始化过,则直接获取对象。
NvsStreamingContext *_context = [NvsStreamingContext sharedInstance];

创建时间线

创建timeline对于编辑是非常关键的,timeline的分辨率决定了生成视频文件的最大分辨率(尺寸)。请将timeline的分辨率和NvsLiveWindow的宽高比适配一致。

通过NvsStreamingContext类对象创建时间线,时间线占用资源较小,如有需要,一个程序中可以创建多个时间线。一般创建一条时间线即可。

 NvsVideoResolution videoEditRes;         
/* 注意:请在使用LiveWindow预览的时候,将NvsLiveWindow的宽高比与此处保持一致。 */  
//视频分辨率的宽         
videoEditRes.imageWidth = 1280;  
//视频分辨率的高    
videoEditRes.imageHeight = 720;
//像素比,设为1:1           
videoEditRes.imagePAR = (NvsRational){1, 1};  
//帧速率,25~30都可以,一般25。      
NvsRational videoFps = {25, 1};        
NvsAudioResolution audioEditRes; 
//音频采样率,48000或44100均可         
audioEditRes.sampleRate = 48000;  
//音频通道数       
audioEditRes.channelCount = 2;  
//音频采样格式        
audioEditRes.sampleFormat = NvsAudSmpFmt_S16;        
//创建时间线         
NvsTimeline *_timeline = [_context createTimeline:&videoEditRes videoFps:&videoFps audioEditRes:&audioEditRes];         
// 将时间线连接到NvsLiveWindow控件,用于预览时间线上的图像         
if (![_context connectTimeline:_timeline withLiveWindow:self.liveWindow]) {             
      NSLog(@"Failed to connect timeline to liveWindow!");            
       return;        
 }

添加轨道

时间线上可以添加视频轨道和音频轨道:在视频轨道上添加视频片段,音频轨道上添加音频片段。

  • 视频轨道:一般情况下是添加一条视频轨道。如果要实现画中画,则可添加两条视频轨道。添加完轨道之后,往轨道上添加图片或者视频素材。添加到轨道上的素材为片段(clip)。图片和视频素材都是通过文件路径添加到轨道上的。唯一的区别是图片素材如果尺寸过大,需要降低图片尺寸,降低尺寸后的图片和创建timeline的分辨率的尺寸大小匹配最好。
  • 音频轨道:添加音频轨道一般用来给视频加音乐或者配音功能。
    //添加视频轨道         
    NvsVideoTrack *_videoTrack = [_timeline appendVideoTrack];         
    //添加音频轨道,有配音或者添加音乐的功能可添加音频轨道         
    NvsAudioTrack *_audioTrack = [_timeline appendAudioTrack];         
     /*             添加片段到轨道上         */        
     NSString* videoUrl = @"file:///var/mobile/Media/DCIM/102APPLE/IMG_2625.MOV";         
    [_videoTrack appendClip:videoUrl];//建议判断返回值查看片段是否添加成功

开始编辑

可以对视频进行剪裁、片段增删与排序等,进行视频编辑。

/*  视频剪裁:改变片段的入出点,裁剪片段。      
  //获取视频片段对象         
  NvsVideoClip *clip = [_videoTrack getClipWithIndex:(unsigned int)[self.tableViewVideos indexPathForSelectedRow].row];         
  //裁剪片段入点         
  [clip changeTrimInPoint:data.startTime affectSibling:YES];         
   //裁剪片段出点         
  [clip changeTrimOutPoint:data.endTime affectSibling:YES];
*/  

/*移除片段         
 [_videoTrack removeClip:(unsigned int)indexPath.row keepSpace:NO];
*/

/* 片段排序:clipIndex和destClipIndex分别代表互换的两个素材的位置索引 
  [_videoTrack moveClip:(unsigned int)sourceIndexPath.row destClipIndex:(unsigned int)destinationIndexPath.row];
 */  

/* 增加片段,filePath是图片素材的路径,trimIn设置0,trimOut设置为8000000,则图片显示为8秒*/         
[_videoTrack appendClip:asset.localIdentifier trimIn:0 trimOut:8000000];

预览播放

对于播放与定位预览接口,其参数videoSizeMode建议设置为NvsVideoPreviewSizeModeLiveWindowSize。

若无特殊需求,设为NvsVideoPreviewSizeModeFullSize的模式会影响性能。

preload是预加载,设为true。时间单位是微秒(1/1000000秒。)

//视频定位预览
[_context seekTimeline:_timeline timestamp:0 videoSizeMode:NvsVideoPreviewSizeModeLiveWindowSize flags:NvsStreamingEngineSeekFlag_ShowCaptionPoster | NvsStreamingEngineSeekFlag_ShowAnimatedStickerPoster]
//视频播放:playbackTimeline()的参数endTime,值可以是_timeline.duration或者-1           
[_context playbackTimeline:_timeline startTime:startTime endTime:_timeline.duration videoSizeMode:NvsVideoPreviewSizeModeLiveWindowSize preload:YES flags:0];

移除时间线与轨道

在程序退出时,要对创建的时间线,添加的视频轨道和音频轨道进行移除。

//移除时间线         
if (_timeline)             
[_context removeTimeline:_timeline]; 
      
// 移除指定索引值的视频轨道         
[_timeline removeVideoTrack:0];

// 移除指定索引值的音频轨道         
[_timeline removeAudioTrack:0];
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区