Java调用FFmpeg

Java调用FFmpeg

  • 1、FFmepg基础知识
    • 1.1 下载 FFmpeg
    • 1.2 FFmpeg 工具使用
  • 2、Java使用
    • 2.1 FFmpeg源码编译
    • 2.2 Java集成FFmpeg
      • 2.2.1 JNI
      • 2.2.2 Java调用执行 FFmpeg 工具 命令

1、FFmepg基础知识

About FFmpeg
ffmpeg(计算机程序) - 百度百科
FFmpeg/FFmpeg - GitHub
CSDN:FFmpeg 基础知识 @在奋斗的大道

关于FFmpeg
FFmpeg是领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤和播放几乎任何东西 人类和机器创造的。它支持最晦涩的 古老的格式直到最前沿。不管他们是不是 由一些标准委员会,社区或公司设计。是的 而且高度可移植:FFmpeg 编译、运行并通过我们的测试基础设施 FATE 跨 Linux、Mac OS X、 Microsoft Windows,BSD,Solaris等在各种各样的构建下 环境、计算机体系结构和配置。

它包含libavcodeclibavutillibavformatlibavfilterlibavdevicelibswscalelibswresample 可供应用程序使用。 以及ffmpeg,ffplay和ffprobe,可用于 最终用户进行转码和播放。

FFmpeg项目试图提供最好的技术可能 适用于应用程序开发人员和最终用户的解决方案。要实现 我们结合了可用的最佳免费软件选项。我们稍微 支持我们自己的代码,以保持对其他库的依赖较低,并 最大化 FFmpeg 各部分之间的代码共享。 凡是“最好”的问题无法回答的地方,我们都支持两者 选项,以便最终用户可以选择。

FFmpeg 欢迎所有人,也欢迎所有贡献。 我们很高兴收到补丁,拉取请求,错误报告,捐赠 或任何其他类型的贡献。

安全性是重中之重,代码审查始终使用 牢记安全性。虽然由于大量的代码接触 不受信任的数据安全问题是不可避免的,因此我们提供 在以下情况下尽快更新到我们上一个稳定版本 发现新的安全问题。


FFmpeg 工具

  • FFMPEG 用于转换多媒体文件的 命令行工具 格式之间
  • ffplay 基于 SDL 和 FFmpeg 库的简单媒体播放器
  • FF探针 一个简单的多媒体流分析仪

面向开发人员的 FFmpeg 库

  • libavutil 是一个包含函数的库 简化编程,包括随机数生成器、数据 结构、数学例程、核心多媒体实用程序等等 更多。
  • libavcodec是一个包含解码器和编码器的库 用于音频/视频编解码器。
  • libavformat 是一个包含解复用器和 用于多媒体容器格式的复用器。
  • libavdevice 是一个包含输入和输出的库 用于抓取和渲染许多常见多媒体的设备 输入/输出软件框架,包括Video4Linux,Video4Linux2, VfW和ALSA。
  • libavfilter 是一个包含媒体过滤器的库。
  • libswscale 是一个执行高度优化图像的库 缩放和色彩空间/像素格式转换操作。
  • libswresample 是一个执行高度优化的库 音频重新采样、重新矩阵和样本格式转换操作。

1.1 下载 FFmpeg

Download FFmpeg

  • Windows EXE Files:Windows builds from gyan.dev、Windows builds by BtbN
    在这里插入图片描述

  • FFmpeg Source Code:ffmpeg-6.0.tar.xz
    在这里插入图片描述

1.2 FFmpeg 工具使用

  • ffmpeg\bin\ffmpeg.exe
命令说明
ffmpeg -i input.avi查询视频信息
ffmpeg -i input.avi -hide_banner查询只显示视频信息
ffmpeg -i input.avi output.mp4通过重新编码媒体流,将输入媒体文件转换为其他格式
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4将输出文件的视频比特率设置为 64 kbit/s
ffmpeg -i input.avi -r 24 output.mp4强制输出文件的帧速率为 24 fps
ffmpeg -r 1 -i input.m2v -r 24 output.mp4强制输入文件的帧速率(仅对原始格式有效)为 1 fps,并且 输出文件的帧速率为 24 fps
  • ffmpeg\bin\ffplay.exe
