Java 调用ffmpeg 实现视频编辑

这篇具有很好参考价值的文章主要介绍了Java 调用ffmpeg 实现视频编辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前言

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

2.1 实现格式转换功能

该方法就设置了一个入参,即文件路径。参数ffmpegPath是@value引入的yml配置,如下图
Java 调用ffmpeg 实现视频编辑
指向的路径下放入FFmpeg的.exe文件即可。
Java 调用ffmpeg 实现视频编辑

    @Value("${ffmpeg.path}")
    String ffmpegPath;

public  String transCoding(String path) throws IOException {
        String ffmpegExePath = new ClassPathResource(ffmpegPath+"/ffmpeg.exe").getAbsolutePath();
        ArrayList<String> command = new ArrayList<>();
        command.add(ffmpegExePath);
        command.add("-i");
        command.add(path);
        command.add("-vcodec");
        command.add("copy");
        command.add("-f");
        command.add("mpegts");
        String s = "E:\\data\\split\\" + IdUtil.simpleUUID() + ".mp4";
        command.add(s);
        // 执行操作
        ProcessBuilder builder = new ProcessBuilder();
        builder.command(command);
        builder.redirectErrorStream(true);
        Process process = builder.start();
        return s;
    }

2.2 实现视频剪辑

 public String videoSpit(String path, String startTime, String duration) throws IOException {
        int i = Integer.parseInt(startTime) / 1000;
        int i1 = Integer.parseInt(duration) / 1000;
        String ffmpegExePath = new ClassPathResource(ffmpegPath +"/ffmpeg.exe").getAbsolutePath();
        List<String> command = new ArrayList<>();
        command.add(ffmpegExePath);
        command.add("-ss");
        command.add(String.valueOf(i));
        command.add("-t");
        command.add(String.valueOf(i1));
        command.add("-accurate_seek");
        command.add("-i");
        if (!FileUtil.file(path).isFile()) {
            return "文件不存在,请检查!!";
        }
        command.add(path);
        command.add("-codec");
        command.add("copy");
        command.add("-avoid_negative_ts");
        command.add("1");
        String s = IdUtil.simpleUUID();
        //本地开发写死路径
        String substring = path.substring(path.lastIndexOf("."));
        String e1 = "E:\\data\\split\\" + s + path.substring(path.lastIndexOf("."));
        StringBuilder stringBuffer = new StringBuilder();
        //业务需求,判断是否为mp4,如不需要可以去掉
        if (!"mp4".equals(substring)) {
            String s1 = transCoding(e1);
            command.add(s1);
            stringBuffer.append(s1);
        }else {
            command.add(e1);
            stringBuffer.append(e1);
        }
        try {
            System.out.println(command);
            ProcessBuilder builder = new ProcessBuilder();

            builder.command(command);
            //正常信息和错误信息合并输出

            builder.redirectErrorStream(true);

            //开始执行命令

            Process process = builder.start();
            //如果你想获取到执行完后的信息,那么下面的代码也是需要的

            StringBuilder sbf = new StringBuilder();

            String line;

            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));

            while ((line = br.readLine()) != null) {

                sbf.append(line);

                sbf.append(" ");

            }

            String resultInfo = sbf.toString();

            System.out.println(resultInfo);
            System.out.println(stringBuffer);
            return stringBuffer.toString();
        } catch (IOException e) {
            e.printStackTrace();

        }
        return "操作失败";
    }

path 是文件路径,startTime是开始时间,duration是持续时间,我这里传入的时间是ms,所以先转换成s。方便FFmpeg处理

2.3 实现对指定区域的裁剪并切割

public void spit(String filePath, Integer startTime, String location, String continuous, Integer number) throws IOException {
        ArrayList<String> command = new ArrayList<>();
        DecimalFormat df = new DecimalFormat("0.00");
        StringBuilder stringBuffer = new StringBuilder();
        for (int i = 0; i < number; i++) {
            command.add("E:\\data\\ffmpeg.exe");
            command.add("-ss");
            String format = df.format((float) i / number + startTime);
            System.out.println("开始时间" + format);
            command.add(String.valueOf(format));
            command.add("-i");
            command.add(filePath);
            command.add("-strict");
            command.add("-2");
            command.add("-vf");
            command.add(location);
            command.add("-t");
            command.add(continuous);
            String s = "E:\\data\\spit-test\\2s\\" + format + ".mp4";
            System.out.println(s);
            command.add(s);
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(command);
            System.out.println(command);
            builder.redirectErrorStream(true);
            Process process = builder.start();
            command.removeAll(command);
            StringBuilder sbf = new StringBuilder();

            String line;

            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));

            while ((line = br.readLine()) != null) {

                sbf.append(line);

                sbf.append(" ");

            }

            String resultInfo = sbf.toString();

            System.out.println(resultInfo);
            System.out.println(stringBuffer);
        }
    }

