Page History

Basic skills

Last edited by 王琳

七、基本功能

1.通用

2.录制

3.编辑

4.静态贴纸

5.动态贴纸

6.静态字幕

7.音频滤镜

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 机器人

返回顶部