package com.jzero.upload;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.jzero.util.MPrint;
import com.jzero.util.MRecord;
public class MFFmpeg {
private String ffmpegPath;
private static final String FILE_SEPARATOR = File.separator;
public static MFFmpeg self = new MFFmpeg();
private MFFmpeg() {
}
public static MFFmpeg me() {
return self;
}
public MFFmpeg init(String path) {
this.ffmpegPath = path;
return this;
}
private static boolean isSurpportedType(String type) {
Pattern pattern = Pattern.compile(
"(asx|asf|mpg|wmv|3gp|mp4|mov|avi|flv){1}$",
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(type);
return matcher.find();
}
/**
*
* @param sourceFile
* 将要被转换的目标文件
* @param desctination
* 转换之后文件的存放路径 ffmpeg commandLine: ffmpeg -y -i
* /usr/local/bin/lh.mp4 -ab 56 -ar 22050 -b 500 -s 320x240
* /usr/local/bin/lh.flv
* @throws IOException
*/
public MRecord converToFlv(File sourceFile, String destination) {
String fileName = sourceFile.getName();
String surffix = fileName.substring(fileName.lastIndexOf(".") + 1);
if (!isSurpportedType(surffix))
throw new RuntimeException("unsurpported file type " + surffix);
List<String> cmdParam = new LinkedList<String>();
cmdParam.add(ffmpegPath);
cmdParam.add("-y");
cmdParam.add("-i");
cmdParam.add(sourceFile.getAbsolutePath());
cmdParam.add("-ab");
cmdParam.add("56");
cmdParam.add("-ar");
cmdParam.add("22050");
cmdParam.add("-b");
cmdParam.add("500");
cmdParam.add("-s");
cmdParam.add("320*240");
cmdParam.add(destination + FILE_SEPARATOR
+ fileName.substring(0, fileName.lastIndexOf(".")) + ".flv");
return execCmd(cmdParam);
}
/**
*
* 获取图片的第一帧 ffmpeg commandLine: ffmpeg -y -i /usr/local/bin/lh.3gp -vframes
* 1 -r 1 -ac 1 -ab 2 -s 320x240 -f image2 /usr/local/bin/lh.jpg
*
* @param sourceFile
* 源文件
* @param destination
* 目标文件
* @param surfix
* 要保存的图片格式:jpg,jpeg,gif
* @throws IOException
* @throws IOException
*/
public MRecord captureFirstFrame(File sourceFile, String destination) {
return captureFirstFrame(sourceFile, destination, "jpg");
}
public MRecord captureFirstFrame(File sourceFile, String destination,
String surfix) {
String fileName = sourceFile.getName();
String surffix = fileName.substring(fileName.lastIndexOf(".") + 1);
if (!isSurpportedType(surffix))
throw new RuntimeException("unsurpported file type " + surffix);
List<String> cmd = new LinkedList<String>();
cmd.add(ffmpegPath);
cmd.add("-y");
cmd.add("-i");
cmd.add(sourceFile.getAbsolutePath());
cmd.add("-vframes");
cmd.add("1");
cmd.add("-r");
cmd.add("1");
cmd.add("-ac");
cmd.add("1");
cmd.add("-ab");
cmd.add("2");
cmd.add("-s");
cmd.add("56*56");
cmd.add("-f");
cmd.add("image2");
cmd.add(destination + FILE_SEPARATOR
+ fileName.substring(0, fileName.lastIndexOf(".")) + "."
+ surfix);
return execCmd(cmd);
}
private MRecord execCmd(List<String> cmd) {
MRecord out = null;
final ProcessBuilder pb = new ProcessBuilder();
pb.redirectErrorStream(true);
pb.command(cmd);
try {
final Process p = pb.start();
InputStream in = p.getInputStream();
out = pattInfo(in);
// 开启单独的线程来处理输入和输出流,避免缓冲区满导致线程阻塞.
try {
p.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
p.getErrorStream().close();
} catch (IOException e) {
e.printStackTrace();
}
return out;
}
// 负责从返回信息中读取内容
private String read(InputStream is) {
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
try {
br = new BufferedReader(new InputStreamReader(is), 500);
String line = "";
while ((line = br.readLine()) != null) {
// System.out.println(line);
sb.append(line);
}
br.close();
} catch (Exception e) {
} finally {
try {
if (br != null)
br.close();
} catch (Exception e) {
}
}
return sb.toString();
}
// 负责从返回的内容中解析
/**
* Input #0, avi, from 'c:\join.avi': Duration: 00:00:10.68(时长), start:
* 0.000000(开始时间), bitrate: 166 kb/s(码率) Stream #0:0: Video: msrle
* ([1][0][0][0] / 0x0001)(编码格式), pal8(视频格式), 165x97(分辨率), 33.33 tbr, 33.33
* tbn, 33.33 tbc Metadata: title : AVI6700.tmp.avi Video #1
*/
public MRecord pattInfo(InputStream is) {
String info = read(is);
MRecord out = new MRecord();
String regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s";
Pattern pattern = Pattern.compile(regexDuration);
Matcher m = pattern.matcher(info);
if (m.find()) {
out.set("timelen", getTimelen(m.group(1))).set("begintime", m.group(2)).set(
"kb", m.group(3) + "kb/s");
}
return out;
}
//格式:"00:00:10.68"
private int getTimelen(String timelen){
int min=0;
String strs[] = timelen.split(":");
if (strs[0].compareTo("0") > 0) {
min+=Integer.valueOf(strs[0])*60*60;//秒
}
if(strs[1].compareTo("0")>0){
min+=Integer.valueOf(strs[1])*60;
}
if(strs[2].compareTo("0")>0){
min+=Math.round(Float.valueOf(strs[2]));
}
return min;
}
public static void main(String[] args) {
// String ffmpegPath = "c:/ffmpeg.exe";
// File file = new File("c:/join.avi");
// MFFmpeg.me().init(ffmpegPath).captureFirstFrame(file, "c:/", "jpg");
String t = "00:00:10.68";
String strs[] = t.split(":");
int min=0;
if (strs[0].compareTo("0") > 0) {
min+=Integer.valueOf(strs[0])*60*60;//秒
}
if(strs[1].compareTo("0")>0){
min+=Integer.valueOf(strs[1])*60;
}
if(strs[2].compareTo("0")>0){
min+=Math.round(Float.valueOf(strs[2]));
}
MPrint.print(min);
}
}
分享到:
相关推荐
使用Java语言调用终端开启关闭Nginx服务器,然后执行ffmpeg命令,开启转流推流。以及其它指令,来学习吧
java调用ffmpeg转换视频,并读取转换后视频的分辨率、大小以及时长。主要参考http://blog.sina.com.cn/s/blog_a5116c670102wiwj.html 的代码方式。步骤: 1.研究java如何调用外部程序 2.研究ffmpeg转换视频格式的...
在IT行业中,Java是一种...总结来说,Java调用FFmpeg处理视频涉及到文件上传、FFmpeg命令的构造与执行、视频的转码、时长获取、缩略图生成以及视频片段截取。理解这些知识点对于开发涉及音视频处理的Java应用至关重要。
在Windows环境下,使用Java调用FFmpeg进行视频处理是一项常见的任务,尤其在开发涉及多媒体处理的应用时。FFmpeg是一款强大的跨平台的音频和视频处理工具,而Java则是一种广泛使用的编程语言,它提供了丰富的库来与...
在实际应用中,Java调用FFmpeg进行视频转换时,需要注意以下几点: 1. 文件权限:确保Java程序有读取输入文件和写入输出文件的权限。 2. 并行处理:为了提高转换速度,可以考虑多线程并行处理多个视频文件。 3. 错误...
Java调用FFmpeg转换视频格式为FLV是一个常见的任务,特别是在开发媒体处理应用程序时。FFmpeg是一个强大的跨平台命令行工具,用于处理音频和视频文件,包括转换、编码、解码、分割等操作。在Java中,我们通常通过...
在本文中,我们将深入探讨如何使用Java程序调用FFmpeg执行视频文件格式转换,特别是将非FFmpeg原生支持的格式转换为FLV格式。FFmpeg是一个强大的多媒体处理工具,支持多种视频、音频格式的编码、解码和转换。在这个...
在Java中使用FFmpeg获取视频时长,首先需要安装FFmpeg命令行工具,并将其添加到系统的PATH环境变量中,以便Java程序可以调用。此外,还需要引入一个Java的FFmpeg绑定库,例如`ffmpeg-java`或`fluent-ffmpeg`,这些库...
1. **Java FFmpeg API**:Java调用FFmpeg通常通过JNI(Java Native Interface)或者使用如JAVE(Java Audio Video Encoder)或Xuggler这样的库来实现。这些API允许Java代码直接调用FFmpeg的C/C++接口,使得Java应用...
Java通过调用FFmpeg获取视频时长是利用Java程序调用外部的FFmpeg工具,以执行获取视频文件时长的任务。FFmpeg是一个功能强大的音视频处理工具集,支持各种音视频格式的编解码、转码、录制以及流式传输。它包含了...
这个压缩包文件"java 调用 ffmpeg 进行视频转换以及截图.rar"显然提供了一个解决方案,让我们能够在Java环境中利用`ffmpeg`的功能。 首先,让我们详细了解一下如何在Java中调用`ffmpeg`。这通常涉及到使用Java的`...
java调用ffmpeg添加水印并且转换视频,代码中并没有判断哪些格式支持,那些不支持,mpg,mp4,avi,wmv基本都可以(传入格式),转换为flv avi mp4起码都没问题,其它的没事过ffmpeg是开源的支持的挺多的 补充:时间算错了,...
最简单的java调用FFmpeg转换视频格式为FLV的方法,在win下调用命令提示符。
在Java中调用这个文件时,确保它位于系统的PATH环境变量中,或者直接提供完整路径。 在实际应用中,为了实现更复杂的视频处理任务,如添加水印、裁剪视频、调整分辨率等,可以通过在FFmpeg命令中添加额外的参数。...
Java调用ffmpeg操作视频、视频截图开发工具包-Win 64位版,含所需DLL文件 JAVA视频操作的最常用工具包的Windows环境开发运行库,支持在Windows下java调用ffmpeg进行视频操作、转码、截图等操作。如果你自己编译、...
最后,`ffmpeg.exe`和`ffmpeg`文件可能分别是Windows和Linux/Unix环境下的FFmpeg可执行文件,它们是Java程序调用FFmpeg命令的核心工具,需要与Java代码一起部署到运行环境中。在开发过程中,确保这些文件与Java项目...
Java使用FFmpeg解析视频、截图和获取播放时间的实践是一个重要的技术主题,尤其在多媒体处理领域。FFmpeg是一个强大的开源工具集,包含了多种用于处理音频和视频的工具,如ffprobe、ffmpeg等。在Java中集成FFmpeg,...
在Linux环境中,利用Java调用FFmpeg命令进行视频截图是一项常见的任务,特别是在多媒体处理和视频分析的项目中。FFmpeg是一款强大的开源工具,它提供了多种音视频处理功能,包括编码、解码、转换、流处理等。在这个...
在 Java 中,我们可以借助于 FFmpeg 的命令行接口与 Java 的 ProcessBuilder 类来调用 FFmpeg 进行截图操作。 首先,我们需要在项目环境中配置 FFmpeg。在 Windows 和 Linux 平台上,你可以下载 FFmpeg 的预编译...
在Java中使用ffmpeg,通常会通过调用系统命令或者使用第三方库如`Xuggle`或`ffmpeg-java`来实现。在这个项目中,开发者选择了一个简洁的方法,仅通过一个类和二十多行代码就实现了功能,这使得代码易于理解和维护。 ...