SDK接入文档

如需 demo 可前往 https://github.com/cosmos33/MMVideoSDK-Android

1. 接入前准备

1.1. 注册

  • 注册应用

  • 开通短视频服务

1.2. 工程配置

  • 权限配置

接入SDK需要如下权限,将如下代码copy到主app的AndroidManifest.xml对应位置

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 最小支持版本

    4.4 API19

  • 在项目build.gradle中添加仓库地址

mavenCentral()
  • 添加工程依赖
implementation 'com.immomo.cosmos.mediax:recorder:2.4.1_120300'//依赖androidx版本
  • so架构

SDK目前支持 armeabi-v7a 、armeabi 、arm64-v8a 架构,请在app/build.gradle文件中配置如下代码。在android/defaultConfig/结构下添加

ndk {
    abiFilters "armeabi-v7a","armeabi","arm64-v8a"
}
  • 混淆配置
#mmfile
-keep class com.mm.mmfile.**{*;}


# 保留本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}



-keep class com.core.glcore.util.** {*;}
-keep class com.momocv.** {*;}
-keep class com.imomo.momo.mediaencoder.** {*;}

-keep class com.imomo.momo.mediaencoder.MediaEncoder{*;}

-keep class com.imomo.momo.mediamuxer.** {*;}

-keep class com.cosmos.mdlog.** {*;}
-keep class com.immomo.moment.mediautils.VideoDataRetrieverBySoft {*;}
-keep class com.immomo.moment.mediautils.YuvEditor {*;}
-keep class com.immomo.moment.mediautils.AudioMixerNative {*;}
-keep class com.immomo.moment.mediautils.MP4Fast {*;}
-keep class com.immomo.moment.mediautils.AudioResampleUtils {*;}
-keep class com.immomo.moment.mediautils.AudioSpeedControlPlayer {*;}
-keep interface com.immomo.moment.mediautils.AudioSpeedControlPlayer$* {*;}
-keep interface com.immomo.moment.mediautils.VideoDataRetrieverBySoft$* {*;}
-keep class com.immomo.moment.mediautils.VideoDataRetrieverBySoft$* {*;}
-keep class * extends com.immomo.moment.mediautils.MediaUtils {*;}
-keep class com.immomo.moment.mediautils.FFVideoDecoder* {*;}
-keep class com.momoap.pitchshift.** {*;}

-keep class com.immomo.doki.media.entity.** {*;}
-keep class com.momo.mcamera.** {*;}
-dontwarn com.momo.mcamera.mask.**
-keep class com.google.gson.** {*;}
-keep public class com.immomo.mmdns.**{*;}
-keep class com.momo.xeengine.**{*;}

2. 功能接入

2.1. 授权

授权流程是所有流程中基础流程,需要先进行初始化,才可以使用其他功能,否则可能会出现一些异常状态。

初始化

com.mm.mediasdk.MoMediaManager#init(Application application, String appid);

获取录制器

IMultiRecorder com.mm.mediasdk.MoMediaManager#createRecorder();

获取视频处理器

IVideoProcessor com.mm.mediasdk.MoMediaManager#createVideoProcessor();

获取图片处理器

ImageProcess com.mm.mediasdk.MoMediaManager#createImageProcessor();

2.2. 拍照

2.2.1. 构造IMultiRecorder

IMultiRecorder recorder = MoMediaManager.createRecorder();

2.2.2. 初始化

MRConfig mrConfig = MRConfig.obtain();
mrConfig.setDefaultCamera(Camera.CameraInfo.CAMERA_FACING_FRONT);
Size size = new Size(1280, 720);
mrConfig.setEncodeSize(size);
// 设置camera 的采集分辨率
mrConfig.setTargetVideoSize(size);


recorder.prepare(this, new MRSDKConfig.Build(mrConfig)
                .build());   

//设置预览画面的宽高
recorder.setVisualSize(width, height);
//设置预览画布
recorder.setPreviewDisplay(holder);

2.2.3. 开始预览

recorder.startPreview();

2.2.4. 拍照

File file = new File(Environment.getExternalStorageDirectory(), "take_photo.jpg");
recorder.takePhoto(file.getAbsolutePath(), new MRecorderActions.OnTakePhotoListener() {
    @Override
    public void onTakePhotoComplete(int status, Exception e) {
        //0表示完成, -1表示失败
        MDLog.e(LogTag.RECORD, "onTakePhotoComplete %d", status);
    }
});

2.2.5. 结束预览

recorder.stopPreview();

2.2.6. 释放资源

recorder.release();

其他操作,参考接口文档进行操作

2.3. 录制

2.3.1. 构造IMultiRecorder

IMultiRecorder recorder = MoMediaManager.createRecorder();

2.3.2. 初始化

MRConfig mrConfig = MRConfig.obtain();
mrConfig.setDefaultCamera(Camera.CameraInfo.CAMERA_FACING_FRONT);
//设置码率 8M
mrConfig.setVideoEncodeBitRate(8<<20);

//设置音频声道数
mrConfig.setAudioChannels(1);
//以下两项选一种即可
//mrConfig.setUseDefaultEncodeSize(true);
mrConfig.setEncodeSize(new Size(640, 960));
//设置视频编码帧率
mrConfig.setVideoFPS(20);
// 设置camera 的采集分辨率
mrConfig.setTargetVideoSize(new Size(1280, 720));
recorder.prepare(this, new MRSDKConfig.Build(mrConfig)
                .build());   
