美摄SDK For iOS  3.7.2
疑难问题集锦
  1. 如何生成方形视频?
  2. 如何生成带有美肤特效的视频?
  3. 如何将多个素材生成一个视频文件?
  4. 如何实现画中画?
  5. 如何添加水印?
  6. 从录制界面到播放界面没有问题,返回之后,录制界面的预览黑屏
  7. NvsColor设置不生效
  8. 从录制界面到播出界面,播出界面的Livewindow闪黑然后播出正常
  9. 某些手机录制的视频播放时画面方向不正常?
  10. android使用美摄SDK时,代码混淆出错?
  11. 使用H265如何设置进行视频拍摄和生成?

详细解释

1.如何生成方形视频?

假设拍摄的视频是竖着拍摄分辨率1280*720,我们生成720*720的视频。
1)创建timeline

\if IOS
    NvsVideoResolution videoEditRes;
    videoEditRes.imageWidth = 720;
    videoEditRes.imageHeight = 720;
    videoEditRes.imagePAR = (NvsRational){1, 1};
    NvsRational videoFps = {25, 1};
    NvsAudioResolution audioEditRes;
    audioEditRes.sampleRate = 48000;
    audioEditRes.channelCount = 2;
    audioEditRes.sampleFormat = NvsAudSmpFmt_S16;
    //创建时间线
    m_timeline = [streamingContext createTimeline:&videoEditRes videoFps:&videoFps audioEditRes:&audioEditRes];
\endif
\if ANDROID
    NvsVideoResolution videoEditRes = new NvsVideoResolution();
    videoEditRes.imageWidth = 720;
    videoEditRes.imageHeight = 720;
    videoEditRes.imagePAR = new NvsRational(1, 1);
    NvsRational videoFps = new NvsRational(25, 1);
    NvsAudioResolution audioEditRes = new NvsAudioResolution();
    audioEditRes.sampleRate = 48000;
    audioEditRes.channelCount = 2;
    //创建时间线
    m_timeline = streamingContext.createTimeline(videoEditRes, videoFps, audioEditRes); 
\endif

2)创建轨道和片段,path是片段的绝对路径。

\if IOS
    NvsVideoTrack videoTrack = [m_timeline appendVideoTrack];
    NvsVideoClip clip = [videoTrack appendClip:path];
\endif
\if ANDROID
    NvsVideoTrack videoTrack = m_timeline.appendVideoTrack();
    NvsVideoClip clip = videoTrack.appendClip(path);    
\endif

3)放大视频。

\if IOS
    [clip setPan:0 andScan:1];
\endif
\if ANDROID
    clip.setPanAndScan(0, 1);   
\endif

详细设置参见摇摄与扫描(Pan and Scan)
4)生成视频,path是生成视频的路径。

\if IOS
    [m_streamingContext compileTimeline:m_timeline startTime:0 endTime:m_timeline.duration outputFilePath:path videoResolutionGrade:COMPILE_VIDEO_RESOLUTION_GRADE_720 
    videoBitrateGrade:COMPILE_BITRATE_GRADE_HIGH flags:0];
\endif  
\if ANDROID
    m_streamingContext.compileTimeline(m_timeline, 0, m_timeline.getDuration(), path, NvsStreamingContext.COMPILE_VIDEO_RESOLUTION_GRADE_720
    , NvsStreamingContext.COMPILE_BITRATE_GRADE_HIGH, 0);
\endif

2.如何生成带有美肤特效的视频?

1)创建timeline、轨道、片段同问题1。
2)添加美肤特技。

\if IOS
    [clip appendBeautyFx];
\endif  
\if ANDROID
                clip.appendBeautyFx();
\endif

3)生成视频。

3.如何将多个素材生成一个视频文件?

1)在创建轨道和片段的时候,添加多个素材创建出来多个片段。

 \if IOS
    NvsVideoTrack videoTrack = [m_timeline appendVideoTrack];
    NvsVideoClip clip1 = [videoTrack appendClip:path1];
    NvsVideoClip clip2 = [videoTrack appendClip:path2];
    NvsVideoClip clip3 = [videoTrack appendClip:path3];
    NvsVideoClip clip4 = [videoTrack appendClip:path4];
    NvsVideoClip clip5 = [videoTrack appendClip:path5];
