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);
}
相关推荐
零匠学堂20252 小时前
移动学习系统,如何提升企业培训效果?
java·开发语言·spring boot·学习·音视频
Silicore_Emma2 小时前
芯谷科技—D8227 双通道音频功率放大集成电路产品简介与应用推广
单片机·音视频·功率放大器·芯谷科技·便携式音频设备·双通道音频·车载音频系统
生活爱好者!2 小时前
【影视项目】NAS 部署稳定视频订阅源咪咕
服务器·网络·docker·容器·音视频
智算菩萨4 小时前
2025年Sora类视频生成模型架构剖析:时空编码与扩散机制
架构·音视频
Hello.Reader5 小时前
用纯 Go 实现一个 AES-128 加密 m3u8 视频下载器(不依赖 ffmpeg)
golang·ffmpeg·音视频·m3u8
EasyCVR5 小时前
安防监控EasyCVR视频汇聚平台RTSP流播放异常的原因排查
音视频
DisonTangor6 小时前
Step-Audio-R1 首个成功实现测试时计算扩展的音频语言模型
人工智能·语言模型·开源·aigc·音视频
音视频牛哥7 小时前
从低延迟到高可用:RTMP与 HTTP/HTTPS-FLV在App播放体系中的角色重构
人工智能·音视频·音视频开发·http-flv播放器·https-flv播放器·ws-flv播放器·wss-flv播放器
Hommy887 小时前
如何利用剪映小助手实现视频批量剪辑?
aigc·音视频·批量剪辑·剪映
EasyGBS8 小时前
EasyGBS新版本(v3.7.168)发布!视频能力再度升级!
音视频