Java如何整合FFmpeg、FFprobe等音视频处理工具,零基础照样玩
创始人
2024-05-25 19:50:32
0
前言:时隔一年多了,不知不觉博客停更那么久了,那不忘初心还记得吗?
最近在做音视频相关的开发,没什么资料并且之前也没有接触过这方面,
咨询了T届的好友,拿到了下面的这张表情包,问题是当我百度的时候才
发现与我想要知道的相关文档是没有一篇能满足,东拼西凑的找文档,可
还是没办法实现想要的功能,于是我陷入了沉思......最终还是轻松搞定
了这个需求,于是我打开了csdn想给后人留一片树荫。

最后奉上工具的学习资料(感兴趣的可以看看),废话不多说!!!!!

FFmpeg是啥:​ ffmpeg(命令行工具) 是一个快速的音视频转换工具。
FFmpeg能干啥:如果你用过爱剪辑的话或者其他一些音视频处理软件的话,你可以理解他们能做的你用玩意都能做。
为啥要用FFmpeg:开源免费啊,你用软件要收费呢,但是这不是关键,核心是你要整合进Java,怎么用Java和执行它,也就是你咋去写个爱剪辑呢(当然呢那种东西靠一个两个人也是很难写出来的,本文结合实际情况处理一下小问题还是绰绰有余)。

FFmpeg先去这学习一下再来看哦

1、我的需求

需要将mp3,m4a,m4r,wma,amr,aac,ac3,ape,flac,mmf,ogg类型格式的音频转成wav格式并指定声道和采样率;
需要将mp4,3gp,mov,m4v,mkv,flv,vob,wmv,rm,rmvb,dat,asf,asx,avi类型格式的视频先提取音轨再转成wav格式并指定声道和采样率;

2、设计&编码

当时了解到的技术选型就是ffmpeg工具了,去简单的学习了一下这个工具的基础语法以及音视频开发的基本规范和格式。

于是我写了工具类FFmpegUtils

package com.iflytex.bohai.utils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;/*** 利用ffmpeg进行音频视频操作,需先下载安装ffmpeg*/
@Slf4j
@Data
@Configuration
public class FfmpegUtil {@Value("${ffmpeg.temppath}")private String tempPath;//保存音频、视频的临时文件夹@Value("${ffmpeg.ffmpeg-util-path}")private String ffmpegUtilPath;//工具包路径/*** 将音频统一转成wav格式* @param inputPath 输入文件* @param sampleRate 采样率*/public String transcodeToWav(String inputPath, String sampleRate) throws IOException, InterruptedException {createTempDir();List command = new ArrayList<>();command.add(ffmpegUtilPath);command.add("-y");command.add("-i");command.add(inputPath);command.add("-async");command.add("1");command.add("-ar");command.add(sampleRate);command.add("-ac");command.add("1");command.add("-f");command.add("wav");String outputPath=FilenameUtils.getFullPath(inputPath)+FilenameUtils.getBaseName(inputPath) +".wav";command.add(outputPath);commandStart(command);return outputPath;}/*** 从视频中提取音频为wav* @param inputPath 视频文件的路径*  @param sampleRate 采样率*/public String getAudioFromVideo(String inputPath,String sampleRate) throws IOException, InterruptedException {createTempDir();List command = new ArrayList<>();command.add(ffmpegUtilPath);command.add("-i");command.add(inputPath);command.add("-ac");command.add("1");command.add("-ar");command.add(sampleRate);command.add("-f");command.add("wav");command.add("-vn");String outputPath=FilenameUtils.getFullPath(inputPath)+FilenameUtils.getBaseName(inputPath)+".wav";command.add(outputPath);commandStart(command);return outputPath;}/*** 调用命令行执行** @param command 命令行参数*/public static void commandStart(List command) throws IOException, InterruptedException {ProcessBuilder builder = new ProcessBuilder();//正常信息和错误信息合并输出builder.redirectErrorStream(true);builder.command(command);log.debug(command.toString());//开始执行命令Process process;process = builder.start();//如果你想获取到执行完后的信息,那么下面的代码也是需要的String line = "";BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));while ((line = br.readLine()) != null) {log.debug(line);}process.waitFor();log.debug("命令执行放回code为:"+process.exitValue());if(process.exitValue()==1){throw new RuntimeException();}}/*创建临时目录(用于存储转换后的音视频和原音视频)每次使用转换功能是都调用方式目录被删除导致的异常*/public void createTempDir(){//如果没有文件夹,则创建File tempMediaFile = new File(tempPath);if (!tempMediaFile.exists() && !tempMediaFile.isDirectory()) {boolean isSuccess = tempMediaFile.mkdirs();log.info("初始化音视频临时目录是否成功:{}",isSuccess);}}//    /**
//     * 获取ffmpeg的工具路径,根据操作系统去自动选择
//     * @return ffmpeg的工具路径
//     */
//    private  String getFFmpegPath(){ String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
//
//        String ffmpegPath ="./ffmpeg";
//        String os = System.getProperty("os.name");
//        if(os.toLowerCase().startsWith("win")){
//            ffmpegPath ="./ffmpeg.exe";
//        }
//        return ffmpegPath;
//    }}
process.waitFor();
这句要注意,本地不加不报错因为本地处理速度快,服务器有内耗的话不加这个偶尔就报错的

如果需要其他操作直接仿照我的写法来就好了,具体的命令可以看我上面给点那个链接里面的内容,都是从0告诉你。

3、总结

  • 先去简单了解一下ffmpeg的基础用法
  • 仿照工具类完成一些想要的操作
  • 资料我给你们打包好,免费奉上(工具包的os\win版本,ffmpeg专业化文档)
  • 资料都打包在这里了免费拿取点个赞呗
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
ChatGPT 怎么用最新详细... ChatGPT 以其强大的信息整合和对话能力惊艳了全球,在自然语言处理上面表现出了惊人...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...