filePath 文件路径
startTime 开始时间(单位/s)
location 裁剪的位置,格式如:crop=w=100:h=100:x=12:y=34 ,其中w和h指的是裁剪完的帧宽度和帧高度,x和y指裁剪的坐标点,裁剪时会按照该点坐标往右下裁剪。
continuous 持续时间
number 颗粒度 该参数是业务为需求定制,因为我需要按照业务会把视频以0.1s、0.01s切片,则此参数影响for循环次数,根据具体业务修改

截取前:
Java 调用ffmpeg 实现视频编辑

截取后:
Java 调用ffmpeg 实现视频编辑文章来源地址https://www.toymoban.com/news/detail-404388.html

到了这里,关于Java 调用ffmpeg 实现视频编辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java调用FFmpeg

    About FFmpeg ffmpeg(计算机程序) - 百度百科 FFmpeg/FFmpeg - GitHub CSDN:FFmpeg 基础知识 @在奋斗的大道 关于FFmpeg FFmpeg 是领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤和播放几乎任何东西 人类和机器创造的。它支持最晦涩的 古老的格式直到最前沿。不管他们是

    2024年02月04日
    浏览(31)
  • SpringBoot+vue 实现监控视频rtsp播放(java+Nginx+ffmpeg+flv.js)

    其实原理就是: 将监控通过FFMPEG,推送给Nginx,前端通过Nginx地址拉取视频,就可以播放了。 1:安装FFMPEG. 2:下载并且配置nginx. 3:使用java代码实现调用cmd或者linux窗口,并且运行操作FFMPEG的命令,进行监控视频rtsp格式的推送,推送给nginx. 4:前端写一个video标签就可以,Src写nginx的固定地

    2023年04月16日
    浏览(87)
  • c++调用ffmpeg api将视频文件内容进行udp推流

    代码及工程见https://download.csdn.net/download/daqinzl/88156926 开发工具:visual studio 2019 播放,采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://238.1.1.10:6016 主要代码如下: #include \\\"pch.h\\\" #include iostream using namespace std; #include stdio.h #define __STDC_CONSTANT_MACROS extern \\\"C\\\" { #include \\\"include/libavcodec/

    2024年02月14日
    浏览(42)
  • Python视频编辑神器:全面分析ffmpeg-python库的安装与使用方法

    Python视频编辑神器:全面分析ffmpeg-python库的安装与使用方法 在Python中进行视频编辑是一件令人兴奋的事情,它能够让你深入了解和控制你想要的任何一帧视频。而在Python视频编辑工具中,ffmpeg-python库可以说是至关重要的一员。它能够让你轻松地处理视频、音频等多媒体数据

    2024年02月10日
    浏览(65)
  • 使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

    1、打开cmd,执行 chcp 65001 ,修改cmd的编码格式为utf8,避免乱码 2、执行指令 ffmpeg -list_devices true -f dshow -i dummy ,查看当前window的音频和视频名称 3、打开windows系统的\\\"打开声音设置\\\"–“麦克风隐私设置”–\\\"允许应用访问你的麦克风\\\"点击开启 录制视频: 录制音频: 录制音视频:

    2024年02月04日
    浏览(58)
  • java ffmpeg获取视频时长

    nacos里面配置的ffmpegPath,如果不用这个,也可以自己写一个ffmpegPath的地址 代码

    2024年02月07日
    浏览(45)
  • FFmpeg 开发(14):Android FFmpeg + MediaCodec 实现视频硬解码

    FFmpeg 开发系列连载: FFmpeg 开发(01):FFmpeg 编译和集成 FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放 FFmpeg 开发(03):FFmpeg + OpenSLES 实现音频解码播放 FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放 FFmpeg 开发(05):FFmpeg + OpenGLES 实现视频解码播放和视频滤镜 FFmpeg 开发

    2024年02月09日
    浏览(40)
  • ffmpeg实现视频解码

    参考100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x) 平台环境:windows VS 2022 以及在 项目-项目属性-链接器-命令行,在右侧其他选项中添加“/SAFESEH:NO”,这样就不会再报错了。 1.初始化FFmpeg库: 在代码中引入相关的FFmpeg头文件,并调用初始化函数。例如: 2.打开输

    2024年01月24日
    浏览(39)
  • 使用FFMpeg实现视频剪切功能

    雷神实现的ffmpeg代码文章 说明一下,这里转载首先是记录一下实现方法,其次就是解决代码无法正常运行问题(avformat_write_header返回-22) 本文介绍一个基于FFMPEG的封装格式转换器。所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件)

    2023年04月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包