七、基本功能
1.通用
1.1 音频控制
1.1.1 编辑合成音频控制**
编辑删除原始音频
/**
* 是否删除原始音频
* @param enable true 删除, false 不删除
*/
public void enableOriginAudio(boolean enable)
编辑原始音频音量
/**
* 设置原始音频的音量
* @param volume volume in 0~1.0f.
*/
public void setOriginAudioVolume(float volume)
编辑添加/删除背景音乐
/**
* 添加背景音乐
* @param path 背景音乐的路径, 为null时删除背景音乐
*/
public void changeBgmMusic(final String path)
编辑调整背景音乐的音量
/**
* 设置背景音乐的音量
* @param volume in 0~1.0f.
*/
public void setBgmMusicVolume(float volume)
1.1.2 录制音频控制
录制删除原始音频
/**
* Enable to use AudioDummyCapture to output silence audio data
* instead of mic data captured by AudioCapture or not.
* @param enable true to use AudioDummyCapture false to use AudioCapture
*/
public void setUseDummyAudioCapture(boolean enable)
录制添加背景音乐
参考流融合包中的设置背景音乐
背景音乐及原始音频音量控制
参考推流融合包音量控制
1.2 滤镜
同推流的滤镜设置
1.3 美颜
同推流的美颜设置
2.录制
2.1 断点拍摄
2.1.1开始拍摄
任何一段视频的拍摄开始都可以调用该接口
boolean startRecord(String recordUrl)
2.1.2停止当前视频拍摄
任何一段视频的拍摄停止都可以调用该接口
void stopRecord()
2.1.3停止断点拍摄
当完成所有拍摄后,调用该接口停止断点拍摄,并触发断点拍摄的视频合成 接口为异步,所有断点的视频合成后,会通过MegerFilesFinishedListener通知合成结束
/**
* 停止断点拍摄
* @param outputFile 最终生成的文件路径
* @param listener 文件合成结束回调
*/
void stopRecord(final String outputFile, final MegerFilesFinishedListener listener)
2.1.4删除某一段视频
断点拍摄过程中,可以调用该接口删除任何一段拍摄的视频,Demo中展示了删除上一段视频的的效果
/**
* 删除断点拍摄的某一段视频
* @param file 需要删除的文件路径
* @return
*/
boolean deleteRecordFile(String file)
2.1.5获取最后一段视频
/**
* 返回当前拍摄的最后一段视频路径
* @return 最后一段视频路径
*/
String getLastRecordedFiles()
2.1.6获取当前拍摄的视频个数
/**
* 返回当前拍摄的所有视频个数
* @return 视频个数
*/
int getRecordedFilesCount()
3.编辑
3.1 设置裁剪区间,并循环预览
/**
* 调用此接口时, 需注意:
* 1. startTime和endTime中必有一值大于0
* 2. 当endTime大于0时, 其值必须大于startTime
* 当以上任一条件不满足时设置无效
* @param startTime 起始播放时间点, 单位为毫秒(MS)
* @param endTime 结束播放时间点, 单位为毫秒(MS)
*/
public void setEditPreviewRanges(long startTime, long endTime)
3.2 获取视频的缩略图
/**
* @brief 获取视频的缩略图,可设置缩略图的输出宽高以及所需缩略图的具体时间点
*
* @param url 视频地址
* @param seekTime 单位: 毫秒(MS)
* 该值为0,则以视频首帧为缩略图
* 若大于0,则会取离该时间点最近的一个关键帧为缩略图
* 该值大于视频时长时,以视频首帧为缩略图
* @param width 输出缩略图的宽,0时按照原始视频分辨率输出
* @param height 输出缩略图的高,0时按照原始视频分辨率输出
*
* @return 缩略图
*/
public Bitmap getVideoThumbnailAtTime(String url, long seekTime, int width, int height)
3.3 另提供以下几个方法获取辅助信息
3.3.1seek到指定的位置播放预览
/**
* seek到指定的位置播放预览
* @param seek to seek的预览位置(MS)
*/
public void seekEditPreview(long seekto)
3.3.2获取当前preview的位置
/**
* 获取当前preview的位置
* @return 当前preview的位置(MS)
*/
public long getCurrentPosition()
3.3.3获取原始的文件时长
/**
* 获取原始的文件时长
* @return 原始文件时长(MS)
*/
public long getEditDuration(o)
4.静态贴纸
短视频SDK提供静态贴纸功能,支持在编辑部分添加贴纸,并最终合成到视频中 贴纸提供旋转、缩放、无限叠加等功能。
4.1关键类说明
4.1.1 CNStickerView贴纸预览控件,提供贴纸的预览、添加、删除功能(SDK内部提供)
4.1.2 StickerHelpBoxInfo贴纸辅助区域的画笔,用于提供贴纸辅助区域的删除、旋转按钮及辅助区域绘制Paint
4.1.3 StickerAdapter贴图列表适配器(Demo示例)
4.2贴纸功能说明
4.2.1添加预览贴纸控件
在编辑预览的xml中添加CNStickerView控件来进行贴纸的预览,并需要将该对象设置给SDK内部
//xml中添加控件
<com.cnlive.libs.shortvideo.view.CNStickerView
android:id="@+id/sticker_panel"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:visibility="gone" />
//获取控件实例
mCNStickerView = (CNStickerView) findViewById(R.id.sticker_panel);
//设置给SDK内部
mEditKit.addStickerView(mCNStickerView);
4.2.2 添加贴纸
调用CNStickerView的addSticker(String path, StickerHelpBoxInfo helpInfo)接口用于添加贴纸,示例如下:
//辅助区域信息
if(mStickerHelpBoxInfo == null) {
mStickerHelpBoxInfo = new StickerHelpBoxInfo();
mStickerHelpBoxInfo.deleteBit = mStickerDeleteBitmap; //删除按钮
mStickerHelpBoxInfo.rotateBit = mStickerRotateBitmap; //旋转按钮
//辅助区域画笔
Paint helpBoxPaint = new Paint();
helpBoxPaint.setColor(Color.BLACK);
helpBoxPaint.setStyle(Paint.Style.STROKE);
helpBoxPaint.setAntiAlias(true); //抗锯齿
helpBoxPaint.setStrokeWidth(4); //宽度
mStickerHelpBoxInfo.helpBoxPaint = helpBoxPaint;
}
mKSYStickerView.addSticker(getImageFromAssetsFile(path), mStickerHelpBoxInfo);
4.2.3 删除贴纸
删除某一张贴纸,只需要按下删除按钮即可,SDK内部会进行删除,不需要额外调用接口
删除所有贴纸,可以调用CNStickerView的removeStickers()接口来完成
5.动态贴纸
使用FaceUnity集成动态贴纸
5.1初始化ImageFaceunityFilter
/**
* @param context
* @param streamer
* @param FACEUNITY_INIT_FILE
* @param FACEUNITY_BEAUTY_FILE
* @param bytes
* @param props 小道具
* @param gestures 手势
* @param beautys 滤镜
*/
imageFaceunityFilter = new ImageFaceunityFilter(Context var1, CNRecordKit var2, String var3, String var4, byte[] var5, String[] var6, String[] var7, String[] var8)
5.2 Demo中示例代码:
private void initFaceunity() {
if (mImgFaceunityFilter == null) {
//add faceunity filter
mImgFaceunityFilter = new ImgFaceunityFilter(this, recordKit, FaceUnityUtil.FACEUNITY_INIT_FILE, FaceUnityUtil.FACEUNITY_BEAUTY_FILE, authpack.A(),
FaceUnityUtil.PROPS, FaceUnityUtil.GESTURES, FaceUnityUtil.BEAUTYS);
recordKit.getImgTexFilterMgt().setExtraFilter(mImgFaceunityFilter);
}
updateFaceunitParams();
}
6.静态字幕
短视频SDK提供字幕功能,支持在编辑部分添加字幕,并最终生合成到视频中 字幕提供旋转、缩放、移动位置等功能。
6.1关键类说明
6.1.1 CNTextView字幕预览控件,提供字幕的预览、添加、删除功能 (SDK内部提供)
6.1.2 CNStickerHelpBoxInfo字幕辅助区域的画笔,用于提供字幕辅助区域的删除、旋转按钮及辅助区域绘制Paint (SDK内部提供)
6.1.3 StickerAdapter字幕背景列表适配器 (Demo示例)
6.1.4 ColorPicker 字幕颜色选择器(Demo示例)
6.2字幕功能说明
6.2.1 添加预览字幕view
在编辑预览的xml中添加KSYStickerView控件来进行贴纸的预览,并需要将该对象设置给SDK内部。
//xml中添加控件
<com.cnlive.libs.shortvideo.view.CNTextView
android:id="@+id/text_panel"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:visibility="gone" />
//获取控件实例
mCaptionView = (CNTextView) findViewById(R.id.text_panel);
6.2.2 初始化相关配置
在添加字幕前需要调用initView进行初始化
CNTextView.CNDrawTextParams textParams = new CNTextView.CNDrawTextParams();
textParams.textPaint = new TextPaint();
textParams.textPaint.setTextSize(mTextView.getTextSize()); //字体大小
textParams.textPaint.setColor(Color.WHITE); //字体颜色
textParams.textPaint.setTextAlign(Paint.Align.LEFT); //文字对齐方式
textParams.textPaint.setStyle(Paint.Style.FILL); //文字样式
textParams.textPaint.setAntiAlias(true); //抗锯齿
textParams.autoNewLine = false; //是否自动换行
textParams.bitmap = null; //字幕背景图
//初始化,mTextInput为字幕文字的输入框控件
mCaptionView.initView(textParams, mStickerHelpBoxInfo,mTextInput);
//点击字幕区域回调
mCaptionView.setTextRectSelected(mTextRectSelected);
6.2.3 字幕view设置给SDK
mEditKit.addTextStickerView(mCaptionView);
6.2.4 添加字幕
调用setText即可修改字幕内容
private TextWatcher mTextInputChangedListener = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
String text = editable.toString().trim();
//输入字幕内容
mCaptionView.setText(text);
}
};
6.2.5 删除字幕
若输入的字幕内容为空串则不会有相应的字幕生成。
6.2.6 修改字幕颜色
调用接口setTextColor(int)即可修改字幕颜色
private void changeTextColor(int newColor) {
mTextColorSelect.setBackgroundColor(newColor);
mTextView.setTextColor(newColor);
}
6.2.7 更新字幕背景信息
调用接口updateTextParams即可更新字幕配置信息
CNTextView.DrawTextParams textParams = new CNTextView.DrawTextParams();
textParams.textPaint = null; //使用默认或者之前设置的画笔
textParams.autoNewLine = false;
if(path.contains("5")) {
textParams.text_left_padding = 105; //设置字幕可写区域距离背景左边的距离
textParams.text_right_padding = 104; //设置字幕可写区域距离背景右边的距离
textParams.text_top_padding = 89; //设置字幕可写区域距离背景上边的距离
textParams.text_bottom_padding = 66; //设置字幕可写区域距离背景下边的距离
}
textParams.bitmap = getImageFromAssetsFile(path);
mTextView.updateTextParams(textParams);
7.音频滤镜
7.1音频处理说明
7.1.1内置音频滤镜
支持变声和升降调两种滤镜:
I.变声,将主播声音变为搞怪的特效处理,能够增强互动时的趣味性;金山云SDK暂支持大叔、萝莉、庄重、机器人四种效果
II.升降调,主播唱歌时伴奏(背景音乐)的特效处理,即从低沉到高亢的一个过程,更适用于较专业的唱歌直播;金山云SDK支持-3至3从低沉到高亢的7个等级的调节,0为原始音效,具体等级可根据客户业务需求做自定义处理
7.1.2 混响设置方法
a.创建CNAudioReverbFilter实例
b.调用setFilter将实例设置给SDK
c.混响预设效果参考表格7-1
参考代码
CNAudioReverbFilter reverbFilter = new CNAudioReverbFilter();
reverbFilter.setReverbLevel(ICNAudioReverbFilter.AUDIO_REVERB_LEVEL_1);
mRecordKit.getAudioFilterMgt().setFilter(reverbFilter);
7.1.3 变声设置方法
a.创建CNAudioEffectFilter实例
b.调用setFilter将实例设置给SDK
c.变声支持的音效类型参考表格7-2
参考代码:
CNAudioEffectFilter audioEffect = new CNAudioEffectFilter(AUDIO_EFFECT_TYPE_FEMALE);
mRecordKit.getAudioFilterMgt().setFilter(audioEffect);
7.1.4 升降调音效设置方法
a.创建CNAudioEffectFilter实例,类型设置为AUDIO_EFFECT_TYPE_PITCH。
b.设置升降调 调用setPitchLevel接口设置升级调的等级,目前支持的等级有:
/*
pitch level from -3 to 3
*/
public static int AUDIO_PITCH_LEVEL_1 = -3;
public static int AUDIO_PITCH_LEVEL_2 = -2;
public static int AUDIO_PITCH_LEVEL_3 = -1;
public static int AUDIO_PITCH_LEVEL_4 = 0;
public static int AUDIO_PITCH_LEVEL_5 = 1;
public static int AUDIO_PITCH_LEVEL_6 = 2;
public static int AUDIO_PITCH_LEVEL_7 = 3;
c.调用CNAudioFilterMgt的接口setFilter将实例设置给SDK 参考代码
CNAudioEffectFilter audioEffect
= new CNAudioEffectFilter(ICNAudioEffectFilter.AUDIO_EFFECT_TYPE_PITCH);
audioEffect.setPitchLevel(ICNAudioEffectFilter.AUDIO_PITCH_LEVEL_3);
mRecordKit.getBGMAudioFilterMgt().setFilter(audioEffect);
音频处理:
7-1混响预设效果: 返回
| 常量名 | 说明 |
|---|---|
| AUDIO_REVERB_LEVEL_1 | 录音棚 |
| AUDIO_REVERB_LEVEL_2 | KTV |
| AUDIO_REVERB_LEVEL_3 | 小舞台 |
| AUDIO_REVERB_LEVEL_4 | 演唱会 |
7-2声音类型 返回
| 常量名 | 说明 |
|---|---|
| AUDIO_EFFECT_TYPE_FEMALE | 萝莉 |
| AUDIO_EFFECT_TYPE_MALE | 大叔 |
| AUDIO_EFFECT_TYPE_HEROIC | 庄严 |
| AUDIO_EFFECT_TYPE_ROBOT | 机器人 |