FFmpeg是一个非常好用的视频处理工具,下面讲讲如何在java中使用该工具类。

一、首先,让我们来认识一下FFmpeg在Dos界面的常见操作

1.拷贝视频,并指定新的视频的名字以及格式

ffmpeg.exe -i old.mp4 new.avi

2.将视频和音频结合,并指定视频的长度(7秒),同时生成结合之后的视频文件

ffmpeg.exe -i tsd.mp4 -i "周笔畅+-+最美的期待.mp3" -t 7 -y new.avi

3.使用ffmpg生成视频截图(对第一秒的画面作为截图)-vframes表示帧数

ffmpeg.exe -ss 00:00:01 -y -i 视频.mp4 -vframes 1 new.jpg

二、在java中使用FFmpeg

引入 FFMpegUtil工具类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List; /**
* FFMPEG 的相关操作
*
* @author Administrator
*/
public class FFMpegUtil { //Windows下 ffmpeg.exe的路径
// private static String ffmpegEXE = "D:\\Downloads\\ffmpeg-20180528-ebf85d3-win64-static\\bin\\ffmpeg.exe";
//Linux与mac下 ffmpeg的路径
private static String ffmpegEXE = "/developer/ffmpeg-4.0/bin/ffmpeg"; /**
* @param videoInputPath 视频的输入路径
* @param videoOutPath 视频的输出路径
* @throws Exception
*/
// 拷贝视频,并指定新的视频的名字以及格式
// ffmpeg.exe -i old.mp4 new.avi
public static void convetor(String videoInputPath, String videoOutPath) throws Exception { List<String> command = new ArrayList<String>();
command.add(ffmpegEXE);
command.add("-i");
command.add(videoInputPath);
command.add(videoOutPath);
ProcessBuilder builder = new ProcessBuilder(command);
Process process = null;
try {
process = builder.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理
InputStream errorStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
BufferedReader br = new BufferedReader(inputStreamReader); String line = "";
while ((line = br.readLine()) != null) {
}
if (br != null) {
br.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (errorStream != null) {
errorStream.close();
} } /**
* @param videoInputPath 原视频的路径
* @param audioInputPath 音频的路径
* @param videoOutPath 视频与音频结合之后的视频的路径
* @param time 视频的长度 ,单位为 s
* @throws Exception
*/
// 将视频和音频结合,并指定视频的长度,同时生成结合之后的视频文件
// ffmpeg.exe -i tsd.mp4 -i "周笔畅+-+最美的期待.mp3" -t 7 -y new.avi
public static void convetor(String videoInputPath, String audioInputPath, String videoOutPath, double time)
throws Exception { List<String> command = new ArrayList<String>();
command.add(ffmpegEXE);
command.add("-i");
command.add(videoInputPath);
command.add("-i");
command.add(audioInputPath);
command.add("-t");
command.add(String.valueOf(time));
command.add("-y");
command.add(videoOutPath);
ProcessBuilder builder = new ProcessBuilder(command);
Process process = null;
try {
process = builder.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理
InputStream errorStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
BufferedReader br = new BufferedReader(inputStreamReader); String line = "";
while ((line = br.readLine()) != null) {
}
if (br != null) {
br.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (errorStream != null) {
errorStream.close();
} } /**
* @param time_coverimg 视频的第几秒作为封面图
* @param videoInputPath 视频的路径
* @param frame 帧数
* @param coverOutputPath 视频的封面图的路径
* @throws Exception
*/
// ffmpeg.exe -ss 00:00:01 -y -i 视频.mp4 -vframes 1 new.jpg
public static void convetor(String time_coverimg, String videoInputPath, int frame, String coverOutputPath)
throws Exception { List<String> command = new ArrayList<String>();
command.add(ffmpegEXE);
command.add("-ss");
command.add(time_coverimg);
command.add("-y");
command.add("-i");
command.add(videoInputPath);
command.add("-vframes");
command.add(String.valueOf(frame));
command.add(coverOutputPath);
ProcessBuilder builder = new ProcessBuilder(command);
Process process = null;
try {
process = builder.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 使用这种方式会在瞬间大量消耗CPU和内存等系统资源,所以这里我们需要对流进行处理
InputStream errorStream = process.getErrorStream();
InputStreamReader inputStreamReader = new InputStreamReader(errorStream);
BufferedReader br = new BufferedReader(inputStreamReader); String line = "";
while ((line = br.readLine()) != null) {
}
if (br != null) {
br.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (errorStream != null) {
errorStream.close();
} } // public static void main(String[] args) {
// String videoInputPath = "G:/videos-resources/180525DFH9X09GR4/video/2018052920010792217.mp4";
// String coverOutputPath = "G:/videos-resources/180525DFH9X09GR4/video/2018052920014289695.jpg";
// try {
// convetor("00:00:01", videoInputPath, 1, coverOutputPath);
// } catch (Exception e) {// e.printStackTrace();
// }
// }
}
==============================================================================================

该工具类其实是通过java来运行Dos界面的命令,有了这个工具类,我们就可以调用该类中的convetor来应对不同的需求,当然,这里只介绍了FFmpeg中的部分功能,如果你想在java中使用FFmpeg的其他功能也很简单,请参考该类,继续重载该类中的convetor方法,将dos界面的命令搬到该类中来运行即可。

在java中使用FFmpeg处理视频与音频的更多相关文章

  1. Java Web 中使用ffmpeg实现视频转码、视频截图

    Java Web 中使用ffmpeg实现视频转码.视频截图 转载自:[ http://www.cnblogs.com/dennisit/archive/2013/02/16/2913287.html  ...

  2. Java 在Word中嵌入多媒体(视频、音频)文件

    Word中可将Office(Word/Excel/PowerPoint).PDF.txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体 ...

  3. 使用FFmpeg进行视频抽取音频,之后进行语音识别转为文字

    1.首先需要下载FFmpeg: 2.Gradle依赖 def void forceVersion(details, group, version) { if (details.requested.gr ...

  4. C# / VB.NET 在Word中嵌入多媒体(视频、音频)文件

    Word中可将Office(Word/Excel/PowerPoint).PDF.txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体 ...

  5. 用java程序调用ffmpeg执行视频文件格式转换flv

    用java小例题说明更直观:(可以直接编译运行)环境我在windows平台下测试的...需要在e:/下有ffmpeg.exe;mencoder.exe;drv43260.dll;pncrt.dll共4 ...

  6. 在java中使用ffmpeg将amr格式的语音转为mp3格式

    ffmpeg是一个非常强大的音视频处理工具,官网是:http://ffmpeg.org/. 由于ffmpeg在windows上和linux系统上的执行文件不一样(Windows上不需要安装ffmpeg ...

  7. C#中使用ffmpeg合并视频

    首先将最新的ffmpeg.exe放到debug路径下,下载地址 http://www.ffmpeg.org/download.html 然后调用此方法 public void CombineMp4Wi ...

  8. springboot中配置addResourceHandler和addResourceLocations,使得可以从磁盘中读取图片、视频、音频等

    磁盘目录 WebMvcConfig的代码 //对静态资源的配置 @Override public void addResourceHandlers(ResourceHandlerRegistry re ...

  9. FFmpeg在JAVA中的使用以及Process.waitFor()引发的阻塞问题

    此文已由作者叶海啸授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. FFmpeg是一个开源免费跨平台的视频和音频流方案,可以快速对音视频流进行多方面的处理,本文主要介绍FFmp ...

随机推荐

  1. 调用window Api 进行对特定窗口的进程ID进行操作

    /// <summary> /// 获取窗口句柄 /// </summary> /// <param name="lpClassName">&l ...

  2. Docker 镜像仓库为什么要分库分权限?

    先说一个事故案例: 场景:某大型互联网电商公司,使用一个镜像仓库管理所有Docker镜像.开发者打出的镜像上传到唯一的镜像库,测试通过后,运维环境的 Kubernetes 直接从这个库里拉取镜像,所有 ...

  3. redux基础概念及执行流程详解

    一.执行流程 全局有一个公共的容器(所有组件都可以操作),我们可以在某个组件中把全局容器中的信息进行修改,而只要全局信息修改,就可以通知所有用到该信息的组件重新渲染(类似于发布订阅)==>red ...

  4. 二叉堆(1)BinaryHeap

    封装一个简单二叉堆,亦可视为优先队列. 测试文件 main.cpp: #include <iostream> #include "BinaryHeap.h" using ...

  5. MySQL启动失败故障思路

    1.1 查看 日志 默认路径在数据路径下,以当前主机名加上.err命名 如主机名为tz,数据路径为/mnt/mysql_data目录下 日志文件为tz.err [root@tz mysql_data] ...

  6. mysql 基础sql语法总结 (二)DML

    二.DML(增.删.改) 1)插入数据 第一种写法:INSERT INTO 表名 (列名1,列名2,,......)VALUES(列值1,列值2,......) 第二种写法:INSERT INTO 表 ...

  7. mysql-使用存储过程创建大批量数据

    参考:https://www.iteye.com/blog/825635381-2161290 场景1.创建1万个table,每个table种插入1条记录 DELIMITER $$ CREATE DA ...

  8. django学习 session保持登录,且登出

    学一点记一点 刚刚进来的时候突然发现,博客园的主页在缩小的时候会发生一些挤压,有点意思 今天刚看了session,感觉之前太迷茫,把问题想得过于复杂了. 我这个是建立在有登录和注册的功能上的演示. 首 ...

  9. mybatis-plus - insert

    一. insert 首先看一下 insert.java 的代码: /** * <p> * 根据 ID 删除 * </p> * * @author hubin * @since ...

  10. Joining Data with dplyr in R

    目录 inner_join Joining three tables left_join right-join full_join semi- and anti-join Stack Overflow ...