Android 视频裁剪 (含裁剪 View)

2019-07-29  本文已影响0人  afkT

AndroidVideoClip - Github

Android 视频裁剪 - (含裁剪 View)

具体代码

使用方法:

// -- am_video_seekbar.getStartTime() 获取的是自定义 View 选择的开始裁剪时间
// -- am_video_seekbar.getEndTime() 获取的是自定义 View 选择的结束裁剪时间
public void initListener(){
    // 点击视频裁剪
    am_cut_igview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 禁止点击
            am_cut_igview.setEnabled(false);
            // --
            TrimVideoUtils trimVideoUtils = TrimVideoUtils.getInstance();
            trimVideoUtils.setTrimCallBack(new TrimVideoUtils.TrimFileCallBack() {
                @Override
                public void trimError(int eType) {
                    Message msg = new Message();
                    msg.what = TrimVideoUtils.TRIM_FAIL;
                    switch(eType){
                        case TrimVideoUtils.FILE_NOT_EXISTS: // 文件不存在
                            msg.obj = "视频文件不存在";
                            break;
                        case TrimVideoUtils.TRIM_STOP: // 手动停止裁剪
                            msg.obj = "停止裁剪";
                            break;
                        case TrimVideoUtils.TRIM_FAIL:
                        default: // 裁剪失败
                            msg.obj = "裁剪失败";
                            break;
                    }
                    cutHandler.sendMessage(msg);
                }
                @Override
                public void trimCallback(boolean isNew, int startS, int endS, int vTotal, File file, File trimFile) {
                    /**
                     * 裁剪回调
                     * @param isNew 是否新剪辑
                     * @param starts 开始时间(秒)
                     * @param ends 结束时间(秒)
                     * @param vTime 视频长度
                     * @param file 需要裁剪的文件路径
                     * @param trimFile 裁剪后保存的文件路径
                     */
                    // ===========
                    System.out.println("isNew : " + isNew);
                    System.out.println("startS : " + startS);
                    System.out.println("endS : " + endS);
                    System.out.println("vTotal : " + vTotal);
                    System.out.println("file : " + file.getAbsolutePath());
                    System.out.println("trimFile : " + trimFile.getAbsolutePath());
                    // --
                    cutHandler.sendEmptyMessage(TrimVideoUtils.TRIM_SUCCESS);
                }
            });
            // 需要裁剪的视频路径
            String videoPath = PLAY_URL;
            // 保存的路径
            String savePath = ProUtils.getSDCartPath() + File.separator  + System.currentTimeMillis() + "_cut.mp4";
            // ==
            final File file = new File(videoPath); // 视频文件地址
            final File trimFile = new File(savePath);// 裁剪文件保存地址
            // 获取开始时间
            final int startS = (int) am_video_seekbar.getStartTime() / 1000;
            // 获取结束时间
            final int endS = (int) am_video_seekbar.getEndTime() / 1000;
            // 进行裁剪
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try { // 开始裁剪
                        TrimVideoUtils.getInstance().startTrim(true, startS, endS, file, trimFile);
                    } catch (Exception e) {
                        e.printStackTrace();
                        // 设置回调为null
                        TrimVideoUtils.getInstance().setTrimCallBack(null);
                    }
                }
            }).start();
            // --
            Toast.makeText(MainActivity.this, "开始裁剪 - 开始: " + startS  + "秒, 结束: " + endS + "秒", Toast.LENGTH_SHORT).show();
        }
    });
}

代码中,点击裁剪后,只是禁止按钮点击没有显示加载Dialog,自己根据项目需求搬运过去,以及计算关键帧的方法需要放在后台线程内进行计算,防止卡顿

// =========================================
// 计算关键帧可能会卡顿一下,最好是在后台运行
// =========================================

// 获取视频关键帧间隔 - 如果获取失败, 则默认最少需要裁剪 3 秒长度的视频
float videoFrame = (float) TrimVideoUtils.getInstance().reckonFrameTime(new File(videoUrl), 3000);
// 设置本地视频路径 - 默认裁剪模式, 则不绘制播放背景
am_video_seekbar.setVideoUri(true, PLAY_URL, videoFrame);
// --
Toast.makeText(MainActivity.this, "视频关键帧:" + videoFrame, Toast.LENGTH_SHORT).show();

注意事项

计算关键帧的作用 - 裁剪开始时间 - 结束时间,中间的空白模块就是 videoFrame,你可以限制最低裁剪多少秒,会自动计算视频总时间,以及 View 的宽度换算 X 轴对应的时间

上一篇下一篇

猜你喜欢

热点阅读