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

详细解释

1.如何生成方形视频?

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

    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); 

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

    NvsVideoTrack videoTrack = m_timeline.appendVideoTrack();
    NvsVideoClip clip = videoTrack.appendClip(path);    

3)放大视频。

    clip.setPanAndScan(0, 1);   

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

    m_streamingContext.compileTimeline(m_timeline, 0, m_timeline.getDuration(), path, NvsStreamingContext.COMPILE_VIDEO_RESOLUTION_GRADE_720
    , NvsStreamingContext.COMPILE_BITRATE_GRADE_HIGH, 0);

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

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

                clip.appendBeautyFx();

3)生成视频。

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

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

    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);

2)生成视频。

    m_streamingContext.compileTimeline(m_timeline, 0, m_timeline.getDuration(), path, NvsStreamingContext.COMPILE_VIDEO_RESOLUTION_GRADE_720
    , NvsStreamingContext.COMPILE_BITRATE_GRADE_HIGH, 0));

即可生成1个文件。

4.如何实现画中画?

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

    NvsVideoTrack track1 = m_timeline.appendVideoTrack();
    NvsVideoTrack track2 = m_timeline.appendVideoTrack();
    NvsVideoClip clip1 = track1.appendClip(path1);
    NvsVideoClip clip2 = track2.appendClip(path2);

5.如何添加水印?

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

    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());

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

    m_TimeLine.addWatermark(path, 0, 0, 1, NvsTimeline.NvsTimelineWatermarkPosition_TopLeft, 0, 0);//path是水印文件的路径,可以是PNG或JPG文件,或者是.caf格式文件

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进行视频拍摄的用法如下:

    Hashtable<String, Object> config = new Hashtable<>();
    config.put(NvsStreamingContext.COMPILE_VIDEO_ENCODER_NAME, "hevc"); //h265方式
    context.startRecording(filePath, 0, config);

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

    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);
警告
并非所有的android机都可以支持H265拍摄和生成,如若不支持,则会回到默认设置进行视频拍摄和生成。