\endif
\if ANDROID
    NvsVideoTrack videoTrack = m_timeline.appendVideoTrack();
    NvsVideoClip clip1 = videoTrack.appendClip(path1);
    NvsVideoClip clip2 = videoTrack.appendClip(path2);
    NvsVideoClip clip3 = videoTrack.appendClip(path3);
    NvsVideoClip clip4 = videoTrack.appendClip(path4);
    NvsVideoClip clip5 = videoTrack.appendClip(path5);
\endif

2)生成视频。

\if IOS
    [m_streamingContext compileTimeline:m_timeline startTime:0 endTime:m_timeline.duration outputFilePath:path videoResolutionGrade:COMPILE_VIDEO_RESOLUTION_GRADE_720 
    videoBitrateGrade:COMPILE_BITRATE_GRADE_HIGH flags:0];
\endif  
\if ANDROID
    m_streamingContext.compileTimeline(m_timeline, 0, m_timeline.getDuration(), path, NvsStreamingContext.COMPILE_VIDEO_RESOLUTION_GRADE_720
    , NvsStreamingContext.COMPILE_BITRATE_GRADE_HIGH, 0));
\endif  

即可生成1个文件。

4.如何实现画中画?

简单的画中画,用两个不同分辨率的素材例如一个横着拍摄的素材和一个竖着拍摄的素材,分别添加到两个轨道上,就可以看到两个素材叠加在一起的效果。另外Transform 2D特技可以实现视频的放大缩小、旋转、给视频加透明度。

\if IOS
    NvsVideoTrack videoTrack1 = [m_timeline appendVideoTrack];
    NvsVideoTrack videoTrack2 = [m_timeline appendVideoTrack];
    NvsVideoClip clip1 = [videoTrack1 appendClip:path1];
    NvsVideoClip clip2 = [videoTrack2 appendClip:path2];
\endif  
\if ANDROID
    NvsVideoTrack track1 = m_timeline.appendVideoTrack();
    NvsVideoTrack track2 = m_timeline.appendVideoTrack();
    NvsVideoClip clip1 = track1.appendClip(path1);
    NvsVideoClip clip2 = track2.appendClip(path2);
\endif

5.如何添加水印?

添加水印有两种方式:一是通过贴纸功能来实现的,需要用户发给一张带水印的图片,我们来进行制作。制作完的水印文件是UUID为文件名,.animatedsticker为扩展名的一个文件。有了这个文件,就可以通过我们的API实现添加水印的功能。

\if IOS
    NSMutableString *m_stickerId;
    NSString *packagePath = [appPath stringByAppendingPathComponent:@"89740AEA-80D6-432A-B6DE-E7F6539C4121.animatedsticker"];
    NvsAssetPackageManagerError error = [m_streamingContext.assetPackageManager installAssetPackage:packagePath license:nil type:NvsAssetPackageType_VideoFx sync:YES assetPackageId:m_stickerId];
    if (error != NvsAssetPackageManagerError_NoError && error != NvsAssetPackageManagerError_AlreadyInstalled) {
        NSLog(@"Failed to install video fx package!");
        package1Valid = false;
    }

    [m_timeline addAnimatedSticker:0 duration:m_timeline.duration animatedStickerPackageId:_stickerPackageId];
\endif
\if ANDROID
    StringBuilder m_stickerId = new StringBuilder();
    packagePath = "assets:/89740AEA-80D6-432A-B6DE-E7F6539C4121.animatedsticker";
    error = m_streamingContext.getAssetPackageManager().installAssetPackage(packagePath, null, NvsAssetPackageManager.ASSET_PACKAGE_TYPE_ANIMATEDSTICKER, true, m_stickerId);
        if (error != NvsAssetPackageManager.ASSET_PACKAGE_MANAGER_ERROR_NO_ERROR
                && error != NvsAssetPackageManager.ASSET_PACKAGE_MANAGER_ERROR_ALREADY_INSTALLED) {
        Log.e(TAG, "Failed to install sticker package!");
    }

    m_timeline.addAnimatedSticker(0, m_timeline.getDuration(),m_stickerId.toString());
