Java调用FFmpeg

news2024/11/20 23:18:01

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.coloradmin.cn/o/1094574.html

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

相关文章

接口测试如何测?最全的接口测试总结,资深测试老鸟整理...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、接口测试的流程…

软件工程与计算总结(十三)详细设计中的模块化与信息隐藏

一.模块化与信息隐藏思想 1.设计质量 好的设计要着重满足以下3方面:可管理性、灵活性、可理解性好的设计需要侧重于间接性和可观察性——简洁性使得系统模块易于管理(理解和分解)、开发(修改与调试)和复用。实践者都…

基于适应度相关优化的BP神经网络(分类应用) - 附代码

基于适应度相关优化的BP神经网络(分类应用) - 附代码 文章目录 基于适应度相关优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.适应度相关优化BP神经网络3.1 BP神经网络参数设置3.2 适应度相关算法应用 4…

【软考】9.2 串/数组/矩阵/广义表/树

《字符串》 一种特殊的线性表,数据元素都为字符模式匹配:寻找子串第一次在主串出现的位置 模式匹配算法 1. 暴力破解法(布鲁特-福斯算法) 主串与子串一个个匹配效率低 2. KMP算法 主串后缀和子串前缀能否找到一样的元素&#xf…

轻量化Backbone | ShuffleNet+ViT结合让ViT也能有ShuffleNet轻量化的优秀能力

视觉Transformer(ViTs)在各种计算机视觉任务中表现出卓越的性能。然而,高计算复杂性阻碍了ViTs在内存和计算资源有限的设备上的适用性。尽管某些研究已经深入探讨了卷积层与自注意力机制的融合,以增强ViTs的效率,但在纯…

KOSMOS系列

Overview 总览摘要1 引言2 KOSMOS-2.52.1 Model Architecture2.1 Image and Text Representations2.3 Pre-training Data2.4 Data Processing2.5 Filtering and Quality Control 3 Experiments3.1 Evaluation3.2 Implementation Details3.3 Results3.4 Discussion 4 Related Wo…

车载多源融合定位

终端硬件由两部分组成,组合导航处理板和地磁导航处理板。 组合导航处理板负责采集加速度计、陀螺、GNSS和轮速计等数据进行组合导航解算,差分数据通过6Q主板获取到后通过串口发送至组合导航处理板。地磁导航处理板负责地磁数据采集,保存至数…

嵌入式实时操作系统的设计与开发 (启动过程学习)

b Reset; b Undef; b SWI; b PreAbort; b DataAbort; b . ;保留 b IRQ; b FIQ;建立异常向量表的过程,其中第一个指令通常都是存放在主存的零地址的。 异常向量表存放的全是汇编跳转指令,这些指令从主存的零地址(0x0)开始连续存储在…

Ubuntu下vscode dotNet downloading的问题(Cmake代码高亮)

问题描述:使用Cmake Language Support插件需要安装dotnet的支持库,我原本已经使用apt的方式安装了,但是进入vscode依旧要我下载。尝试按网上的方法修改为我指定的路径: "dotnetAcquisitionExtension.existingDotnetPath&quo…

Vsftp安装配置(超详细版)

目录 1 FTP、Vsftp介绍 1.1 FTP介绍 1.2 Vsftp介绍 1.3 Vsftp的登录类型 2 Vsftp安装配置 2.1 更换源 2.2 安装epel源 2.3 安装Vsftpd及相关依赖 2.4 vsftpd配置文件说明 2.5 vsftpd 配置详解 2.6 备份配置文件 3 vsftpd 配置匿名用户 3.1 编辑配置文件 3.2 常用的匿名FTP配置…

传输层 | UDP协议、TCP协议

之前讲过的http与https都是应用层协议,当应用层协议将报文构建好之后就要将报文往下层传输层进行传递,而传输层就是负责将数据能够从发送端传到接收端。 再谈端口号 端口号(port)标识了一个主机上进行通信的不同的应用程序,在TCP/IP协议中&…

让你的服务器变成游戏世界:打造游戏化在线社区的“秘诀”

引言 假如我有一台服务器,我希望打造一款游戏化的在线社区。那么,如何打造这样一个社区程序并成功运营呢?让我们一起来畅想吧! 一、确定社区的主题和目标群体 打造一款游戏化的在线社区,首先,我们需要明确…

【Android 性能优化:内存篇】——WebView 内存泄露治理

背景:笔者在公司项目中优化内存泄露时发现WebView 相关的内存泄露问题非常经典,一个 Fragment 页面使用的 WebView 有多条泄露路径,故记录下。 Fragment、Activity 使用WebView不释放 项目中一个Fragment 使用 Webview,在 Fragm…

区块链(12):java区块链项目之集群部署

选择3台服务器进行区块链项目部署 1 nginx部署页面 1.1 部署静态页面 1.2 nginx 反向代理的配置 修改nginx.conf文件 nginx 默认端口是http 80或者https443 将80代理到8080 location /blockchain {proxy_pass http://localhost:8080/blockchain;proxy_redirect default; …

深度学习-卷积神经网络

文章目录 应用卷积神经网络卷积处理分类问题 应用 图片分类图片检索图片分割图片风格迁移姿态估计OCR等 卷积神经网络 核概念计算机视觉中处理图片的核大小是通过经验得来的,而深度学习中的权重大小是自己学习出的。卷积VS神经网络:一个是局部观察一个…

进阶JAVA篇- LocalDate 类与 LocalTime 类、LocalDateTime 类的常用API(六)

目录 API 1.0 LocalDate 类与 LocalTime 类、LocalDateTime 类的API说明 1.1 如何创建LocalDate 类与 LocalTime 类、LocalDateTime 类的对象 1.2 LocalDate 类与 LocalTime 类、LocalDateTime 类中的以 get 开头实例方法 1.3 LocalDateTime 类中的 toLocalDat…

【Android】VirtualDisplay创建流程及原理

Android VirtualDisplay创建流程及原理 Android DisplayManager提供了createVirtualDisplay接口,用于创建虚拟屏。虚拟屏可用于录屏(网上很多资料说这个功能),分屏幕(比如一块很长的屏幕,通过虚拟屏分出不…

Windows服务器安装php+mysql环境的经验分享

php mysql环境 下载IIS Php Mysql环境集成包,集成包下载地址: 1、Windows Server 2008 一键安装Web环境包 x64 适用64位操作系统服务器:下载地址:链接: https://pan.baidu.com/s/1MMOOLGll4D7Eb5tBrdTQZw 提取码: btnx 2、Windows Server 2008 一键安装Web环境包 32 适…

【开篇】汇编语言之基础知识篇

文章目录 📋前言一. ⛳️机器语言二. ⛳️汇编语言的产生三. ⛳️汇编语言的组成四. ⛳️存储器五. ⛳️指令和数据六. ⛳️存储单元七. ⛳️CPU 对存储器的读写7.1 地址总线7.2 数据总线7.3 控制总线 📝总结 📋前言 🏠 个人主页&…

OOA/D 时统一过程(UP)中的 迭代、 进化 和 敏捷

一、迭代和进化式开发的优势 相对于顺序或“瀑布”软件开发模型,迭代和进化式开发(iterative and evolutionary development )对部分系统及早地引入了编程和测试,并重复这一循环。这种方式通常会还没有详细定义所有需求的情况下假…