//设置预览画面的宽高
recorder.setVisualSize(width, height);
//设置预览画布
recorder.setPreviewDisplay(holder);

//设置视频输出路径
File file = new File(Environment.getExternalStorageDirectory(), "video_test.mp4");
recorder.setMediaOutPath(file.getAbsolutePath());

2.3.3. 开始预览

recorder.startPreview();

2.3.4. 开始录制

recorder.startRecording();

2.3.5. 停止录制

recorder.pauseRecording();

2.3.6. 完成录制

recorder.finishRecord(new MRecorderActions.OnRecordFinishedListener() {
    @Override
    public void onFinishingProgress(int progress) {
        MDLog.e(TAG, "onFinishingProgress %d", progress);
    }

    @Override
    public void onRecordFinished() {
        MDLog.e(TAG, "onRecordFinished");
    }

    @Override
    public void onFinishError(String errMsg) {
        MDLog.e(TAG, "onFinishError %s", errMsg);
    }
});

其他功能参考接口文档和demo中的使用

2.4. 视频处理

参考 #VideoProcessTestActivity 测试代码

2.4.1. 构造IVideoProcessor

IVideoProcessor videoProcessor = MoMediaManager.createVideoProcessor();

2.4.2. 基本设置

videoProcessor.setLoopBack(true);
videoProcessor.setOutVideoInfo(720, 1280, 30, 4<<20, false);
videoProcessor.setOnProcessErrorListener(new MRecorderActions.OnProcessErrorListener() {
    @Override
    public void onErrorCallback(int what, int errorCode, String msg) {
        MDLog.e(TAG, "onErrorCallback %d", what);
    }
});

videoProcessor.setOnStatusListener(new MRecorderActions.OnProcessProgressListener() {
    @Override
    public void onProcessProgress(float progress) {
        MDLog.e(TAG, "onProcessProgress %f", progress);
    }

    @Override
    public void onProcessFinished() {
        MDLog.e(TAG, "onProcessFinished");
        Toaster.show("导出完成");
    }
});

//选择视频源,放入到videoPath中
MoVideo moVideo = new MoVideo();
moVideo.path = videoPath;
moVideo.osPercent = 100;
moVideo.psPercent = 0;
videoProcessor.prepareVideo(moVideo);

2.4.3. 预览

videoProcessor.addScreenSurface(holder);
videoProcessor.startPreview();

2.4.4. 添加滤镜

List<MMPresetFilter> filters = FiltersManager.getAllFilters();
lastFilter = FilterUtils.getFilterGroupByIndex(2, filters);
videoProcessor.addFilters(lastFilter);

2.4.5. 删除滤镜

videoProcessor.deleteFilter(lastFilter);

2.4.6. 添加动态贴纸

//进行此操作前提是,已经下载了狗头动态贴纸,第三个参数为ID,用于删除时使用
MaskModel model = MaskStore.getInstance().getMask(AppContext.getContext(), "/storage/emulated/0/MomoVideoSDK/moment/dynamic_sticker/59ccd466f38ef/3");
videoProcessor.addMaskModel(model, 1, 0.5f, 0.5f);

2.4.7. 删除动态贴纸

videoProcessor.removeMaskModel(1);

2.4.8. 暂停视频播放

videoProcessor.pause();

2.4.9. 恢复视频播放

videoProcessor.resume();

其他功能参考接口文档和demo中的使用

2.5. 图片处理

2.5.1. 构建ImageProcess

ImageProcess imageProcess = MoMediaManager.createImageProcessor();

2.5.2. 基本设置

//给处理器设置滤镜
imageProcess.initFilters(FiltersManager.getAllFilters());

FastImageProcessingView processingView = findViewById(R.id.media_cover_image);

//设置处理后保存的路径
File file = new File(Configs.getDir("ProcessImage"), System.currentTimeMillis() + "_process.jpg");
imageProcess.init(this, processFilePath, processingView, file.getAbsolutePath());

2.5.3. 页面 Resume

    /**
     * 前台可见调用(2.0.0版本起可用)
     */
    imageProcess.onResume();

2.5.4. 切换滤镜

//具体替换滤镜的index,要根据初始化时的滤镜组决定,不可越界
imageProcess.switchFilterPreview(2);

2.5.5. 磨皮、美白、大眼、瘦脸

imageProcess.updateSkinLevel(1f);
imageProcess.updateSkinLightingLevel(1f);

2.5.6. 开始处理

imageProcess.setImageProcessListener(new ImageProcess.ImageProcessListener() {
    @Override
    public void onProcessCompleted(final String path) {
        MDLog.e(TAG, "onProcessCompleted %s", path);
    }

    @Override
    public void onProcessFailed() {
        MDLog.e(TAG, "onProcessFailed");
    }
});
imageProcess.startImageProcess(null, null, 0, 0);

2.5.7. 释放

imageProcess.release();
Copyright © momo 2019 all right reserved,powered by Gitbook修订时间: 2022-07-01 16:21:31

results matching ""

    No results matching ""