当前位置: 首页 > ops >正文

FFmpeg音视频处理解决方案

核心组件:

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

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

ffplay:简单的媒体播放器

主要功能:

✅ 格式转换(转码)

✅ 视频裁剪、合并

✅ 调整分辨率、比特率

✅ 提取音频/视频

✅ 截图/生成缩略图

✅ 添加水印、字幕

✅ 流媒体处理

一、安装FFmpeg

Windows:

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

Linux (Ubuntu/Debian):

sudo apt update
sudo apt install ffmpeg

macOS:

brew install ffmpeg

二、项目配置

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

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

三、依赖注入与异步处理

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

核心转码方法

  • ProcessBuilder
  • Process
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);}
}

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

@RestController
@RequestMapping("/api/video")
public class VideoController {@Autowiredprivate 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());}}
}
@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);
}
http://www.xdnf.cn/news/19164.html

相关文章:

  • 【GaussDB】在逻辑复制中剔除指定用户的事务
  • 【C++】C++ const成员函数与取地址操作符重载
  • 【Leetcode hot 100】21.合并两个有序链表
  • Flutter MVVM+provider的基本示例
  • ceph配置集群
  • VGG改进(6):基于PyTorch的VGG16-SE网络实战
  • “我店模式“当下观察:三方逻辑未变,三大升级重构竞争力
  • 详解常见的多模态大模型指令集构建
  • vue表格底部添加合计栏,且能跟主表同时滑动
  • 「鸿蒙系统的编程基础」——探索鸿蒙开发
  • 机器视觉学习-day12-图像梯度处理及图像边缘检测
  • REST API 是无状态的吗,如何保障 API 的安全调用?
  • 中科院人机交互科研分享-田丰
  • OpenCV 轮廓分析实战:从检测到形状匹配的完整指南
  • 【后端】云服务器用nginx配置域名访问前后端分离项目
  • SpringBoot防止重复提交(2)
  • docker 部署Skywalking
  • 干掉抽取壳!FART 自动化脱壳框架与 Execute 脱壳点解析
  • OpenCV DNN 模块完全指南:从理论基础到实战应用 —— 图像分类与目标检测的深度学习实现(含 Python/C++ 代码与性能分析)
  • 一站式可视化运维:解锁时序数据库 TDengine 的正确打开方式
  • 微信小程序长按识别图片二维码
  • 【C语言】字符函数与字符串函数实战:用法原理 + 模拟实现
  • 零、2025 年软件设计师考试大纲
  • Citrix 零日漏洞自五月起遭积极利用
  • Redis-基数统计、位图、位域、流
  • LangChain.js 实战与原理:用 LCEL 构建可维护的 RAG / Agent 系统(含 4 套 30+ 行代码)
  • 大语言模型生成的“超龄劳动者权益保障制度系统化完善建议(修订版)”
  • Day17(前端:JavaScript基础阶段)
  • Elasticsearch:Semantic text 字段类型
  • PostgreSQL令牌机制解析