短视频 SDK Android(视频编辑)

视频编辑包括视频裁剪、时间特效(慢动作、倒放、重复)、滤镜特效(动感光波,暗黑幻影,灵魂出窍,画面分裂)、滤镜风格(唯美,粉嫩,蓝调等)、音乐混音、动态贴纸、静态贴纸、气泡字幕等功能。

相关产品
短视频 SDK 产品页,含版本规格、价格与购买入口。

二、相关类介绍

类名 功能
TXVideoInfoReader 媒体信息获取
TXVideoEditer 视频编辑

三、视频编辑基本使用流程

1. 设置视频路径。

2. 开始预览

3. 添加效果。

4. 监听生成事件。

5. 生成视频到指定文件

6. 资源释放。

四、视频信息获取

TXVideoInfoReader 的 getVideoFileInfo 方法可以获取指定视频文件的一些基本信息,相关接口如下:

/** * 获取视频信息 * @param videoPath 视频文件路径 * @return */public TXVideoEditConstants.TXVideoInfo getVideoFileInfo(String videoPath);

返回的 TXVideoInfo 定义如下:

public final static class TXVideoInfo { public Bitmap coverImage; // 视频首帧图片 public long duration; // 视频时长(ms) public long fileSize; // 视频大小(byte) public float fps; // 视频 fps public int bitrate; // 视频码率 (kbps) public int width; // 视频宽度 public int height; // 视频高度 public int audioSampleRate; // 音频码率 }

完整示例如下:

//sourcePath 为视频源路径String sourcePath = Environment.getExternalStorageDirectory() + File.separator + "temp.mp4";TXVideoEditConstants.TXVideoInfo info = TXVideoInfoReader.getInstance().getVideoFileInfo(sourcePath);

注意:该接口是读取视频文件有 I/O 操作,同步返回视频信息,调用者需要在子线程调用,避免阻塞 UI 线程。

五、缩略图获取

缩略图的接口主要用于生成视频编辑界面的预览缩略图,或获取视频封面等。

六、1. 按个数平分时间获取缩略图

调用接口如下:

/** * 获取缩略图列表 * @param count 缩略图张数 * @param width 缩略图宽度 * @param height 缩略图高度 * @param fast 缩略图是否关键帧的图片 * @param listener 缩略图的回调函数*/public void getThumbnail(int count, int width, int height, boolean fast, TXThumbnailListener listener)

参数 @param fast 可以使用两种模式:

·快速出图:输出的缩略图速度比较快,但是与视频对应不精准,传入参数 true。

·精准出图:输出的缩略图与视频时间点精准对应,但是在高分辨率上速度慢一些,传入参数 false。

完整示例如下:

mTXVideoEditer.getThumbnail(TCVideoEditerWrapper.mThumbnailCount, 100, 100, false, mThumbnailListener);private TXVideoEditer.TXThumbnailListener mThumbnailListener = new TXVideoEditer.TXThumbnailListener() { @Override public void onThumbnail(int index, long timeMs, final Bitmap bitmap) { Log.i(TAG, "onThumbnail: index = " + index + ",timeMs:" + timeMs); //将缩略图放入图片控件上 } };

七、2. 根据时间列表获取缩略图

List<Long> list = new ArrayList<>();list.add(10000L);list.add(12000L);list.add(13000L);list.add(14000L);list.add(15000L);mTXVideoEditer.getThumbnail(list, 100, 100, false, mThumbnailListener);

八、3. 视频预处理时获取缩略图。

如果你需要支持视频倒放,重复等事件特效,可能需要先对视频进行预处理,在预处理的过程中可以获取缩略图,不用再单独获取缩略图。

关于视频预处理参看该篇文档最后面。

九、编辑预览

视频编辑提供了 定点预览(将视频画面定格在某一时间点)与区间预览(播放某一时间段 A<=>B 内的视频片段)两种效果预览方式,使用时需要给 SDK 绑定一个 UIView 用于显示视频画面。

十、1. 设置预览播放的 Layout

public void initWithPreview(TXVideoEditConstants.TXPreviewParam param)public final static class TXPreviewParam { public FrameLayout videoView; // 视频预览View public int renderMode; // 填充模式}// 填充模式,尽可能充满屏幕不留黑边,所以可能会裁剪掉一部分画面public final static int PREVIEW_RENDER_MODE_FILL_SCREEN = 1;// 适应模式,尽可能保持画面完整,但当宽高比不合适时会有黑边出现public final static int PREVIEW_RENDER_MODE_FILL_EDGE = 2;

十一、2. 定点预览

经过预处理的视频可以精确预览到某一个时间点的视频画面。

public void previewAtTime(long timeMs);

十二、3. 区间预览

TXVideoEditer 的 startPlayFromTime 函数用于播放某一时间段 A<=>B 内的视频片段。

// 播放某一时间段的视频,从 startTime 到 endTime 的视频片段public void startPlayFromTime(long startTime, long endTime);

十三、4. 预览的暂停与恢复

// 暂停播放视频public void pausePlay();// 继续播放视频public void resumePlay();// 停止播放视频public void stopPlay();

十四、美颜滤镜

你可以给视频添加滤镜效果,例如美白、浪漫、清新等滤镜,demo 提供了16种滤镜选择,同时也可以设置自定义的滤镜。

设置滤镜的方法为(其中 Bitmap 为滤镜映射图,bmp 设置为 null,会清除滤镜效果):

void setFilter(Bitmap bmp)

添加滤镜之后需要设置滤镜强度 specialRatio 取值为0-9

void setSpecialRatio(float specialRatio)

还可以设置组合滤镜,即左右可以添加不同的滤镜。

·leftBitmap 为左侧滤镜、leftIntensity 为左侧滤镜程度值。

·rightBitmap 为右侧滤镜、rightIntensity 为右侧滤镜程度值。

·leftRatio 为左侧滤镜所占的比例,一般为0.0 – 1.0。

·当 leftBitmap 或 rightBitmap 为 null,则该侧清除滤镜效果。

void setFilter(Bitmap leftBitmap, float leftIntensity, Bitmap rightBitmap, float rightIntensity, float leftRatio)

十六、1. 设置全局水印

你可以为视频设置水印图片,并且可以指定图片的位置。

设置水印的方法为:

public void setWaterMark(Bitmap waterMark, TXVideoEditConstants.TXRect rect);

其中 waterMark 表示水印图片,rect 是相对于视频图像的归一化 frame,frame 的 x、y、width、height 的取值范围都为0 – 1。

Demo 示例:

TXVideoEditConstants.TXRect rect = new TXVideoEditConstants.TXRect();rect.x = 0.5f;rect.y = 0.5f;rect.width = 0.5f;mTXVideoEditer.setWaterMark(mWaterMarkLogo, rect);

十七、2. 设置片尾水印

你可以为视频设置片尾水印,并且可以指定片尾水印的位置。
设置片尾水印的方法为:

setTailWaterMark(Bitmap tailWaterMark, TXVideoEditConstants.TXRect txRect, int duration);

其中 tailWaterMark 表示片尾水印图片,txRect 是相对于视频图像的归一化 txRect,txRect 的 x、y、width 取值范围都为0 – 1,duration 为水印的持续时长,单位:秒。
Demo 实例:设置水印在片尾中间,持续3秒:

Bitmap tailWaterMarkBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tcloud_logo);TXVideoEditConstants.TXRect txRect = new TXVideoEditConstants.TXRect();txRect.x = (mTXVideoInfo.width – tailWaterMarkBitmap.getWidth()) / (2f * mTXVideoInfo.width);txRect.y = (mTXVideoInfo.height – tailWaterMarkBitmap.getHeight()) / (2f * mTXVideoInfo.height);txRect.width = tailWaterMarkBitmap.getWidth() / (float) mTXVideoInfo.width;mTXVideoEditer.setTailWaterMark(tailWaterMarkBitmap, txRect, 3);

十八、编辑添加 BGM

// 设置 BGM 路径,返回值为0表示设置成功; 其他表示失败,如:不支持的音频格式。public int setBGM(String path);// 设置 BGM 开始和结束时间,单位毫秒public void setBGMStartTime(long startTime, long endTime);// 设置背景音乐是否循环播放:true:循环播放,false:不循环播放public void setBGMLoop(boolean looping);// 设置 BGM 在视频添加的起始位置public void setBGMAtVideoTime(long videoStartTime);// 设置视频声音大小, volume 表示声音的大小, 取值范围0 – 1 , 0 表示静音, 1 表示原声大小。public void setVideoVolume(float volume);// 设置BGM声音大小,volume 表示声音的大小, 取值范围0 – 1 , 0 表示静音, 1 表示原声大小。public void setBGMVolume(float volume);

20、1. 视频压缩

视频压缩调用 generateVideo:

// …// 生成最终的视频文件public void generateVideo(int videoCompressed, String videoOutputPath)

参数 videoCompressed 在 TXVideoEditConstants 中可选常量。

VIDEO_COMPRESSED_360P ——压缩至360P分辨率(360*640)VIDEO_COMPRESSED_480P ——压缩至480P分辨率(640*480)VIDEO_COMPRESSED_540P ——压缩至540P分辨率 (960*540)VIDEO_COMPRESSED_720P ——压缩至720P分辨率 (1280*720)VIDEO_COMPRESSED_1080P ——压缩至1080P分辨率 (1920*1080)

如果源视频的分辨率小于设置的常量对应的分辨率,按照原视频的分辨率。

如果源视频的分辨率大于设置的常量对象的分辨率,进行视频压缩至相应分辨率。

21、2. 裁剪区域设置

在调用 generateVideo 压缩视频的同时可以指定裁剪区域,如果未指定,则压缩整个文件。指定裁剪区域调用 setCutFromTime 接口。

/** * 设置视频剪切范围 * * @param startTime 视频剪切的开始时间(ms) * @param endTime 视频剪切的结束时间(ms) */public void setCutFromTime(long startTime, long endTime)

22、3. 视频码率设置

支持自定义视频的码率,这里建议设置的范围600 – 12000kbps,注意码率不要太大或太小,码率太大,视频的体积会很大,码率太小,视频会模糊不清。如果没有调用这个接口,SDK 内部会根据压缩质量自动计算码率。

public void setVideoBitrate(int videoBitrate);

23、4. 视频帧率设置

调用 setVideoFrameRate 接口可以设置视频帧率

public void setVideoFrameRate(VideoFrameRateLevel videoFrameRateLevel)public enum VideoFrameRateLevel { VIDEO_FPS_ORIGIN(0), VIDEO_FPS_AUTO(-1), VIDEO_FPS_15(15), VIDEO_FPS_25(25), VIDEO_FPS_30(30), VIDEO_FPS_60(60);}

·VIDEO_FPS_ORIGIN 使用原始视频的帧率,未调用 setVideoFrameRate 接口时,默认是使用视频原始帧率。

·VIDEO_FPS_AUTO 根据用户生成视频的分辨率,码率,SDK 内部决策出一个合适的帧率。

·VIDEO_FPS_15,VIDEO_FPS_25,VIDEO_FPS_30,VIDEO_FPS_60指定帧率为15,25,30,60。

·无论用户传递的参数是什么,最终生成视频的帧率不会高于原始视频帧率。

·如果你设置的帧率过小,最终导致生成的视频帧率过小,可能会让视频看起来不是很流畅。

24、视频预处理

如果你需要支持一些时间特效(重复、倒放),以及在预览时可以快速精确的 seek 到每个时间点,可以在视频导入的时候进行预处理。

示例代码如下:

TXVideoEditer mTXVideoEditer = new TXVideoEditer(context);mTXVideoEditer.setVideoPath(path);// 设置回调监听预处理进度以及完成事件mTXVideoEditer.setVideoProcessListener(new TXVideoProcessListener() { @Override public void onProcessProgress(float v) {} @Override public void onProcessComplete(TXGenerateResult txGenerateResult) {}});// 预处理过程中生成缩略图(这样可以不用再单独再获取缩略图)TXVideoEditConstants.TXThumbnail thumbnail = new TXVideoEditConstants.TXThumbnail();thumbnail.count = 10;thumbnail.width = 100; // 输出缩略图宽thumbnail.height = 100; // 输出缩略图高mTXVideoEditer.setThumbnail(thumbnail);mTXVideoEditer.setThumbnailListener(mThumbnailListener);// 开始预处理mTXVideoEditer.processVideo();// 预处理完成之后做其他事情(预览,添加特效,生成最终视频等等)

25、资源释放

当你不再使用 mTXVideoEditer 对象时,一定要记得调用 release()释放它。

26、高级功能

·类抖音特效

·设置背景音乐

·贴纸字幕

·图片编辑

赞 (0)
上一篇 4天前
下一篇 4天前