Java调用FFmpeg

这篇具有很好参考价值的文章主要介绍了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
    java ffmpeg调用,Java,Java,FFmpeg

  • FFmpeg Source Code:ffmpeg-6.0.tar.xz
    java ffmpeg调用,Java,Java,FFmpeg

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.avi 600x800播放
  • 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执行命令方法: ( 工具类:org.apache.commons:commons-exec )
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 ffmpeg调用,Java,Java,FFmpeg

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);

java ffmpeg调用,Java,Java,FFmpeg

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

java ffmpeg调用,Java,Java,FFmpeg

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文章来源地址https://www.toymoban.com/news/detail-762551.html

到了这里,关于Java调用FFmpeg的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个小脚本,python调用ffmpeg 批量快速旋转视频

    输入的旋转角度为逆时针角度,如果要顺时针旋转90度,输入270即可 路径为存放视频的根目录,会自动遍历并旋转,生成后缀+01的新文件 目录内尽量不要存在非视频文件,非视频文件处理后可能会损坏.

    2024年02月16日
    浏览(61)
  • win10系统下ffmpeg的安装配置与Python调用

    ffmpeg是一个用来对数字音频/视频进行转换的开源程序。其支持文件类型较多,有GUI界面单独操作,或通过命令行调用。 在深度学习中,往往采用ffmpeg来打开/读取音频文件,以作为样本。 目前网上的资料大体是多媒体从业者以ffmpeg单独操作为前提的安装配置,而python中如何调

    2023年04月09日
    浏览(33)
  • c++调用ffmpeg api将视频文件内容进行udp推流

    代码及工程见https://download.csdn.net/download/daqinzl/88156926 开发工具:visual studio 2019 播放,采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://238.1.1.10:6016 主要代码如下: #include \\\"pch.h\\\" #include iostream using namespace std; #include stdio.h #define __STDC_CONSTANT_MACROS extern \\\"C\\\" { #include \\\"include/libavcodec/

    2024年02月14日
    浏览(39)
  • c++调用ffmpeg api录屏 并进行udp组播推流

    代码及工程见https://download.csdn.net/download/daqinzl/88155241 开发工具:visual studio 2019 播放,采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://224.1.1.1:5001 主要代码如下: #include \\\"pch.h\\\" #include iostream using namespace std; #include stdio.h #define __STDC_CONSTANT_MACROS extern \\\"C\\\" { #include \\\"include/libavcodec/

    2024年02月14日
    浏览(41)
  • linux下ffmpeg调用GPU硬件解码(VDPAU/VAAPI)保存文件

    本文讲解在linux下面,如何通过ffmpeg调用GPU硬件解码,并保存解码完的yuv文件。 其实,ffmpeg自带的例子hw_decode.c这个文件,就已经能满足要求了,因此,本文就尝试讲解以下hw_decode这个例子。hw_decode.c可以调用VDPAU硬件解码,也可以调用VAAPI硬件解码,下面依次讲解如何进行操

    2024年02月19日
    浏览(49)
  • 使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

    1、打开cmd,执行 chcp 65001 ,修改cmd的编码格式为utf8,避免乱码 2、执行指令 ffmpeg -list_devices true -f dshow -i dummy ,查看当前window的音频和视频名称 3、打开windows系统的\\\"打开声音设置\\\"–“麦克风隐私设置”–\\\"允许应用访问你的麦克风\\\"点击开启 录制视频: 录制音频: 录制音视频:

    2024年02月04日
    浏览(56)
  • RK3588实战:调用npu加速,yolov5识别图像、ffmpeg发送到rtmp服务器

    前言:最近在学习一些rk3588相关的东西,趁着这个项目,把学习的相关东西整合下,放到一个项目里面,巩固学习的知识。 项目名称:yolov5识别图像、ffmpeg发送到rtmp服务器 功能:1、opencv读取usb摄像头,使用RK3588自带的NPU推理yolov5s算法,识别图像            2、使用ffmpeg,

    2024年02月03日
    浏览(43)
  • ffmpeg使用及java操作

    官网: FFmpeg 官方使用文档: ffmpeg Documentation 中文简介: https://www.cnblogs.com/leisure_chn/p/10297002.html 函数及时间: ffmpeg日记1011-过滤器-语法高阶,逻辑,函数使用_ffmpeg gte(t,2)-CSDN博客 java集成ffmpeg: SpringBoot集成ffmpeg实现视频转码播放_jave-all-deps-CSDN博客          maven依赖,使用集成

    2024年01月23日
    浏览(27)
  • java ffmpeg获取视频时长

    nacos里面配置的ffmpegPath,如果不用这个,也可以自己写一个ffmpegPath的地址 代码

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包