命令说明
ffplay -i input.avi读取视频input.avi。不会自动退出,原比例播放
ffplay -autoexit input.avi视频播放完毕后退出。
ffplay -x 600 -y 800 input.avi600x800播放
  • ffmpeg\bin\ffprobe.exe
命令说明
ffprobe input.avi -hide_banner显示视频信息
ffprobe input.avi -hide_banner -show_format显示有关输入多媒体的容器格式的信息
ffprobe input.avi -hide_banner -show_format -print_format json以json数据显示有关输入多媒体的容器格式的信息

2、Java使用

2.1 FFmpeg源码编译

Windows下编译FFmpeg - 知乎
Windows编译和使用ffmpeg

2.2 Java集成FFmpeg

2.2.1 JNI

Java版流媒体编解码和图像处理(JavaCPP+FFmpeg)
Javacv使用ffmpeg实现音视频同步播放

Java通过JNI调用FFmpeg的c语言,Window上需要FFmpeg相应的.dll文件,Linux上需要FFmpeg相应的.so文件

2.2.2 Java调用执行 FFmpeg 工具 命令

Java执行命令方法:
java/lang/Runtime.java
java/lang/ProcessBuilder.java

 // 执行命令Process process = Runtime.getRuntime().exec("cmd /c dir /b");// 获取命令输出结果BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {XLog.d(line);}// 等待命令执行完成process.waitFor();

在这里插入图片描述

Java通过流获取命令输出结果可能会存在缓存的问题。当使用Java通过Runtime.getRuntime().exec等方法执行指令时,命令本身的输出结果是通过标准输出流(stdout)和标准错误流(stderr)来输出的。而Java读取输出结果的方式是通过获取进程的标准输出流/标准错误流来进行读取的。但当命令输出比较多时,标准输出流和标准错误流会同时存在一定大小的缓存区,如果Java读取不及时,就可能无法获取到完整的输出结果。解决该问题可以采用多线程读取和行缓冲。即为程序开启一个线程去读取进程输出,每读取一行即将其写入缓冲中。这样就能解决输出结果获取不到的问题。

  • 配置ffmpeg环境变量,命令找到ffmpeg程序
    1、IOUtils使用apache的commons-io库
    2、XLog使用Logger:Java原生日志工具
String osname = System.getProperty("os.name").toLowerCase();
XLog.d("osname = " + osname);
String cmd = osname.contains("windows") ? "where.exe ffmpeg" : "which ffmpeg";Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();String ffmpeg = IOUtils.toString(p.getInputStream(), Charset.defaultCharset()).trim();XLog.d(ffmpeg);

在这里插入图片描述

  • 调用ffmpeg -i input.avi -hide_banner:这里配置了环境变量,如ffmpeg\bin

在这里插入图片描述

Process process = Runtime.getRuntime().exec("ffmpeg -i C:\\Users\\Administrator\\Desktop\\input.avi -hide_banner");
process.waitFor();
String ffmpegGetInputStream = IOUtils.toString(process.getInputStream(), Charset.defaultCharset()).trim();
String ffmpegGetErrorStream = IOUtils.toString(process.getErrorStream(), Charset.defaultCharset()).trim();XLog.d("ffmpegGetInputStream: "+ffmpegGetInputStream);
XLog.d("ffmpegGetErrorStream: "+ffmpegGetErrorStream);
String osname = System.getProperty("os.name").toLowerCase();
XLog.d("osname = " + osname);
String cmd = osname.contains("windows") ? "where.exe ffmpeg" : "which ffmpeg";
Process p = Runtime.getRuntime().exec(cmd);
p.waitFor();
String ffmpeg = IOUtils.toString(p.getInputStream(), Charset.defaultCharset()).trim();
XLog.d(ffmpeg);String[] cmdarray = new String[]{ffmpeg, "-i", "C:\\Users\\Administrator\\Desktop\\input.avi", "-hide_banner"};
Process process = Runtime.getRuntime().exec(cmdarray);
process.waitFor();
String ffmpegGetInputStream = IOUtils.toString(process.getInputStream(), Charset.defaultCharset()).trim();
String ffmpegGetErrorStream = IOUtils.toString(process.getErrorStream(), Charset.defaultCharset()).trim();
XLog.d("ffmpegGetInputStream: "+ffmpegGetInputStream);
XLog.d("ffmpegGetErrorStream: "+ffmpegGetErrorStream);

