# ffmpeg-java
**Repository Path**: owenwxs/ffmpeg-java
## Basic Information
- **Project Name**: ffmpeg-java
- **Description**: 音频视处理工具,简化FFmpeg软件调用过程
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-03-07
- **Last Updated**: 2025-05-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# tg-common-audio组件 **🛠**
## 设计说明💡
[tg-common-audio](http://192.168.3.32/development/toguide-capacity-platform-v2/tg-common/tg-common-audio)组件是一个音频视处理工具,简化FFmpeg软件调用过程
- **设计目标**:组件的设计目标是开发者只需要编写 FFmpeg 命令,无需关注Java调用FFmpeg的底层细节。
- **灵活配置**:通过配置文件的形式,允许开发者灵活地定义多种音视频转码命令,实现高效、灵活的音频格式转换功能。
- **实现方式**:利用 commons-exec 库执行 FFmpeg 命令。
作者 :王晓松、穆龙龙
### 关键词解释
| 名词 | 描述 |
| --------------- | ------------------------------------------------------------ |
| FFmpeg | FFmpeg是跨平台多媒体框架,能够解码、编码、转码。官方文档:https://ffmpeg.org/ |
| jave-all-deps | 基于FFmpeg库的Java音视频编解码库,提供了一套简单易用的API,用于对音视频文件进行编解码、转码、切分、合并等操作 |
| CommandManager | 封装`commons-exec`库,负责执行FFmpeg命令并处理输出与错误信息。 |
| ResourceManager | 用于管理音视频处理过程中产生的文件资源,提供文件的创建、访问和删除服务。 |
| FFmpegExecutor | `FFmpegExecutor` 负责协调 `CommandManager` 和 `ResourceManager` 的调度与交互。 |
## 功能目录📑
| 目录 | 描述 |
| ------------- | ------------------------------------------------------------ |
| **component** | 核心组件,包括负责执行FFmpeg命令的CommandManager组件、负责管理文件资源的ResourceManager组件、负责协调 `CommandManager` 和 `ResourceManager` 组件FFmpeg执行器。 |
| **config** | 配置类,用于定义一些FFmpeg音视频处理配置,如 ’自定义转码指令’。 |
| **constant** | constant包提供常量包括媒体类型、指令类型 |
## 详细功能介绍📜
| 功能 | 描述 |
| :-------------------------- | ---------------------------------------------- |
| [核心功能模块](#音视频转码) | 调用FFmpeg软件执行自定义的指令,实现音视频转码 |
## 接口描述🎯
### 音视频转码
- 类名:FFmpegExecutor
```java
/**
* 通用转码方法
* @param inputPath 输入文件绝对路径
* @param targetFormat 输出文件格式
* @param commandKey 配置文件中定义 ffmpeg-sdk.commands配置项的名称
* 示例 : PCM-TO-MP3: ffmpeg -f s16le -ar 16000 -ac 1 -i inputPath -b:a 64k outputPath
* 其中配置项的名称为 PCM-TO-MP3
* @return 输出文件绝对路径
*/
public String transcode(String inputPath, String targetFormat, String commandKey);
```
## 上手指南🚀
### 1、配置项
application.yml文件的配置项如下:
```yaml
ffmpeg-sdk:
# FFmpeg软件位置
# 此配置项用于指定FFmpeg二进制可执行文件的位置。
# 默认情况下,jave-all-deps依赖库会提供针对不同平台的预编译FFmpeg二进制文件,因此用户无需手动安装FFmpeg。
# - 在Windows平台,默认路径为:C:\Users\用户\AppData\Local\Temp\jave\ffmpeg-amd64-3.5.0
# - 在Linux平台,默认路径为:/tmp/jave/ffmpeg-amd64-3.5.0
# 如果希望提高转码速度或使用特定版本的功能,建议访问FFmpeg官方网站下载最新版本,并通过此配置项指定可执行文件的准确路径。
ffmpeg-path:
# 转码路径 该配置项用于指定转码前文件的临时存储位置以及转码后输出的目标路径。
# 默认情况下,如果此项未填写,将使用系统的临时文件路径进行存储。
# 为了提升转码速度,建议在Linux系统中使用/dev/shm作为转码路径,该路径基于内存读写效率显著提高。
# 注意:在选择/dev/shm作为转码路径之前,请务必使用`df -h`命令检查该路径是否有足够的可用空间,以避免因空间不足导致的转码失败。
swap-path:
# 自定义FFmpeg命令 编写时使用文件输入路径inputPath和文件输出路径outputPath作为占位标识
commands:
# 声道 ac 1 采样率 -ar 16000 输出音频质量 -q:a 9
MP4-TO-MP3: ffmpeg -i inputPath -vn -ac 1 -ar 16000 -codec:a libmp3lame -q:a 9 -b:a 128k outputPath
PCM-TO-WAV: ffmpeg -f s16le -ar 16000 -ac 1 -i inputPath outputPath
MP3-TO-WAV: ffmpeg -i inputPath -ar 16000 -ab 128k -c:a libmp3lame outputPath
PCM-TO-MP3: ffmpeg -f s16le -ar 16000 -ac 1 -i inputPath -b:a 64k outputPath
AMR-TO-WAV: ffmpeg -i inputPath -ar 16000 -ac 1 -b:a 32k outputPath
WAV-TO-AMR: ffmpeg -i inputPath -ar 8000 -ac 1 -ab 12.2k outputPath
M4A-TO-WAV: ffmpeg -i inputPath -ar 16000 -b:a 256k -acodec pcm_s16le outputPath
WAV-TO-M4A: ffmpeg -i inputPath -ar 16000 -b:a 256k -acodec aac outputPath
```
### 2、组件应用方式
tg-common-audio的引用
```xml
cn.toguide.common
tg-common-audio
```
通过注入FFMpegExecutor调用转码方法
```java
import cn.toguide.ffmpeg.constant.CommandType;
import cn.toguide.ffmpeg.constant.MediaFormat;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.io.File;
@SpringBootTest(classes = TgAudioApplication.class)
class FFMpegExecutorTest {
@Autowired
private FFMpegExecutor ffMpegExecutor;
/**
* 本地文件转码
*/
@Test
void transcode() {
File file = new File("D:\\测试.pcm");
String inputPath = file.getAbsolutePath();
String outputPath = ffMpegExecutor.transcode(inputPath, MediaFormat.MP3, CommandType.PCM_TO_MP3);
System.out.println("转码后的文件路径:" + outputPath);
}
/**
* 模拟MultipartFile参数
*/
@Test
public void transcodeMockMultipartFile() throws IOException {
File file = new File("D:\\测试.pcm");
MultipartFile multipartFile = new MockMultipartFile(
"测试.pcm", //文件名
"测试.pcm", //originalName 相当于上传文件在客户机上的文件名
MediaType.APPLICATION_OCTET_STREAM_VALUE, //文件类型
Files.newInputStream(file.toPath()) //文件流
);
// 创建临时文件
File tempFile = Files.createTempFile("upload-", "." + MediaFormat.PCM).toFile();
// 将 MultipartFile 写入临时文件
multipartFile.transferTo(tempFile);
// 获取临时文件的绝对路径
String inputPath = tempFile.getAbsolutePath();
// 调用转码方法
String outputPath = ffMpegExecutor.transcode(inputPath, MediaFormat.MP3, CommandType.PCM_TO_MP3);
// 输出转码后的文件路径
System.out.println("转码后的文件路径:" + outputPath);
// 删除临时文件(可选)
Files.deleteIfExists(tempFile.toPath());
}
}
```
## 依赖开源软件🗺️
| **依赖软件** | **版本** |
| ----------------- | --------- |
| **jave-all-deps** | **3.3.1** |
| **commons-exec** | **1.3** |