Android DevUtils 快捷开发工具库

Java, Android 实现 MP4 裁剪功能

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

VideoClip - Github

Java 实现 MP4 裁剪功能

概述

主要用的是 mp4Parser (根据关键帧进行裁剪) - 自己进行封装以及内部代码处理等, 便于使用

MP4的分割和拼接介绍

mp4Parser - Github

具体实现与使用:

TrimVideoUtils 裁减视频工具类

使用方法:

package com.clip;

import java.io.File;
import java.io.IOException;

import com.clip.TrimVideoUtils.TrimFileCallBack;

public class ClipMain {

    public static void main(String[] args) {
        cutVideo();
    }

    public static void cutVideo() {
        TrimVideoUtils trimVideoUtils = TrimVideoUtils.getInstance();
        // 设置回调
        trimVideoUtils.setTrimCallBack(new TrimFileCallBack() {
            @Override // 裁剪失败回调
            public void trimError(int eType) {
                switch(eType){
                case TrimVideoUtils.FILE_NOT_EXISTS: // 文件不存在
                    System.out.println("视频文件不存在");
                    break;
                case TrimVideoUtils.TRIM_STOP: // 手动停止裁剪
                    System.out.println("停止裁剪");
                    break;
                case TrimVideoUtils.TRIM_FAIL:
                default: // 裁剪失败
                    System.out.println("裁剪失败");
                    break;
                }
            }
            @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());
            }
        });
        // ========
        // 需要裁剪的视频路径
        String videoPath = "E:\\clip\\Xperia.mp4";
        // 保存的路径
        String savePath = "E:\\clip\\save\\Xperia_" + System.currentTimeMillis() + "_cut.mp4";
        // ==
        final File file = new File(videoPath); // 视频文件地址
        final File trimFile = new File(savePath);// 裁剪文件保存地址
        final int startS = 1; // 开始时间(秒数 - 非毫秒)
        final int endS = 20; // 结束时间(秒数 - 非毫秒)
        // 进行裁剪
        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();

        // 停止裁剪
        // TrimVideoUtils.getInstance().stopTrim();
    }
}

注意事项

首先该裁减视频是以关键帧进行裁减,例如视频时长 15秒 然后选择裁减 10-14秒这个时间段,如果该视频关键帧 0.x秒一帧, 则裁减出来接近就是10-14秒这个区间段

但是有部分视频关键帧间隔比较大,就会导致虽然选择裁减10-14区间段,但是可能并不是从10秒开始,而是自动找距离10秒最近的关键帧秒数进行裁剪

上一篇下一篇

猜你喜欢

热点阅读