1> 这里比较奇怪,输出结果在process.getErrorStream()获取
2> 可以研究一下ProcessBuilder:Java ProcessBuilder类源码分析(开发“Java命令执行器”前期准备)
3> 建议使用线程池ExecutorService、Executors

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POI报表的高级应用

POI报表的高级应用 掌握基于模板打印的POI报表导出理解自定义工具类的执行流程 熟练使用SXSSFWorkbook完成百万数据报表打印理解基于事件驱动的POI报表导入 模板打印 概述 自定义生成Excel报表文件还是有很多不尽如意的地方,特别是针对复杂报表头,单…

解决react样式组合时css module动态样式失效的问题

现象&#xff1a; <button disabled{invalid} className{ "btn btn-primary btn-lg" invalid ? styles.btnDisabled : "" } > 注册 </button> 上面采用字符串拼接的方式&#xff0c;组合class&#xff0c;但是css module的动态样式style…

Bootstrap的导航菜单组件相关知识

目录 01-最基本的导航示例02-设置导航的对齐方式02-1-设置导航在水平方向上的对齐方式 02-2-设置导航在垂直方向上进行布局03-设计标签页导航04-带下拉菜单的标签页导航05-设计胶囊式导航05-1-基本的胶囊式导航05-2-带下拉菜单的胶囊式导航 06-让导航菜单项可以切换(激活导航菜…

LuatOS-SOC接口文档(air780E)-- iconv - iconv操作

iconv.open(tocode, fromcode)# 打开相应字符编码转换函数 参数 传入值类型 解释 string 释义&#xff1a;目标编码格式 取值&#xff1a;gb2312/ucs2/ucs2be/utf8 string 释义&#xff1a;源编码格式 取值&#xff1a;gb2312/ucs2/ucs2be/utf8 返回值 返回值类型 解…

发布npm包质量分测试

查询质量分接口 https://registry.npmjs.org/-/v1/search?textcanvas-plus v0.0.1 quality 0.2987 新建文件夹 canvas-plus 执行命令 npm init 生成package.json {"name": "3r/canvas-plus","version": "0.0.1","descript…

深入理解 Python 虚拟机:协程初探——不过是生成器而已

深入理解 Python 虚拟机&#xff1a;协程初探——不过是生成器而已 在 Python 3.4 Python 引入了一个非常有用的特性——协程&#xff0c;在后续的 Python 版本当中不断的进行优化和改进&#xff0c;引入了新的 await 和 async 语法。在本篇文章当中我们将详细介绍一下 Python…

NewStarCTF2023week2-Unserialize?

代码审计&#xff1a; 定义了一个eval类&#xff0c;该类下有一个私有变量cmd和公有成员函数destruct()&#xff0c;该函数在对象的所有引用都被删除或类被销毁时会自动调用&#xff1b; 调用该函数则会执行一个正则表达式进行正则匹配&#xff0c;过滤掉了一些常用命令和bas…

周记之学习总结

你在人群中看到的每一个耀眼的女孩&#xff0c;都是踩着刀尖过来的。你如履平地般地舒适坦然&#xff0c;当然不配拥有任何光芒&#xff1b; 10.11-10.12 思来想去还是不舍得&#xff0c;搞了一下这个jwt&#xff0c;看了很多视频和博客&#xff0c;一直没看懂&#xff0c;两…

pytorch 模型部署之Libtorch

Python端生成pt模型文件 net.load(model_path) net.eval() net.to("cuda")example_input torch.rand(1, 3, 240, 320).to("cuda") traced_model torch.jit.trace(net, example_input) traced_model.save("model.pt")output traced_model(exa…

没有前端如何测试后端跨域问题

一、问题 前段时间对项目中的跨域做了相关的处理&#xff0c;网上有很多跨域的解决方案。前端解决&#xff0c;后端解决&#xff0c;nginx代理解决。我采用的是在后端中使用Cors来解决跨域的问题。但是前端项目还没有搭建起来&#xff0c;并不知道Cors的解决方案是否会生效&am…

深度学习-AlexNet论文精读

论文相对于博文是第一手资料&#xff0c;并且如果研究的东西比较前沿是搜不到相关的博文。谷歌学术论文名&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks。论文下载论文阅读 一篇论文读三遍&#xff0c;不一定需要读完。第一遍读题目&#xff0…

Potato靶机

信息搜集 设备发现 扫描端口 综合扫描 开放了80端口的HTTP服务和7120端口的SSH服务 目录扫描 扫描目录 看看这个info.php&#xff0c;发现只有php的版本信息&#xff0c;没有可以利用的注入点 SSH突破 hydra 爆破 考虑到 7120 端口是 ssh 服务&#xff0c;尝试利用 hydra …

vue3+vite项目中使用svgIcon

如何在vue2webpack项目中使用svgIcon&#xff1f;参考&#xff1a;手摸手&#xff0c;带你优雅的使用 icon - 掘金 这篇文章主要介绍如何在vue3项目中优雅的使用图标 1、通过 vite-plugin-svg-icons 插件封装SvgIcon组件 npm i vite-plugin-svg-icons -D 2、配置 vite.conf…

机器学习在工业机器人领域有哪些应用?

随着人工智能和机器学习的快速发展&#xff0c;工业机器人领域也迎来了新的机遇和挑战。本文综述了机器学习在工业机器人领域的应用&#xff0c;包括机器人视觉、运动控制、路径规划、故障诊断等方面。通过对相关研究和实际应用的分析&#xff0c;总结了机器学习在工业机器人领…

【C语言】结构体、位段、枚举、联合(共用体)

结构体 结构&#xff1a;一些值的集合&#xff0c;这些值称为成员变量。结构体的每个成员可以是不同类型的变量&#xff1b; 结构体声明&#xff1a;struct是结构体关键字&#xff0c;结构体声明不能省略struct&#xff1b; 匿名结构体&#xff1a;只能在声明结构体的时候声…

在pycharm中运行js文件,附加node.js下载步骤

文章目录 一、前言二、node.js安装和配置(如果之前就安装好了可以直接跳过)1、进入官网下载安装包2、在本地安装node.js3、环境配置4、验证是否安装成功5、修改下载位置(默认是在c盘&#xff0c;这个根据个人需求)6、设置默认模块包7、测试一下是否修改成功(要进入管理员模式的…

11 | JpaRepository 如何自定义

EntityManager 介绍 Java Persistence API 规定&#xff0c;操作数据库实体必须要通过 EntityManager 进行&#xff0c;而我们前面看到了所有的 Repository 在 JPA 里面的实现类是 SimpleJpaRepository&#xff0c;它在真正操作实体的时候都是调用 EntityManager 里面的方法。…

云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露

文章目录 云原生-K8s安全-etcd未授权访问云原生-K8s安全-Dashboard未授权访问云原生-K8s安全-Configfile鉴权文件泄漏云原生-K8s安全-Kubectl Proxy不安全配置 云原生-K8s安全-etcd未授权访问 攻击2379端口&#xff1a;默认通过证书认证&#xff0c;主要存放节点的数据&#x…

升级包版本之后Reflections反射包在springboot jar环境下扫描不到class排查过程记录

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

LeetCode 1 两数之和

题目描述 链接&#xff1a;https://leetcode.cn/problems/two-sum/?envTypefeatured-list&envId2ckc81c?envTypefeatured-list&envId2ckc81c 难度&#xff1a;简单 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 targ…