FFmpeg音视频处理解决方案

核心组件:

ffmpeg:主要的命令行工具,用于转码、转换格式等

ffprobe:用于分析多媒体文件信息的工具

ffplay:简单的媒体播放器

主要功能:

✅ 格式转换(转码)

✅ 视频裁剪、合并

✅ 调整分辨率、比特率

✅ 提取音频/视频

✅ 截图/生成缩略图

✅ 添加水印、字幕

✅ 流媒体处理

一、安装FFmpeg

Windows:

  1. 访问 https://ffmpeg.org/download.html
  2. 下载Windows版本,解压到指定目录
  3. 将bin目录添加到系统PATH环境变量

Linux (Ubuntu/Debian):

bash 复制代码
sudo apt update
sudo apt install ffmpeg

macOS:

bash 复制代码
brew install ffmpeg

二、项目配置

在application.properties或application.yml中配置FFmpeg路径:

properties 复制代码
# application.properties
ffmpeg.path=/usr/bin/ffmpeg  # Linux/Mac
# 或
ffmpeg.path=C:\\ffmpeg\\bin\\ffmpeg.exe  # Windows

三、依赖注入与异步处理

java 复制代码
@Service
@Slf4j
public class VideoTranscodingService {
    
    @Value("${ffmpeg.path}")
    private String ffmpegPath; // 注入FFmpeg路径
    
    @Async // 异步执行,避免阻塞请求
    public void transcodeVideo(Long materialId, String inputPath) {
        // 转码逻辑
    }
}

核心转码方法

  • ProcessBuilder
  • Process
java 复制代码
private void transcodeToResolution(String inputPath, String outputPath, String resolution) throws Exception {
    List<String> command = new ArrayList<>();
    command.add(ffmpegPath);
    command.add("-i");
    command.add(inputPath);    // 输入文件
    command.add("-s");
    command.add(resolution);   // 目标分辨率
    command.add("-c:v");
    command.add("libx264");    // 视频编码器
    command.add("-crf");
    command.add("23");         // 视频质量
    command.add("-c:a");
    command.add("aac");        // 音频编码器
    command.add("-b:a");
    command.add("128k");       // 音频比特率
    command.add(outputPath);   // 输出文件
    
    ProcessBuilder builder = new ProcessBuilder(command);
    Process process = builder.start();
    int exitCode = process.waitFor(); // 等待转码完成
    
    if (exitCode != 0) {
        throw new RuntimeException("FFmpeg转码失败,退出码: " + exitCode);
    }
}

四、控制器中上传文件视频

java 复制代码
@RestController
@RequestMapping("/api/video")
public class VideoController {
    
    @Autowired
    private VideoTranscodingService transcodingService;
    
    @PostMapping("/upload")
    public ResponseEntity<String> uploadVideo(@RequestParam("file") MultipartFile file, 
                                             @RequestParam Long materialId) {
        try {
            // 1. 保存上传的文件
            String uploadDir = "uploads/";
            String originalFilename = file.getOriginalFilename();
            String filePath = uploadDir + UUID.randomUUID() + "_" + originalFilename;
            
            File dest = new File(filePath);
            file.transferTo(dest);
            
            // 2. 异步启动转码
            transcodingService.transcodeVideo(materialId, filePath);
            
            return ResponseEntity.ok("视频上传成功,转码中...");
            
        } catch (Exception e) {
            return ResponseEntity.status(500).body("上传失败: " + e.getMessage());
        }
    }
}
java 复制代码
@GetMapping("/status/{materialId}")
public ResponseEntity<Map<String, Object>> getTranscodingStatus(@PathVariable Long materialId) {
    CourseMaterial material = materialRepository.findById(materialId).orElse(null);
    
    if (material == null) {
        return ResponseEntity.notFound().build();
    }
    
    Map<String, Object> response = new HashMap<>();
    response.put("status", material.getTranscodingStatus());
    response.put("filePath", material.getFilePath());
    response.put("duration", material.getDuration());
    
    return ResponseEntity.ok(response);
}
相关推荐
cver1233 小时前
足球视频检测数据集介绍-160张图片-智能体育转播 运动数据分析 自动化视频剪辑 裁判辅助系统 青训技术分析 虚拟现实体验
数据分析·自动化·音视频
来鸟 鸣间4 小时前
MIPI D-PHY 理解
linux·音视频·sensor·mipi
美狐美颜SDK开放平台7 小时前
专业直播美颜SDK如何打造?美型功能开发思路与方案分享
大数据·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
你好音视频7 小时前
FFmpeg FLV解码器原理深度解析
c++·ffmpeg·音视频
行业探路者8 小时前
如何利用活码生成产品画册二维码?
学习·音视频·语音识别·二维码·设备巡检
web前端进阶者9 小时前
webRTC指定设备加自定义用户头像
音视频·webrtc
vfvfb10 小时前
音频批量加速 mp3批量加速1.5倍
音视频
ACP广源盛1392462567310 小时前
GSV6701A@ACP#6701A产品规格详解及产品应用分享
网络·嵌入式硬件·音视频
EasyDSS10 小时前
视频推流平台EasyDSS无人机推流直播在安防监控中的智能应用
音视频·无人机
你好音视频10 小时前
FFmpeg FLV编码器原理深度解析
c++·ffmpeg·音视频