1 概述

视频就是回忆ーー那么为什么不花更多的时间让它们看起来更好呢?市场上的许多移动应用只提供基本的编辑功能,比如应用过滤器和添加贴纸。也就是说,对于那些想要制作动态视频的人来说,仅仅让一个移动的人保持焦点是不够的。传统上,这需要添加一个关键帧和视频图像手动调整,这可以吓跑许多业余视频编辑器。我就是其中之一,我一直在寻找一种更简单的方法来实现这种功能。幸运的是,我偶然发现了 HMS 核心视频编辑工具包中的跟踪人员功能,它可以自动生成一个以移动人物为中心的视频。

2 代码实现

2.1 准备工作

2.2 项目配置

通过访问令牌或 API 密钥设置应用程序的认证信息。使用 setAccessToken 方法在应用程序初始化期间设置访问令牌。这只需要设置一次。

MediaApplication.getInstance().setAccessToken("your access token");

或者,在应用程序初始化过程中使用setApiKey来设置一个 API 密钥。

MediaApplication.getInstance().setApiKey("your ApiKey");

设置一个唯一的许可证 ID。

MediaApplication.getInstance().setLicenseId("License ID");

初始化华为视频编辑器的执行期函式库。当创建一个视频编辑项目时,首先创建一个华为视频编辑器对象并初始化它的执行期函式库。在退出视频编辑项目时释放此对象。

创建一个华为视频编辑器对象。

HuaweiVideoEditor editor = HuaweiVideoEditor.create(getApplicationContext());

指定预览区域的位置。该区域呈现视频图像。这个过程是通过在 SDK 中创建 SurfaceView 实现的,必须在创建区域之前指定预览区域的位置。

<LinearLayout    
    android:id="@+id/video_content_layout"    
    android:layout_width="0dp"    
    android:layout_height="0dp"    
    android:background="@color/video_edit_main_bg_color"    
    android:gravity="center"    
    android:orientation="vertical" />
// Specify the preview area position.
LinearLayout mSdkPreviewContainer = view.findViewById(R.id.video_content_layout);

// Configure the preview area layout.
editor.setDisplay(mSdkPreviewContainer);

初始化执行期函式库。如果许可证验证失败,将引发 LicenseException。创建 HuaweiVideoEditor对象不会占用任何系统资源。执行期函式库的初始化时间必须手动设置。然后,在 SDK 中创建必要的线程和计时器。

try {
        editor.initEnvironment();
   } catch (LicenseException error) { 
        SmartLog.e(TAG, "initEnvironment failed: " + error.getErrorMsg());    
        finish();
        return;
   }

添加视频或图片。创建一个视频通道。使用文件路径向通道添加视频或图像。

// Obtain the HVETimeLine object.
HVETimeLine timeline = editor.getTimeLine();

// Create a video lane.
HVEVideoLane videoLane = timeline.appendVideoLane();

// Add a video to the end of the lane.
HVEVideoAsset videoAsset = videoLane.appendVideoAsset("test.mp4");

// Add an image to the end of the video lane.
HVEImageAsset imageAsset = videoLane.appendImageAsset("test.jpg");

3 功能实现

// Initialize the capability engine.
visibleAsset.initHumanTrackingEngine(new HVEAIInitialCallback() {
        @Override
        public void onProgress(int progress) {
        // Initialization progress.
        }

        @Override
        public void onSuccess() {
        // The initialization is successful.
        }

        @Override
        public void onError(int errorCode, String errorMessage) {
        // The initialization failed.
    }
   });

// Track a person using the coordinates. Coordinates of two vertices that define the rectangle containing the person are returned.
List<Float> rects = visibleAsset.selectHumanTrackingPerson(bitmap, position2D);

// Enable the effect of person tracking.
visibleAsset.addHumanTrackingEffect(new HVEAIProcessCallback() {
        @Override
        public void onProgress(int progress) {
            // Handling progress.
        }

        @Override
        public void onSuccess() {
            // Handling successful.
        }

        @Override
        public void onError(int errorCode, String errorMessage) {
            // Handling failed.
        }
});

// Interrupt the effect.
visibleAsset.interruptHumanTracking();

// Remove the effect.
visibleAsset.removeHumanTrackingEffect();