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);
}
相关推荐
feiyangqingyun15 小时前
Qt和ffmpeg结合打造gb28181推流/支持udp和tcp被动以及tcp主动三种方式
qt·udp·ffmpeg
-KamMinG15 小时前
云上极速转码:阿里云ECS+T4 GPU打造高性能FFmpeg视频处理引擎(部署指南)
阿里云·ffmpeg·音视频
给大佬递杯卡布奇诺1 天前
FFmpeg 基本API avcodec_alloc_context3函数内部调用流程分析
c++·ffmpeg·音视频
给大佬递杯卡布奇诺1 天前
FFmpeg 基本API avio_open函数内部调用流程分析
c++·ffmpeg·音视频
Damon小智1 天前
RedPlayer 视频播放器在 HarmonyOS 应用中的实践
音视频·harmonyos·鸿蒙·小红书·三方库·redplayer
云雾J视界1 天前
Linux企业级解决方案架构:字节跳动短视频推荐系统全链路实践
linux·云原生·架构·kubernetes·音视频·glusterfs·elk stack
Likeadust2 天前
新版视频直播点播平台EasyDSS用视频破局,获客转化双提升
大数据·音视频
涛涛讲AI2 天前
一段音频多段字幕,让音频能够流畅自然对应字幕 AI生成视频,扣子生成剪映视频草稿
人工智能·音视频·语音识别
lzptouch2 天前
数据预处理(音频/图像/视频/文字)及多模态统一大模型输入方案
人工智能·音视频
casdfxx2 天前
捡到h3开发板,做了个视频小车(二),御游追风plus做遥控器
音视频