zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

开源短视频方案Android

Android开源 视频 方案
2023-09-27 14:27:27 时间

trinity 是一个开源的拍摄和短视频处理工具,用 kotlin 和 c++编写,实现了大部分短视频编辑软件热门功能

https://github.com/wlanjie/trinity  ( 不支持美颜 )

开发环境  NDK R20 / Kotlin 1.3.41
开源库使用  fdk-aac / ffmpeg 3.4 / libx264 / xlogger / mnnkit
特效调试
项目中使用XCODE调试特效效果,使用前需要安装GLFW
brew install glfw
然后使用XCODE打开library/src/main/cpp/opengl.xcodeproj即可
切换效果调试代码
image_process.OnAction("param/blurScreen", 0);
自动化测试
自动化测试使用 UIAUTOMATOR2具体使用请参考文档
使用方式
cd trinity
python trinity.py
然后使用
adb devices
在终端输入设备名即可

使用(注意 SDK中没有权限判断)
添加依赖
dependencies { implementation 'com.github.wla0jie:trinity:0.2.8}
权限要求
<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" />


录制
配置参数
val preview = findViewById<TrinityPreviewView>(R.id.preview)
创建录制接口实例
mRecord = TrinityRecord(preview)
销毁录制接口实例
mRecord.release()

回调设置
设置视频渲染回调
mRecord.setOnRenderListener(this)
设置录制进度回调
mRecord.setOnRecordingListener(this)
设置相机回调
mRecord.setCameraCallback(this)

开启预览
开始预览
mRecord.startPreview()
结束预览
mRecord.stopPreview()

设置预览类型
// 设置显示类型
// 包含裁剪显示, 原比例上下留黑显示
mRecord.setFrame(mFrame)

录制控制 /管理
切换摄像头
mRecord.switchCamera()

获取当前摄像头
// 返回当前摄像头 id
val facing = mRecord.getCameraFacing()
开关闪光灯
mRecord.flash(mFlash)

设置 zoom
// 设置焦距缩放, 0-100 100 为最大缩放
mRecord.setZoom(0)

设置曝光度
// 设置相机曝光度, 100 为最大曝光
mRecord.setExposureCompensation(0)

手动对焦
// 设置手动对焦, 参数为 x 和 y
mRecord.focus(mPointF)

设置录制视频的角度
/**
* @param rotation 旋转角度包含 0 90 180 270
*/
mRecord.setRecordRotation(0)

设置静音录制
mRecord.setMute(false)

倍速录制
/**
* @param speed 速度包含 0.25 0.5 1.0 2.0 4.0 倍速
*/
mRecord.setSpeed(mSpeed)

开始录制
开始录制一段视频
/**
* 开始录制一段视频
* @param path 录制的视频保存的地址
* @param width 录制视频的宽, SDK 中会做 16 倍整数的运算, 可能最终输出视频的宽和设置进去的不一致
* @param height 录制视频的高, SDK 中会做 16 倍整数的运算, 可能最终输出视频的宽和设置进去的不一致
* @param videoBitRate 视频输出的码率, 如果设置的是 2000, 则为 2M, 最终输出的和设置的可能有差别
* @param frameRate 视频输出的帧率
* @param useHardWareEncode 是否使用硬编码, 如果设置为 true, 而硬编码不支持,则自动切换到软编码
* @param audioSampleRate 音频的采样率
* @param audioChannel 音频的声道数
* @param audioBitRate 音频的码率
* @param duration 需要录制多少时间
* @return Int ErrorCode.SUCCESS 为成功,其它为失败
* @throws InitRecorderFailException
*/
mRecord.startRecording("/sdcard/a.mp4", 720,1280,2000, // 2M 码率 30, false, 44100, 1, // 单声道 128, // 128K 码率  Int.MAX_VALUE)

结束录制
mRecord.stopRecording()

视频编辑
初始化
创建编辑器实例
mVideoEditor = TrinityCore.createEditor(this)

设置预览画面
val surfaceView = findViewById<SurfaceView>(R.id.surface_view)
mVideoEditor.setSurfaceView(surfaceView)

导入视频
添加一个片段
val clip = MediaClip(file.absolutePath)
mVideoEditor.insertClip(clip)

根据下标添加片段
val clip = MediaClip(file.absolutePath)
mVideoEditor.insertClip(0, clip)

删除一个片段
/**
* 根据下标删除一个片段
*/
mVideoEditor.removeClip(index)

获取片段的数量
val count = mVideoEditor.getClipsCount()

根据下标获取一个片段
/**
* 如果片段不存在, 返回一个 null
*/
val clip = mVideoEditor.getClip(index)

根据下标替换一个片段
mVideoEditor.replaceClip(index, clip)

获取所有片段
/**
* 返回所有片段的集合
*/
val clips = mVideoEditor.getVideoClips()

获取所有片段的时间总长
val duration = mVideoEditor.getVideoDuration()

获取当前播放片段的进度
val current = mVideoEditor.getCurrentPosition()

获取指定片段的开始和结束时间
val timeRange = mVideoEditor.getClipTimeRange(index)

根据时间查找片段的下标
val index = mVideoEditor.getClipIndex(time)

背景音乐
添加背景音乐
/**
* @param config 背景音乐 json 内容
* 具体 json 内容如下:
* {
*    "path": "/sdcard/trinity.mp3",
*    "startTime": 0,
*    "endTime": 2000
* }

* json 参数解释:
* path: 音乐的本地地址
* startTime: 这个音乐的开始时间
* endTime: 这个音乐的结束时间 2000 代表这个音乐只播放 2 秒钟
*/
val actionId = mVideoEditor.addMusic(config)

更新背景音乐
/**
* @param config 背景音乐 json 内容
* 具体 json 内容如下:
* {
*    "path": "/sdcard/trinity.mp3",
*    "startTime": 2000,
*    "endTime": 4000
* }
* json 参数解释:
* path: 音乐的本地地址
* startTime: 这个音乐的开始时间
* endTime: 这个音乐的结束时间 4000 代表这个音乐从开始时间到结束时间播放 2 秒钟
*/
val actionId = mVideoEditor.addMusic(config)

删除背景音乐
/**
* 删除背景音乐
* @param actionId 必须为添加背景音乐时返回的 actionId
*/
mVideoEditor.deleteMusic(actionId)

添加特效
添加普通滤镜
/**
* 添加滤镜
* 如: content.json 的绝对路径为 /sdcard/Android/com.trinity.sample/cache/filters/config.json
* 传入的路径只需要 /sdcard/Android/com.trinity.sample/cache/filters 即可
* 如果当前路径不包含 config.json 则添加失败
* 具体 json 内容如下:
* {
*  "type": 0,
*  "intensity": 1.0,
*  "lut": "lut_124/lut_124.png"
* }
*
* json 参数解释:
* type: 保留字段, 目前暂无作用
* intensity: 滤镜透明度, 0.0 时和摄像头采集的无差别
* lut: 滤镜颜色表的地址, 必须为本地地址, 而且为相对路径
*      sdk 内部会进行路径拼接
* @param configPath 滤镜 config.json 的父目录
* @return 返回当前滤镜的唯一 id
*/
val actionId = mVideoEditor.addFilter(config)

更新滤镜
/**
* 更新滤镜
* @param configPath config.json 的路径, 目前对称 addFilter 说明
* @param startTime 滤镜的开始时间
* @param endTime 滤镜的结束时间
* @param actionId 需要更新哪个滤镜, 必须为 addFilter 返回的 actionId
*/
mVideoEditor.updateFilter(config, 0, 2000, actionId)

删除滤镜
/**
 * 删除滤镜
* @param actionId 需要删除哪个滤镜, 必须为 addFilter 时返回的 actionId
*/
mVideoEditor.deleteFilter(actionId) 

添加抖音特效
/**
* 添加特效
* 如: content.json 的绝对路径为 /sdcard/Android/com.trinity.sample/cache/effects/config.json
* 传入的路径只需要 /sdcard/Android/com.trinity.sample/cache/effects 即可
* 如果当前路径不包含 config.json 则添加失败
* @param configPath 滤镜 config.json 的父目录
* @return 返回当前特效的唯一 id
*/
val actionId = mVideoEditor.addAction(configPath)

更新抖音特效
/**
* 更新指定特效
* @param startTime 特效的开始时间
* @param endTime 特效的结束时间
* @param actionId 需要更新哪个特效, 必须为 addAction 返回的 actionId
*/
mVideoEditor.updateAction(0, 2000, actionId)

删除抖音特效
/**
* 删除一个特效
* @param actionId 需要删除哪个特效, 必须为 addAction 返回的 actionId
*/
mVideoEditor.deleteAction(actionId)

开始预览
播放
/**

* @param repeat 是否循环播放

*/

mVideoEditor.play(repeat)

暂停

mVideoEditor.pause()

继续播放

mVideoEditor.resume()

停止播放

mVideoEditor.stop()

释放资源

mVideoEditor.destroy()

导出视频

创建导出实例

val export = TrinityCore.createExport(this)

开始导出

/**

  * 开始导出

  * @param info 导出实体类

  * @param l 导出回调 包含成功 失败 和进度回调

  * @return Int ErrorCode.SUCCESS 为成功,其它为失败

  */

// 创建实体类, 必须传入视频输出地址 

val exportVideoInfo = VideoExportInfo("/sdcard/export.mp4")

// 使用硬解码

exportVideoInfo.mediaCodecDecode = true

// 使用硬编码

exportVideoInfo.mediaCodecEncode = true 

// 视频宽

exportVideoInfo.width = 544

// 视频高

exportVideoInfo.height = 960

// 帧率

exportVideoInfo.frameRate = 25

// 视频码率 2M

exportVideoInfo.videoBitRate = 2000

// 采样率

exportVideoInfo.sampleRate = 44100

// 声道数

exportVideoInfo.channelCount = 1

// 音频码率 128K

exportVideoInfo.audioBitRate = 128

export.export(exportVideoInfo, this)

取消

export.cancel()

释放

export.release()



作者:kly27
链接:https://www.jianshu.com/p/606154b7a2e7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。