java代码实现文件格式转换

通过FFmpeg实现文件的格式转换
参考文档:https://blog.csdn.net/qq_41301064/article/details/141678539
首先Maven引入FFmpeg依赖
复制代码
    <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-all-deps</artifactId>
            <version>3.3.1</version>
            <exclusions>
                <!-- 排除不需要的平台依赖 -->
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-win32</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-linux32</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-osx64</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-osxm1</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-linux-arm32</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ws.schild</groupId>
                    <artifactId>jave-nativebin-linux-arm64</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
复制代码

 



定义转换方法
复制代码
package cn.oyun.speech.module.system.convert.video;

import lombok.extern.slf4j.Slf4j;
import ws.schild.jave.Encoder;
import ws.schild.jave.EncoderException;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.AudioAttributes;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.encode.VideoAttributes;
import ws.schild.jave.info.MultimediaInfo;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.net.URL;
import java.time.LocalDateTime;

@Slf4j
public class FFmpegUtils {

    public static void main(String[] args) {
//        String mp4 = "D:\\upload\\1.mp4";
//        MultimediaInfo multimediaInfo = getMultimediaInfo(mp4);
//        System.out.println(multimediaInfo);
//        String mp3="D:\\upload\\少年的梦.mp3";
//        MultimediaInfo multimediaInfo1 = getMultimediaInfo(mp3);
//        System.out.println(multimediaInfo1);
//        String jpg = "D:\\upload\\1.jpg";
//        MultimediaInfo multimediaInfo2 = getMultimediaInfo(jpg);
//        System.out.println(multimediaInfo2);
//        String mp4Url = "http://36.134.89.91:9091/sfile/ovy3v4xjgptb44iszmd2g04b2ha56ffk.mp4";
//        MultimediaInfo mp4MultimediaInfo = getMultimediaInfoFromUrl(mp4Url);
//        System.out.println(mp4MultimediaInfo);
//        String imgOutPut = "D:\\upload\\imgOutPut1.jpg";
//        interceptImage(mp4Url, imgOutPut);
        String input = "你的文件地址";
        String output = "D:\\upload\\1.wav";

        System.out.println("开始转码:"+ LocalDateTime.now());
        formatToWav(input, output);
        System.out.println("结束转码:"+ LocalDateTime.now());
    }

    /**
     * 通过本地路径获取多媒体文件信息(宽,高,时长,编码等)
     *
     * @param localPath 本地路径
     * @return MultimediaInfo 对象,包含 (宽,高,时长,编码等)
     * @throws EncoderException
     */
    public static MultimediaInfo getMultimediaInfo(String localPath) {
        MultimediaInfo multimediaInfo = null;
        try {
            multimediaInfo = new MultimediaObject(new File(localPath)).getInfo();
        } catch (EncoderException e) {
            System.out.println("获取多媒体文件信息异常");
            e.printStackTrace();
        }
        return multimediaInfo;
    }

    /**
     * 通过URL获取多媒体文件信息
     *
     * @param url 网络url
     * @return MultimediaInfo 对象,包含 (宽,高,时长,编码等)
     * @throws EncoderException
     */
    public static MultimediaInfo getMultimediaInfoFromUrl(String url) {
        MultimediaInfo multimediaInfo = null;
        try {
            multimediaInfo = new MultimediaObject(new URL(url)).getInfo();
        } catch (Exception e) {
            System.out.println("获取多媒体文件信息异常");
            e.printStackTrace();//TODO 国际化
        }
        return multimediaInfo;
    }

    /**
     * 截封面图
     *
     * @param input     视频文件或地址
     * @param imgOutPut 图片的输出路径
     * @return 是否成功
     */

    public static String interceptImage(String input, String imgOutPut) {
        String videoUrl = input; // 视频URL
        try {
            // 执行FFmpeg命令
            ProcessBuilder processBuilder = new ProcessBuilder("ffmpeg", "-i", videoUrl, "-ss", "00:00:01", "-vframes", "1", imgOutPut);
            Process process = processBuilder.start();

            // 获取命令输出结果
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String line;
            while ((line = reader.readLine()) != null) {
//                log.debug("reader.readLine:{}", line);
            }
            // 等待命令执行完成
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                log.info("封面提取完成!");
                return imgOutPut;
            } else {
                log.error("封面提取失败!exitCode:{},input:{},imgOutPut:{}", exitCode,input,imgOutPut);
            }
        } catch (Exception e) {
            log.error("processBuilder error.", e);
        }
        return null;
    }

    /**
     * 视频格式化为mp4
     *
     * @param file
     * @param targetPath
     * @return
     */
    public static boolean formatToMp4(File file, String targetPath) {
        File target = new File(targetPath);
        MultimediaObject multimediaObject;
        try {
            // 若是本地文件: multimediaObject = new MultimediaObject(new File("你的本地路径"));
//            multimediaObject = new MultimediaObject(new URL(url));
//            multimediaObject = new MultimediaObject(new File(input));
            multimediaObject = new MultimediaObject(file);
            EncodingAttributes attributes = new EncodingAttributes();
            // 设置视频的音频参数
            AudioAttributes audioAttributes = new AudioAttributes();
            attributes.setAudioAttributes(audioAttributes);
            // 设置视频的视频参数
            VideoAttributes videoAttributes = new VideoAttributes();
            // 设置帧率
            videoAttributes.setFrameRate(25);
            attributes.setVideoAttributes(videoAttributes);
            // 设置输出格式
            attributes.setOutputFormat("mp4");
            Encoder encoder = new Encoder();
            encoder.encode(multimediaObject, target, attributes);
            return true;
        } catch (Exception e) {
            System.out.println("格式化视频异常");
            e.printStackTrace();
            return false;
        }
    }
    public static boolean formatToWav(String input, String targetPath) {
        File target = new File(targetPath);
        MultimediaObject multimediaObject;
        try {
            // 若是本地文件: multimediaObject = new MultimediaObject(new File("你的本地路径"));
            multimediaObject = new MultimediaObject(new URL(input));
//            multimediaObject = new MultimediaObject(new File(input));
            EncodingAttributes attributes = new EncodingAttributes();
            // 设置视频的音频参数
            AudioAttributes audioAttributes = new AudioAttributes();
            attributes.setAudioAttributes(audioAttributes);
            // 设置视频的视频参数
            VideoAttributes videoAttributes = new VideoAttributes();
            // 设置帧率
            videoAttributes.setFrameRate(25);
            attributes.setVideoAttributes(videoAttributes);
            // 设置输出格式
            attributes.setOutputFormat("wav");
            Encoder encoder = new Encoder();
            encoder.encode(multimediaObject, target, attributes);
            return true;
        } catch (Exception e) {
            System.out.println("格式化视频异常");
            e.printStackTrace();
            return false;
        }
    }
}
复制代码

 

posted on   一往无前!  阅读(49)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示