\endif  

二是通过NvsTimeline类里的addWatermark()接口添加水印。

\if IOS
    [m_timeline addWatermark:path displayWidth:0 displayHeight:0 opacity:1 position:NvsTimelineWatermarkPosition_TopRight marginX:0 marginY:0];//path是水印文件的路径,可以是为PNG或JPG文件,或者是.caf格式文件
\endif  
\if ANDROID
    m_TimeLine.addWatermark(path, 0, 0, 1, NvsTimeline.NvsTimelineWatermarkPosition_TopLeft, 0, 0);//path是水印文件的路径,可以是PNG或JPG文件,或者是.caf格式文件
\endif  

6.从录制界面到播放界面没有问题,返回之后,录制界面的预览黑屏

检查NvsStreamingContext类里的connectCapturePreviewWithLiveWindow()有没有调用或者调用出了问题,亦或是在调用startCapturePreivew()之后,调用了NvsStreamingContext上的stop()。同样,从录制界面到播出界面,播出黑屏,可能是调用playbackTimeline()后,又调用NvsStreamingContext的stop()。还有可能是NvsStreamingContext上的connectTimelineWithLiveWindow方法没有调用或调用出了问题。

7.NvsColor设置不生效?

NvsClor类成员是Float类型,R,G,B,A取值是0到1,如果所给颜色值是100,100,100,则需要分别除以255。

8.从录制界面到播出界面,播出界面的Livewindow闪黑然后播出正常

调用playbackTimeline播出需要预览一段时间,为了避免这个问题,需要先调用seekTimeline到0的位置,再播出,就不会闪黑了。

9.某些手机录制的视频播放时画面方向不正常?

可能是有些手机播放器不支持自动旋转,会造成视频播放时画面方向不正常,因而导致用户对录制的视频播产生误导。

10.android使用美摄SDK时,代码混淆出错?

使用代码混淆时,注意避免对下面的几个类进行混淆,正确避免方式如下:

-keep class com.cdv.**  {*;}
-keep class com.meicam.**  {*;}

单独使用effectsdk时,需要对下面的类进行混淆,正确避免方式如下:

-keep class com.cdv.effect.**  {*;}
-keep class com.meicam.effect.**  {*;}

11.使用H265如何设置进行视频拍摄和生成?

使用H265进行视频拍摄的用法如下:

\if IOS
    NSMutableDictionary *config = [[NSMutableDictionary alloc] init];
    [config setValue:@"hevc" forKey:NVS_COMPILE_VIDEO_ENCODEC_NAME];
    [context startRecording:filePath withFlags:0 withRecordConfigurations:config];
\endif  
\if ANDROID
    Hashtable<String, Object> config = new Hashtable<>();
    config.put(NvsStreamingContext.COMPILE_VIDEO_ENCODER_NAME, "hevc"); //h265方式
    context.startRecording(filePath, 0, config);
\endif

使用H265进行视频生成的用法如下:

\if IOS
    NSMutableDictionary *config = [[NSMutableDictionary alloc] init];
    [config setValue:@"hevc" forKey:NVS_COMPILE_VIDEO_ENCODEC_NAME];//h265方式
    context.compileConfigurations = config;//调用compileTimeline API之前设置
    [context compileTimeline:timeline startTime:0 endTime:timeline.duration outputFilePath:ouputPath videoResolutionGrade:NvsCompileVideoResolutionGrade720 videoBitrateGrade:NvsCompileBitrateGradeHigh flags:0];
\endif  
\if ANDROID
    Hashtable<String, Object> config = new Hashtable<>();
    config.put(NvsStreamingContext.COMPILE_VIDEO_ENCODER_NAME, "hevc"); //h265方式
    context.setCompileConfigurations(config);//调用compileTimeline API之前设置
    context.compileTimeline(timeline, startTime, endTime, compileVideoPath, NvsStreamingContext.COMPILE_VIDEO_RESOLUTION_GRADE_720, NvsStreamingContext.COMPILE_BITRATE_GRADE_HIGH,0);
\endif
警告
并非所有iPhone机都可以支持H265拍摄和生成,如若不支持,则会回到默认设置进行视频拍摄和生成。