ffmpeg按像素倍数缩放,并截取前5分钟视频(Java)

这篇具有很好参考价值的文章主要介绍了ffmpeg按像素倍数缩放,并截取前5分钟视频(Java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

package com.crayon2f.ffmpeg;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/**
 * @author zc
 * @date 2023/8/23
 * @apiNote
 */
public class VideoUtils {

    static String command = "$0 -ss $1 -t $2 -i $3 -vcodec copy -acodec copy $4";


    public static void main(String[] args) {
        //缩放倍数
        int zoom = 5;
        //视频截取时间
        int minute = 5;
        //ffmepg工具地址
        String ffmpegPath = "D:/视频压缩/ffmpeg-git-full_v5.1.2/ffmpeg/bin/ffmpeg.exe";
        //输出存放基础地址
        String outputPath = "D:/视频压缩/待压缩视频";
        //原文件所在文件夹
        List<String> fileList = getFileList(outputPath);

        for (int i = 0; i < fileList.size(); i++) {
            createSubVideo(ffmpegPath, fileList.get(i).replaceAll("\\\\", "/"), outputPath, zoom, minute);

        }

    }

    public static void createSubVideo(String ffmpegPath, String inputPath, String outputPath, int zoom, int minute) {

        boolean result = VideoUtils.convertVideoResolution(inputPath, outputPath + zoom + "倍缩放/", ffmpegPath, zoom);
        if (result) {
            String[] inputPathArray = inputPath.split("/", -1);

            // 剪辑后的视频文件路径
            String videoTargetFilePath = outputPath.split("\\)", -1)[0] + "前" + minute + "分钟";
            outputPath = outputPath + zoom + "倍缩放/" + inputPathArray[inputPathArray.length - 1].split("\\.")[0] + "(" + zoom + "倍缩放).mp4";
            // 剪辑前的视频源文件路径
            String videoResourceFilePath = outputPath;

            // 剪辑开始时间点
            String startTime = "00:00:00";
            // 剪辑视频总时长
            String durationTime = "00:0" + minute + ":00";

            //调用方法
            createSubVideo(ffmpegPath, videoResourceFilePath, videoTargetFilePath, startTime, durationTime);

        }
    }


    /**
     * 视频分辨率按倍数缩放
     *
     * @param inputPath  输入视频路径
     * @param ffmpegPath ffmpeg地址
     * @param Zoom       缩放倍数
     * @return
     */
    public static boolean convertVideoResolution(String inputPath, String outputPath, String ffmpegPath, int Zoom) {

        File file = new File(outputPath);

        if (!file.exists() && !file.isDirectory()) {
            file.mkdir();
        }


        //拼接cmd命令语句
        StringBuffer buffer = new StringBuffer();
        buffer.append(ffmpegPath);
        //注意要保留单词之间有空格
        buffer.append(" -i ");
        buffer.append(inputPath);
        //执行命令语句并返回执行结果
        String definition = null;
        try {
            Process process = Runtime.getRuntime().exec(buffer.toString());
            InputStream in = process.getErrorStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = br.readLine()) != null) {
                if (line.trim().startsWith("Duration:")) {
                    //根据字符匹配进行切割
                    System.out.println("视频时间 = " + line.trim().substring(0, line.trim().indexOf(",")));
                }
                //一般包含fps的行就包含分辨率
                if (line.contains("fps")) {
                    //根据
                    definition = line.split(",")[2];
                    definition = definition.trim().split(" ")[0];
                    System.out.println("分辨率 = " + definition);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        if (definition == null) {
            throw new RuntimeException("视频分辨率获取失败!文件地址:" + inputPath);
        }
        if ("bt709".equals(definition)) {
            definition = "1920x1080";
        }

        String[] resolutions = definition.split("x");
        int width = Integer.parseInt(resolutions[0]) / Zoom;
        int height = Integer.parseInt(resolutions[1]) / Zoom;


        String resolution = width + "x" + height;

        String[] inputPathArray = inputPath.split("/", -1);
        outputPath = outputPath + inputPathArray[inputPathArray.length - 1].split("\\.")[0] + "(" + Zoom + "倍缩放).mp4";


        List<String> command = new ArrayList<>();
        command.add("ffmpeg");
        command.add("-i");
        command.add(inputPath);
        command.add("-vf");
        command.add("scale=" + resolution);
        command.add("-c:a");
        command.add("copy");
        command.add(outputPath);

        try {
            ProcessBuilder builder = new ProcessBuilder(command);
            Process process = builder.start();
            InputStream stderr = process.getErrorStream();
            InputStreamReader isr = new InputStreamReader(stderr);
            BufferedReader br = new BufferedReader(isr);
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println("缩放::" + outputPath + "::::::" + line);
            }
            int exitCode = process.waitFor();
            return exitCode == 0;
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * 截取视频
     *
     * @param ffmpegPath            ffmpeg地址
     * @param videoResourceFilePath 源文件地址
     * @param videoTargetFilePath   目标文件地址
     * @param startTime             开始时间
     * @param endTime               结束时间
     * @return
     */
    public static String createSubVideo(String ffmpegPath, String videoResourceFilePath, String
            videoTargetFilePath, String startTime, String endTime) {

        File file = new File(videoTargetFilePath);
        if (!file.exists() && !file.isDirectory()) {
            file.mkdir();
        }

        videoTargetFilePath = videoTargetFilePath + "/" + videoResourceFilePath.split("/")[videoResourceFilePath.split("/").length - 1];

        String str = command.replace("$0", ffmpegPath).replace("$1", startTime).replace("$2", endTime)
                .replace("$3", videoResourceFilePath).replace("$4", videoTargetFilePath);


        Runtime runtime = Runtime.getRuntime();
        try {
            Process proce = runtime.exec(str);
            //处理结果信息Start
            BufferedReader br = new BufferedReader(new InputStreamReader(proce.getErrorStream()));
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println("截取::" + videoTargetFilePath + ":::::::::" + line);
            }
            //处理结果信息Start
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取视频文件列表
     *
     * @param dir
     * @return
     */
    public static List<String> getFileList(String dir) {

        List<String> listFile = new ArrayList<>();

        File dirFile = new File(dir);

        //如果不是目录文件,则直接返回
        if (dirFile.isDirectory()) {
            //获得文件夹下的文件列表,然后根据文件类型分别处理
            File[] files = dirFile.listFiles();
            if (null != files && files.length > 0) {
                //根据时间排序
                Arrays.sort(files, new Comparator<File>() {
                    public int compare(File f1, File f2) {
                        return (int) (f1.lastModified() - f2.lastModified());
                    }

                    public boolean equals(Object obj) {
                        return true;
                    }
                });
                for (File file : files) {
                    //如果不是目录,直接添加
                    if (!file.isDirectory()) {
                        listFile.add(file.getAbsolutePath());
                    } else {
                        listFile.addAll(getFileList(file.getAbsolutePath()));
                    }
                }
            }
        }
        return listFile;
    }

}

文章来源地址https://www.toymoban.com/news/detail-679318.html

到了这里,关于ffmpeg按像素倍数缩放,并截取前5分钟视频(Java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • ffmpeg 截取切割视频报错

    在用ffmpeg来截取只有视频没有音频的mp4文件时,有一些视频可以切割,少部分不能分割,遇到到了bug。 截取命令: 报错如下: [mp3float @ 0000022b8220d300] Header missing Error while decoding stream #0:1: Invalid data found when processing input [mp3float @ 0000022b8220d300] Header missing Error while decoding stream

    2023年04月10日
    浏览(21)
  • Js使用ffmpeg进行视频剪辑和画面截取

    使用场景是需要在web端进行视频的裁剪,包括使用 在线视频url 或 本地视频文件 的裁剪,以及对视频内容的截取等功能。 前端进行视频操作可能会导致性能下降,最好通过后端使用java,c++进行处理,本文的案例是备选方案。 注意: 以下所有的使用案例均基于vue3 setup。 同时

    2024年02月07日
    浏览(27)
  • 使用 ffmpeg 截取视频的某一个时间段内容

    使用 ffmpeg 截取视频的某一个时间段,可以结合以下3个选项: 使用 -ss 选项指定需要截取的开始时间,结合 -to 或者 -t。 to 指定结束的时间点,以下命令将截取视频文件 input.mp4 从 00:00:05.000 开始,到 00:00:15.000 结束这一段视频。 t 指定持续时间,以下命令将截取视频文件 in

    2024年02月05日
    浏览(30)
  • 使用 FFmpeg 轻松调整视频的大小/缩放/更改分辨率

    在此 FFmpeg 教程中,我们学习使用 FFmpeg 的命令行工具更改视频的分辨率(或调整视频的大小/缩放)。 更改视频的分辨率(也称为调整大小或缩放)是视频编辑、处理和压缩中非常常见的操作。对于 ABR 视频流尤其如此,其中将单个视频作为源并压缩为多个不同的比特率分辨

    2024年01月20日
    浏览(46)
  • java ffmpeg获取视频时长

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

    2024年02月07日
    浏览(28)
  • 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 FFmpeg 的跨平台视频播放器简明教程(三):视频解码 经过前面三章的学习,我们快要完成我们的目标任务了:使用 ffmpeg

    2024年02月12日
    浏览(45)
  • Java 调用ffmpeg 实现视频编辑

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

    2023年04月08日
    浏览(27)
  • Java使用FFMPEG获取在线URL视频时长

    1、首先安装FFMPEG并配置环境变量 下载地址:Download FFmpeg 2、代码实现(通过Java执行cmd命令获取视频时长 )

    2024年02月16日
    浏览(26)
  • Java使用ffmpeg实现视频剪切、mp3剪切

      直接运行代码即可:   剪切前      剪切后

    2024年02月16日
    浏览(26)
  • 音视频处理工具FFmpeg与Java结合的简单使用

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

    2024年02月11日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包