• java项目中使用ffmpeg剪辑部分视频


    在项目中,有个需求是分享视频链接地址到微信、qq或者朋友圈,只能试看两分钟,本想着通过h5界面就能控制实现效果,代码如下,但是前端终究不是安全的,其次监听事件,如果拉播放进度条,中途停顿多次,就会出现多次弹框,对用户体验终究不是好的,因此,后面想着后端截取原视频部分视频,然后让用户播放,只要监听用户播放结束,弹框显示即可。

    var audio = document.getElementById("chqrpzkgzjulberajk"); //获取视频元素id
    audio.loop = false;//视频不循环播放
    var time = 0;//初始化播放时间
    audio.addEventListener('timeupdate', timeupdate);//设置监听事件

    function timeupdate(){
    //因为当前的格式是带毫秒的float类型的如:12.231233,所以把他转成String了便于后面分割取秒
    var time = audio.currentTime+"";
    console.log('当前播放时长'+time);
    if(time > 60){
    if(audio.paused){
    alert("观看完整视频,请下载APP!");
    audio.pause();
    }
    }
    }
    查了很多资料,眼睛都要瞎了,但是没一个微博写的很详细,作为初学者基本上都不可能操作完成,经过我一个礼拜的努力,有两种实施方案。

    1.通过截取视频流的方式:读取流的时候只读取一部分,但是这样就会有个问题,视频时长还是原视频时长,其次有个重要的问题,有些视频截取之后播放不了,破坏了原本的视频流。

    2.通过ffmpeg工具进行截取,功能还是很强大,具体可以百度下。

    ffmpeg下载(也可以去官网上下载):
    windows:链接:https://pan.baidu.com/s/1EAQDkEUmh5WnaF9_qKJgcA  提取码:3v31 

    linux:链接:https://pan.baidu.com/s/16c7krsFOP29lj6wOMxL5mQ 提取码:x1y3 
     

    Windows 下使用代码:
    /**
    * 视频剪辑
    * @param file 源文件
    * @param outFilePath 输出文件路径
    * @return
    * @throws Exception
    */
    public static String getPartVideoForWindows(File file ,String outFilePath){
    String filePaths = PathUtil.getFilePath(outFilePath);//获取输出视频绝对地址
    String fileName = DateUtil.getRanddom() + ".mp4";//生成输出视频文件格式,也可以用源文件的格式
    String fileFinalPath = filePaths + fileName;//完整的输出视频绝对路径
    // 创建一个List集合来保存转换视频文件为flv格式的命令
    List<String> convert = new ArrayList<String>();
    convert.add(PathUtil.getFilePath("/tools/ffmpeg.exe")); // 添加转换工具路径
    convert.add("-ss");//起始时间
    convert.add("00:00:10.0");
    convert.add("-i"); // 添加参数"-i",该参数指定要转换的文件
    convert.add(file.getAbsolutePath()); // 添加要转换格式的视频文件的路径
    convert.add("-to");//结束时间
    convert.add("00:02:00");//
    convert.add("-c");//操作方式
    convert.add("copy");
    convert.add(fileFinalPath);
    convert.add("-y"); // 添加参数"-y",该参数指定将覆盖已存在的文件

    ProcessBuilder builder = new ProcessBuilder();
    try {
    builder.command(convert);
    builder.start();
    return outFilePath+fileName;
    } catch (Exception e) {
    System.out.println(e);
    return null ;
    }
    }
    linux 下使用代码:
    /**
    * 执行linux 系统的ffpemg
    * @param file 视频源文件
    * @param outFilePath 输出视频地址
    */
    public static String linuxCommend(File file ,String outFilePath) {
    String filePaths = PathUtil.getFilePath(outFilePath);//获取输出视频绝对地址
    String fileName = DateUtil.getRanddom() + ".mp4";//生成输出视频文件格式,也可以用源文件的格式
    String fileFinalPath = filePaths + fileName;//完整的输出视频绝对路径
    String command = "ffmpeg -ss 00:00:10.0 -i "+file.getAbsolutePath()+" -to 00:02:00 -c copy "+fileFinalPath+" -y";//剪辑命令
    try {
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(command);
    InputStream stderr = proc.getErrorStream();
    InputStreamReader isr = new InputStreamReader(stderr);
    BufferedReader br = new BufferedReader(isr);
    String line = null;
    while ((line = br.readLine()) != null){
    System.out.println(line);
    }
    int exitVal = proc.waitFor();
    System.out.println("Process exitValue: " + exitVal);
    return outFilePath+fileName;
    } catch (IOException e) {
    System.out.println(e.getMessage());
    } catch (InterruptedException e) {
    System.out.println(e.getMessage());
    }
    return null ;
    }
    但是linux 系统下,是使用不了ffmpeg.exe,必须要安装之后才能使用 ffmpeg 这个命令,文章如下

    linux 系统下安装ffmpeg

    使用ffmpeg进行简单的视频编辑命令

  • 相关阅读:
    Tomcat安装(安装版)
    Selenium自动化测试(一)之环境搭建
    Windows快速启动应用高效搜索文件工具-Listary
    Python3之jsonpath使用和json转换
    Python3操作SQLite数据库
    初识面向对象
    忘记虚拟机中Linux的登录密码解决办法
    win10自带虚拟机的使用(Hyper-v)
    nigx下配置tp5.1路由
    PHP无限极菜单
  • 原文地址:https://www.cnblogs.com/zxtceq/p/11493097.html
Copyright © 2020-2023  润新知