- react-native ^0.41.2
- iOS
- iOS 12.0 及以上的 iPhone
- Swift 5
- CocoaPods
- Anroid
- Android Studio 3.0+
- JDK 17
详见:美摄sdk产品概述
App 需要在 Info.plist 中添加以下权限,否则将无法使用短视频模块。
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能访问相机</string>
<key>NSMicrophoneUsageDescription</key>
<string>App需要您的同意,才能访问麦克风</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册</string>
<key>NSAppleMusicUsageDescription</key>
<string>App需要您的同意,才能访问音乐</string>
在 AndroidManifest.xml 中添加以下权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> <!-- <uses-permission android:name="android.permission.INTERNET" /> -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
美摄SDK授权方法:
在美摄官网注册用户后,创建应用,配置App包名,由美摄商务同事开通授权后,可在应用信息中下载授权文件。
将下载授权.lic文件重命名为meicam_licence.lic,放入原生项目中
SDK授权和App的包名绑定。未授权时,SDK全功能不再检查授权,都可以使用,绘制的画面会带MEISHE水印。
短视频模块用到的滤镜、贴纸、音乐等文件均通过网络接口获取。需要服务端按接口文档实现相应的接口。 在App工程中配置服务器地址及公共参数。
import { NvShortVideo, NvVideoConfig } from 'react-native-nvshortvideo';
...
//服务器地址
//Server url
/// assetRequestUrl 素材列表请求 Material list request
/// assetCategoryUrl 素材分类列表请求 Material category list request
/// assetMusiciansUrl 音乐列表请求 Music list request
/// assetFontUrl 字体列表请求 Font list request
/// assetDownloadUrl 下载地址请求 Download address request
/// assetPrefabricatedUrl 预制素材请求 Prefabricated material request
/// assetAutoCutUrl 一键成片网络请求 AutoCut request
/// assetTagUrl 模版标签列表请求 Template tag list request
/// clientId clientId
/// clientSecret clientSecret
/// assemblyId assemblyId
/// isAbroad 海外数据请求,0==全部,1==海外 Overseas data request, 0== all, 1== overseas
let map = {
'host': 'https://mall.meishesdk.com/api/shortvideo/',
'assetRequestUrl': 'materialcenter/mall/custom/listAllAssemblyMaterial',
'assetCategoryUrl': 'materialcenter/appSdkApi/listTypeAndCategory',
'assetMusiciansUrl': 'materialcenter/appSdkApi/listMusic',
'assetFontUrl': 'materialcenter/listFont',
'assetDownloadUrl': 'materialcenter/mall/custom/materialInteraction',
'assetPrefabricatedUrl': 'materialcenter/beautyAssets/latest',
'assetAutoCutUrl': 'materialcenter/recommend/listTemplate',
'assetTagUrl': 'materialcenter/listTemplateTag',
'clientId': '7480f2bf193d417ea7d93d64',
'clientSecret': 'e4434ff769404f64b33f462331a80957',
'assemblyId': 'MEISHE_MATERIAL_LIST',
'isAbroad': 1
};
let videoOperator = NvShortVideo.shareInstance();
videoOperator.configServerInfo(map);
短视频模块依赖的素材包可根据需要选择。预制素材详见:短视频模块预制素材
模块单例:let videoOperator = NvShortVideo.shareInstance(); 调用示例:
import { NvShortVideo, NvVideoConfig } from 'react-native-nvshortvideo';
...
let videoOperator = NvShortVideo.shareInstance();
videoOperator.startVideoCaptrue(this.videoConfig);
/*! \if ENGLISH
*
* \brief Shooting entrance
* \param config Configuration item
* \param music The default is nil,If you need to shoot with music, you need to pass an audio object, and the path of the audio must be local and has been downloaded
* \else
*
* \brief 拍摄入口
* \param config 配置项
* \param music 默认是nil,如果拍摄时需要带音乐拍摄,需要传递一个音频对象,音频的路径必须是本地的,已经下载的路径
* \endif
*/
startVideoCaptrue(config?: NvVideoConfig, musicInfo?: NvMusicInfo): void;
/*! \if ENGLISH
*
* \brief PIP entrance By default, the album is opened, and a material from the album is taken into the beat
* \param config Configuration item
* \else
*
* \brief 合拍入口,默认打开相册,从相册取一个素材进入合拍
* \param config 配置项
* \endif
*/
startVideoDualCaptrue(config?: NvVideoConfig): void;
/*! \if ENGLISH
*
* \brief PIP entrance
* \param config Configuration item
* \param videoPath The video path to be filmed must be a local path
* \else
*
* \brief 合拍入口
* \param config 配置项
* \param videoPath 准备合拍的视频路径,必须是本地路径
* \endif
*/
startVideoDualCaptrueWithVideo(videoPath: string, config?: NvVideoConfig): void;
/*! \if ENGLISH
*
* \brief Edit entrance
* \param config Configuration item
* \else
*
* \brief 编辑入口
* \param config 配置项
* \endif
*/
startSeleteFilesForEdit(config?: NvVideoConfig): void;
/*! \if ENGLISH
* \brief Edit module event callback
* \else
* \brief 编辑模块事件回调
* \endif
*/
setVideoEditEventHandler(handler?: (event: NvVideoEditEvent, info: Map<string, string>) => void): void;
/*! \if ENGLISH
* \brief selete cover image
* \else
* \brief 选择封面图片
* \endif
*/
selectCoverImage(): Promise<Map<string, any>>;
/*! \if ENGLISH
* \brief save draft
* \else
* \brief 保存草稿
* \endif
*/
saveDraft(info: string): Promise<Map<string, any>>;
/*! \if ENGLISH
* \brief Composite video
* \else
* \brief 合成视频
* \endif
*/
compileCurrentTimeline(configure: Map<string, string>): Promise<Map<string, any>>;
/*! \if ENGLISH
* \brief Composite video event callback
* \else
* \brief 视频合成事件回调
* \endif
*/
setVideoCompileEventHandler(handler?: (event: NvVideoCompileEvent, compileInfo: Map<string, string>) => void): void;
/*! \if ENGLISH
* \brief save image
* \else
* \brief 保存图片
* \endif
*/
saveImage(coverImagePath: string): Promise<Map<string, any>>;
视频发布页退出时调用
/*! \if ENGLISH
*
* \brief Exit the entire publisher call
* \param taskId Returned by the edit completion callback
* \warning This method will clean up the current draft and SDK-held resources, please call after completely exiting the editing and publishing process
* \else
*
* \brief 退出整个发布器调用
* \param taskId 由编辑完成回调中返回
* \warning 该方法会清理当前草稿以及sdk持有资源,请在完全退出编辑发布流程之后,调用
* \endif
*/
exitEdit(taskId: String): void;
/*! \if ENGLISH
* \brief get draft list
* \else
* \brief 获取草稿列表
* \endif
*/
getDraftList(): Promise<Map<string, any>>;
/*! \if ENGLISH
* \brief delete draft
* \else
* \brief 删除草稿
* \endif
*/
deleteDraft(draftId: string): Promise<Map<string, any>>;
/*! \if ENGLISH
*
* \brief Enter the editing portal through draft data recovery
* \param draftId Current draft id
* \param config Configuration item
* \else
*
* \brief 通过草稿数据恢复,进入编辑入口
* \param draftId 当前草稿id
* \param config 配置项
* \endif
*/
reeditDraft(draftId: string, config?: NvVideoConfig): Promise<Map<string, any>>;