返回顶部
首页 > 资讯 > 精选 >如何在JAVA中使用ffmepg处理视频
  • 910
分享到

如何在JAVA中使用ffmepg处理视频

2023-06-15 02:06:54 910人浏览 独家记忆
摘要

如何在JAVA中使用ffmepg处理视频?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。FFmepg安装路径:然后在使用的类中生命一个全局变量就好 pr

如何在JAVA中使用ffmepg处理视频?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

FFmepg安装

路径:
然后在使用的类中生命一个全局变量就好

 private static String FFmpegPath  = "C:\\hk\\ffmpeg\\bin\\ffmpeg.exe";  //ffmepg的绝对路径

视频压缩

注意:此压缩视频涉及转码,对cpu的占用比较大(能不压缩尽量不压缩)

    public static void toCompressFile(String convertFile,String targetFile) throws ioException {        List<String> command = new ArrayList<String>();                command.add(ffmpegPath);        command.add("-i");        command.add(convertFile);        command.add("-r");        command.add("15");        command.add("-b:v");        command.add("600k");        command.add("-s");        command.add("1280x720");        command.add(targetFile);        ProcessBuilder builder = new ProcessBuilder(command);        Process process = null;        try {            process = builder.start();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        // 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理        InputStream errorStream = process.getErrorStream();        InputStreamReader inputStreamReader = new InputStreamReader(errorStream);        BufferedReader br = new BufferedReader(inputStreamReader);        String line = "";        while ((line = br.readLine()) != null) {        }        if (br != null) {            br.close();        }        if (inputStreamReader != null) {            inputStreamReader.close();        }        if (errorStream != null) {            errorStream.close();        }        logger.info("-------------------压缩完成---转存文件--"+targetFile+"-------------");    }

获取视频合并

    public static String mergeVideo(List<String> list, String outputDir, String outputFile) {        try {            String fORMat1 = "%s -i %s -c copy -bsf:v h364_mp4toannexb -f mpegts %s";            List<String> commandList = new ArrayList<>(6);            List<String> inputList = new ArrayList<>(6);            for (int i = 0; i < list.size(); i++) {                String input = String.format("input%d.ts", i + 1);                String command = String.format(format1, ffmpegPath, list.get(i), outputDir + input);                commandList.add(command);                inputList.add(input);            }            String command = getCommand(outputDir,outputFile, inputList);            commandList.add(command);            Boolean falg = Boolean.FALSE;            for (int i = 0; i < commandList.size(); i++) {                if (execCommand(commandList.get(i)) > 0) falg = true;            }            if (falg) {                for (int i = 0; i < inputList.size(); i++) {                    if (i != commandList.size() - 1) {                        File file = new File(outputDir + inputList.get(i));                        file.delete();                    }                }//                //删除压缩的文件//                for (String s:list//                     ) {//                    new File(s).delete();//                }                return outputFile;            } else {                return "fail";            }        } catch (Exception e) {            e.printStackTrace();            logger.error("-----合并失败!!!!!!" + outputFile);            return "fail";        }    }    private static Integer execCommand(String command) {        logger.info("execCommand.exec command={}",command);        try {            Process process = Runtime.getRuntime().exec(command);            //获取进程的标准输入流            final InputStream is1 = process.getInputStream();            //获取进城的错误流            final InputStream is2 = process.getErrorStream();            //启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流            readInputStream(is1);            readInputStream(is2);            process.waitFor();            process.destroy();            logger.info("-----操作成功" + command + " " + sdf.format(new Date()));            return 1;        } catch (Exception e) {            e.printStackTrace();            System.out.println("-----操作失败" + command);            return -1;        }    }    private static void readInputStream(InputStream inputStream) {        new Thread(() -> {            BufferedReader br1 = new BufferedReader(new InputStreamReader(inputStream));            try {                String line1;                while ((line1 = br1.readLine()) != null) {                    if (line1 != null) {                    }                }            } catch (IOException e) {                e.printStackTrace();            } finally {                try {                    inputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();    }

视频分片(分割)

    public static List<Map<String,Object>>  splitVideoFile(String fileName, String outputPath, float videoTime, int periodTime,  boolean merge) {        final String TAG = "----------------------------";        // 在outputPath路径下根据系统时间创建目录        File file = createFileBySysTime(outputPath);        if (file == null) {            System.out.println("分割视频失败,创建目录失败");            return null;        }        outputPath = file.getPath() + File.separator; // 更新视频输出目录        // 计算视频分割的个数        int count;// 分割为几段        float remain = 0; // 不足一次剪辑的剩余时间        if (merge) {            count = (int) (videoTime / periodTime);            remain = videoTime % periodTime; // 不足一次剪辑的剩余时间        } else {            count = (int) (videoTime / periodTime) + 1;        }        System.out.println("将视频分割为" + count + "段,每段约" + periodTime + "分钟");        String indexName; // 第 i 个视频,打印日志用        final String FFMPEG = ffmpegPath;        String startTime; // 每段视频的开始时间        String periodVideoName; // 每段视频的名字,名字规则:视频i_时间段xx_yy        float duration; // 每次分割的时长        String command;// 执行的命令        // 得到视频后缀 如.mp4        String videoSuffix = fileName.substring(fileName.lastIndexOf("."));//得到点后面的后缀,包括点        Runtime runtime = Runtime.getRuntime(); // 执行命令者        List<Map<String,Object>> list =new ArrayList<>();        // 将视频分割为count段        for (int i = 0; i < count; i++) {            Map<String,Object> map =new HashMap<>();            indexName = "第" + (i+1) + "个视频";            // 决定是否将整个视频结尾部分不足一次的时间,合并到最后一次分割的视频中            if (merge) {                if (i == count - 1) {                    duration = periodTime * 60 + remain * 60;// 将整个视频不足一次剪辑的时间,拼接在最后一次剪裁中                    if(periodTime * i /60 >= 1){                        startTime = "0"+periodTime * i /60+ ":00:00";                    }else{                        startTime = periodTime * i + ":00";                    }                    periodVideoName = "video" + (i+1) + "_" + periodTime * i + "_end" + videoSuffix;                } else {                    duration = periodTime * 60;                    if(periodTime * i /60 >= 1){                        startTime = "0"+periodTime * i /60+ ":00:00";                    }else{                        startTime = periodTime * i + ":00";                    }                    periodVideoName = "video" +(i+1) + "_" + periodTime * i + "_" + periodTime * (i + 1) + videoSuffix;                }            } else {                duration = periodTime * 60;                if(periodTime * i /60 >= 1){                    startTime = "0"+periodTime * i /60+ ":00:00";                }else{                    startTime = periodTime * i + ":00";                }                periodVideoName = "video" + (i+1) + "_" + periodTime * i + "_" + periodTime * (i + 1) + videoSuffix;            }            // 执行分割命令            try {                // 创建命令                command = FFMPEG + " -ss " + startTime +" -accurate_seek "+ " -i " + fileName + " -c copy -t " + duration + " " + outputPath + periodVideoName;                System.out.println(TAG);                System.out.println(indexName);                System.out.println("执行命令:" + command);                runtime.exec(command);                System.out.println(indexName + "分割成功");                map.put("videoPath",(outputPath + periodVideoName).replace("\\","/"));                map.put("count",i);                list.add(map);            } catch (Exception e) {                e.printStackTrace();                System.out.println(indexName + "分割失败!!!!!!");            }        }        //删除原来的大视频        new File(fileName).delete();        return list;    }    public static File createFileBySysTime(String path) {        // 1. 读取系统时间        Calendar calendar = Calendar.getInstance();        Date time = calendar.getTime();        // 2. 格式化系统时间        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");        String fileName = format.format(time); //获取系统当前时间并将其转换为string类型,fileName即文件名        // 3. 创建文件夹        String newPath = path + fileName;        File file = new File(newPath);        //如果文件目录不存在则创建目录        if (!file.exists()) {            if (!file.mkdir()) {                System.out.println("当前路径不存在,创建失败");                return null;            }        }        System.out.println("创建成功" + newPath);        return file;    }

获取视频的时长

    public static long getVideoDuration(File video) {        long duration = 0L;        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);        try {            ff.start();            duration = ff.getLengthInTime() / (1000 * 1000 * 60);            ff.stop();        } catch (FrameGrabber.Exception e) {            e.printStackTrace();        }        return duration;    }

视频剪切

     public static String videoClip(String videoInputPath,String startTime,String endTime,String devIp) throws IOException {        SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");        SimpleDateFormat dtf=new SimpleDateFormat("yyyyMMddHHmmss");        //判断转码文件是否存在        if(!new File(videoInputPath).exists()){            System.out.println("需要处理的视频不存在");            return null;        }        StringBuffer videoOutPath = new StringBuffer();        videoOutPath.append("C:/video/playBack/"+devIp+"/"+sdf1.format(new Date())+"/clip/");        File file = new File(videoOutPath.toString());        if (!file.exists()){            file.mkdirs();        }        videoOutPath.append(dtf.format(new Date())+".mp4");        List<String> command = new ArrayList<String>();        command.add(ffmpegPath);        command.add("-ss");        command.add(startTime);        command.add("-t");        command.add(endTime);        command.add("-i");        command.add(videoInputPath);        command.add("-c");        command.add("copy");        command.add(videoOutPath.toString());        command.add("-y");        ProcessBuilder builder = new ProcessBuilder(command);        Process process = null;        try {            process = builder.start();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        InputStream errorStream = process.getErrorStream();        InputStreamReader inputStreamReader = new InputStreamReader(errorStream);        BufferedReader br = new BufferedReader(inputStreamReader);        String line = "";        while ((line = br.readLine()) != null) {        }        if (br != null) {            br.close();        }        if (inputStreamReader != null) {            inputStreamReader.close();        }        if (errorStream != null) {            errorStream.close();        }        return videoOutPath.toString();    }

视频转GIF(MP4)

    public static String mp4ToGif(String inputVideoPath,String createGif) {        String name = UUID.randomUUID().toString().replaceAll("-", "");        String paletteFile = createGif +name + ".png";        String gifFile = createGif+name + ".gif";        boolean isComplete = false;        //操作ffmpeg生成gif图片        for (int i = 0; i < 5; i++) {            try {                //生成调色板                Process p = new ProcessBuilder()                        .command(ffmpegPath,                                "-v", "warning",                                "-ss", "2",                                "-t", "10",                                "-i", inputVideoPath,                                "-vf", "fps=5,scale=400:-1:flags=lanczos,palettegen",                                "-y", paletteFile, "-vn")                        .redirectError(new File("stderr.txt"))                        .start();                isComplete = p.waitFor(10, TimeUnit.SECONDS);                if (!isComplete) {                    System.out.println("生成调色板出错");                } else {                    List<String> command = new ArrayList<String>();                                        command.add(ffmpegPath);                    command.add("-v");                    command.add("warning");                    command.add("-ss");                    command.add("2");                    command.add("-t");                    command.add("10");                    command.add("-i");                    command.add(inputVideoPath);                    command.add("-i");                    command.add(paletteFile);                    command.add("-lavfi");                    command.add("fps=5,scale=400:-1:flags=lanczos [x]; [x][1:v] paletteuse");                    command.add("-y");                    command.add(gifFile);                    command.add("-vn");                    ProcessBuilder builder = new ProcessBuilder(command);                    Process process = null;                    try {                        process = builder.start();                        isComplete = process.waitFor(10, TimeUnit.SECONDS);                        if (isComplete) {                            new File(paletteFile).delete();                            System.out.println("生成gif成功");                            break;                        } else {                            System.out.println("生成gif出错");                        }                    } catch (IOException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }//                process = new ProcessBuilder()//                            .command(ffmpegPath,//                                    "-v", "warning",//                                    "-ss", "2",//                                    "-t", "10",//                                    "-i", "E:\\Video_2021-05-14_113013.mp4",//                                    "-i", paletteFile,//                                    "-lavfi", "fps=5,scale=400:-1:flags=lanczos [x]; [x][1:v] paletteuse",//                                    "-y", gifFile, "-vn")//                            .redirectError(new File("stderr.txt"))//                            .start();//                    isComplete = process.waitFor(10, TimeUnit.SECONDS);//                    if (isComplete) {//                        System.out.println("生成gif成功");//                        break;//                    } else {//                        System.out.println("生成gif出错");//                    }                }            } catch (Exception e) {                System.out.println("生成gif出错");            }        }        return gifFile;    }

java基本数据类型有哪些

Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型。3、字符类型,字符类型的关键字是“char”。4、布尔类型,是表示逻辑值的基本数据类型。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何在JAVA中使用ffmepg处理视频

本文链接: https://lsjlt.com/news/276799.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在JAVA中使用ffmepg处理视频
    如何在JAVA中使用ffmepg处理视频?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。FFmepg安装路径:然后在使用的类中生命一个全局变量就好 pr...
    99+
    2023-06-15
  • JAVA使用ffmepg处理视频的方法(压缩,分片,合并)
    FFmepg安装 路径: 然后在使用的类中生命一个全局变量就好 private static String ffmpegPath = "C:\\hk\\ffmpeg\\bi...
    99+
    2024-04-02
  • 如何使用FFmpeg视频处理
    这篇文章给大家分享的是有关如何使用FFmpeg视频处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。FFmpeg 是视频处理最常用的开源软件。它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube...
    99+
    2023-06-26
  • 如何在PHP中进行视频处理?
    在当今日益数字化的时代,视频处理已成为人们日常工作和生活中不可或缺的一部分。而在PHP开发领域,如何进行视频处理也是一个很重要的问题。本文将介绍PHP中常用的视频处理方式及其实现方法。一、视频格式介绍在进行视频处理之前,我们需要首先了解一些...
    99+
    2023-05-14
    PHP 视频处理 处理视频
  • 如何使用使用python+opencv解析视频并处理视频中的水印
    本篇内容主要讲解“如何使用使用python+opencv解析视频并处理视频中的水印”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用使用python+opencv解析视频并处理视频中的水印”...
    99+
    2023-06-02
  • 如何使用PHP进行视频处理?
    随着网络技术的飞速发展,视频已经成为人们日常生活中不可或缺的一部分。在这个数字时代,如何使用PHP进行视频处理已经成为了一个热门话题,本文将介绍PHP的一些基本功能和工具,以帮助大家更好地处理视频。一、认识PHPPHP是一种高级程序设计语言...
    99+
    2023-05-22
    PHP 视频处理 多媒体应用
  • 如何使用PHP进行视频文件处理?
    视频文件处理是现代网络应用程序中必不可少的一部分,它包括裁剪、压缩、转码、添加水印和合并等操作。PHP 作为一种流行的服务器端编程语言,可以用于处理这些要求。在本文中,我们将介绍如何使用 PHP 处理视频文件。安装 FFMPEG 库FFMP...
    99+
    2023-05-14
    PHP 视频文件处理 处理技巧
  • 如何使用 PHP 函数处理视频数据?
    php 提供一系列视频处理函数,包括 ffmpeg_exec()、videoinfo()、vcodec() 和 acodec(),可用于转换格式、提取信息和获取编解码器信息。实战案例展示...
    99+
    2024-05-04
    php 视频处理
  • 怎么在python中使用moviepy对视频进行处理
    本篇文章为大家展示了怎么在python中使用moviepy对视频进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研...
    99+
    2023-06-08
  • javaCV视频处理之如何提取人像视频
    这篇文章主要为大家展示了“javaCV视频处理之如何提取人像视频”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javaCV视频处理之如何提取人像视频”这篇文章吧。效果图对比左侧的为原视频,右侧为...
    99+
    2023-06-22
  • php如何处理视频不卡
    本文操作环境:Windows7系统、PHP7.1、Dell G3。php如何处理视频不卡?php如何切片处理视频大文件PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。file_uploads=on/off 是否允许通过ht...
    99+
    2019-12-23
    php
  • 如何使用Python的OpenCV库处理图像和视频
    目录介绍计算机视觉OpenCV应用:安装使用 OpenCV 处理图像1. 从文件中读取图像2. 调整图像大小:3. 旋转图像4. 翻转图像:5. 重写图像6. 裁剪图像7. 绘制形状...
    99+
    2024-04-02
  • 在java中实现视频处理及播放功能详解
    我们知道,现在视频可以说是最火爆的多媒体手段了,所以顺带着视频处理技术也就成了目前炙手可热的技术之一了。我们作为一个Java程序员,又该怎么处理视频呢今天Java架构栈就给大家讲解一下,如何通过Java代码来实现视频处理及播放。 一. 需要...
    99+
    2023-09-08
    java 音视频 开发语言
  • 如何使用 JavaScript object URLs进行图像音频和视频的处理
    本篇文章为大家展示了如何使用 JavaScript object URLs进行图像音频和视频的处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。许多Web应用程序需...
    99+
    2024-04-02
  • Python如何利用ffmpeg处理视频素材
    目录前言一、安装二、subprocess调用三、ffmpy3转码解复用复用拆分成图片四、最后前言 第一次处理视频素材可以手动用剪映来处理,然后再用代码进行自动化处理,不然连朝哪个方向...
    99+
    2024-04-02
  • 如何在HTML5中使用video.js视频播放插件
    本篇文章给大家分享的是有关如何在HTML5中使用video.js视频播放插件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。看下默认例子:controls表示控制条,prload...
    99+
    2023-06-09
  • 如何在HTML5中使用video实现视频字幕
    这篇文章将为大家详细讲解有关如何在HTML5中使用video实现视频字幕,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。HTML5允许我们使用 元素为视频指定字幕。这个元素的各种属性允许我们指...
    99+
    2023-06-09
  • C#开发中如何处理图像处理和视频处理问题
    C#开发中如何处理图像处理和视频处理问题,需要具体代码示例摘要:图像处理和视频处理在计算机视觉和媒体领域中占据重要的位置。本文将介绍如何使用C#编程语言处理图像和视频相关的问题,并提供了具体的代码示例。在图像处理方面,我们将讨论如何读取、修...
    99+
    2023-10-22
    图像处理 视频处理 C#开发
  • 如何在Ubuntu中录制视频
    在Ubuntu中录制视频的方法:在Ubuntu 18.04中有一个内置的录屏工具,我们可以通过快捷键的方式将其启动或关闭,启动方式:快捷键【Ctrl + Alt + Shift + R】,开启后会看到 Ubuntu 桌面的右上方多了一个红色...
    99+
    2024-04-02
  • 如何在html中播放视频
    本篇文章为大家展示了如何在html中播放视频,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。html播放视频在 HTML 中播放视频并不容易!您需要谙熟大量技巧,以确保您的视频文件在所有浏览器中(In...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作