开源短视频方案Android

作者: kly27 | 来源:发表于2020-05-30 10:10 被阅读0次


    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()


    转载 *** https://v2ex.com/t/673557#reply0

    相关文章

      网友评论

        本文标题:开源短视频方案Android

        本文链接:https://www.haomeiwen.com/subject/kskczhtx.html