Java调用ffmpeg进行视频转码

简介: Java调用ffmpeg进行视频转码(windows或linux),以及后续的一些测试、调优

测试结论

可以使用多线程调用ffmpeg命令执行转码,但不推荐。因为使用多线程并不能提高视频转码效率,相反,它会导致单个的视频转码效率成比例的降低,虽然总体耗时差不多。 综述,推荐使用有且只有一个线程用于调用ffmpeg命令执行视频转码。详情见 https://gitee.com/springboot_learning/springboot-ffmpeg/blob/master/HELP.md的"性能消耗情况如何?"一节

关键代码块

@Async("ffmpegExecutor")
@OverridepublicvoidexecVideoTranscode(FileffmpegCmd, booleanisWindows, StringsourceFile, StringtargetFile) {
Runtimeruntime=null;
try {
log.info("<<开始视频转码>> 文件名:{}", sourceFile);
runtime=Runtime.getRuntime();
longstartTime=System.currentTimeMillis();
Stringcmd=ffmpegCmd.getAbsolutePath() +" -y -i "+sourceFile+" -vcodec libx264 -vf scale=\"iw/1:ih/1\" "+targetFile;
log.info("<<命令>> {}", cmd);
Processprocess=null;
if(isWindows){
process=runtime.exec(cmd);
            }else{
process=runtime.exec(newString[]{"sh", "-c", cmd});
            }
// 通过读取进程的流信息,可以看到视频转码的相关执行信息,并且使得下面的视频转码时间贴近实际的情况BufferedReaderbr=newBufferedReader(newInputStreamReader(process.getErrorStream()));
Stringline=null;
while((line=br.readLine()) !=null){
log.debug("<<视频执行信息>> {}", line);
            }
br.close();
log.info("<<开始关闭进程相关流>>");
process.getOutputStream().close();
process.getInputStream().close();
process.getErrorStream().close();
longendTime=System.currentTimeMillis();
log.info("<<视频转码完成>> 耗时 {}ms", (endTime-startTime));
        } catch (IOExceptione) {
log.error("<<视频转码失败,原因:发生IO异常>>");
        } finally {
if(Objects.nonNull(runtime)){
runtime.freeMemory();
            }
        }
    }

完整代码

https://gitee.com/springboot_learning/springboot-ffmpeg.git  

tip: 请先阅读项目中根目录下的HELP.md文件

相关文章
|
3月前
|
Oracle Java 关系型数据库
java 入门学习视频_2025 最新 java 入门零基础学习视频教程
《Java 21 入门实操指南(2025年版)》提供了Java最新特性的开发指导。首先介绍了JDK 21和IntelliJ IDEA 2025.1的环境配置,包括环境变量设置和预览功能启用。重点讲解了Java 21三大核心特性:虚拟线程简化高并发编程,Record模式优化数据解构,字符串模板提升字符串拼接可读性。最后通过图书管理系统案例,展示如何运用Record定义实体类、使用Stream API进行数据操作,以及结合字符串模板实现控制台交互。该指南完整呈现了从环境搭建到实际项目开发的Java 21全流程实
132 1
|
编解码 NoSQL Java
使用Spring Boot + Redis 队列实现视频文件上传及FFmpeg转码的技术分享
【8月更文挑战第30天】在当前的互联网应用中,视频内容的处理与分发已成为不可或缺的一部分。对于视频平台而言,高效、稳定地处理用户上传的视频文件,并对其进行转码以适应不同设备的播放需求,是提升用户体验的关键。本文将围绕使用Spring Boot结合Redis队列技术来实现视频文件上传及FFmpeg转码的过程,分享一系列技术干货。
722 4
|
编解码 Linux
CentOS安装ffmpeg并转码视频为mp4
CentOS安装ffmpeg并转码视频为mp4
371 0
|
10月前
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
2613 6
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的反诈视频宣传系统
基于Java+Springboot+Vue开发的反诈视频宣传系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的反诈视频宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
212 4
基于Java+Springboot+Vue开发的反诈视频宣传系统
|
11月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
951 1
|
11月前
|
计算机视觉 Python
FFMPEG学习笔记(一): 提取视频的纯音频及无声视频
本文介绍了如何使用FFmpeg工具从视频中提取纯音频和无声视频。提供了具体的命令行操作,例如使用`ffmpeg -i input.mp4 -vn -c:a libmp3lame output.mp3`来提取音频,以及`ffmpeg -i input.mp4 -c:v copy -an output.mp4`来提取无声视频。此外,还包含了一个Python脚本,用于批量处理视频文件,自动提取音频和生成无声视频。
896 1
|
11月前
FFmpeg学习笔记(二):多线程rtsp推流和ffplay拉流操作,并储存为多路avi格式的视频
这篇博客主要介绍了如何使用FFmpeg进行多线程RTSP推流和ffplay拉流操作,以及如何将视频流保存为多路AVI格式的视频文件。
1076 0
java实现视频和配音音频的合成
java实现视频和配音音频的合成
333 0

热门文章

最新文章