ffmpeg.java的简单介绍

博主:adminadmin 2023-03-19 00:35:09 321

今天给各位分享ffmpeg.java的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

用Java和ffmpeg做视频拆帧

我用的是基于C++的ffmpeg开发,ffmpeg原本是针对linux下的GCC编译器,当然通过MinGW也可以在win下进行编译,但是需要安装额外的编译环境,你可以上chinavideo上去看看,那上面说的很清楚,的你所说的问题也不是很难,多看看开发文档就可以解决了。

怎么用java读取ffmpeg输出流

public static void main(String[] args) {

String result = processFLV("E:\\test\\京视传媒\\体育类\\xiao.flv");

PatternCompiler compiler =new Perl5Compiler();

try {

String regexDuration ="Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s";

String regexVideo ="Video: (.*?), (.*?), (.*?)[,\\s]";

String regexAudio ="Audio: (\\w*), (\\d*) Hz";

Pattern patternDuration = compiler.compile(regexDuration,Perl5Compiler.CASE_INSENSITIVE_MASK);

PatternMatcher matcherDuration = new Perl5Matcher();

if(matcherDuration.contains(result, patternDuration)){

MatchResult re = matcherDuration.getMatch();

System.out.println("提取出播放时间 ===" +re.group(1));

System.out.println("开始时间 =====" +re.group(2));

System.out.println("bitrate 码率 单位 kb==" +re.group(3));

}

Pattern patternVideo = compiler.compile(regexVideo,Perl5Compiler.CASE_INSENSITIVE_MASK);

PatternMatcher matcherVideo = new Perl5Matcher();

if(matcherVideo.contains(result, patternVideo)){

MatchResult re = matcherVideo.getMatch();

System.out.println("编码格式 ===" +re.group(1));

System.out.println("视频格式 ===" +re.group(2));

System.out.println(" 分辨率 == =" +re.group(3));

}

Pattern patternAudio = compiler.compile(regexAudio,Perl5Compiler.CASE_INSENSITIVE_MASK);

PatternMatcher matcherAudio = new Perl5Matcher();

if(matcherAudio.contains(result, patternAudio)){

MatchResult re = matcherAudio.getMatch();

System.out.println("音频编码 ===" +re.group(1));

System.out.println("音频采样频率 ===" +re.group(2));

}

} catch (MalformedPatternException e) {

e.printStackTrace();

}

}

// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)

private static String processFLV(String inputPath) {

/*

if (!checkfile(inputPath)){

_log.warn(inputPath+" is not file");

return false;

}

*/

ListString commend=new java.util.ArrayListString();

// commend.add("e:\\videoconver\\ffmpeg\\ffmpeg ");//可以设置环境变量从而省去这行

commend.add("ffmpeg");

commend.add("-i");

commend.add(inputPath);

try {

ProcessBuilder builder = new ProcessBuilder();

builder.command(commend);

builder.redirectErrorStream(true);

Process p= builder.start();

//1. start

BufferedReader buf = null; // 保存ffmpeg的输出结果流

String line = null;

//read the standard output

buf = new BufferedReader(new InputStreamReader(p.getInputStream()));

StringBuffer sb= new StringBuffer();

while ((line = buf.readLine()) != null) {

System.out.println(line);

sb.append(line);

continue;

}

int ret = p.waitFor();//这里线程阻塞,将等待外部转换进程运行成功运行结束后,才往下执行

//1. end

return sb.toString();

} catch (Exception e) {

// System.out.println(e);

return null;

}

}

Java利用ffmpeg对视频逐帧保存,截取的帧太多近万张,如何设置帧间隔大些,使一定时间内的帧数变少

我给出正解:

ffmpeg -i /mnt/11m夜店_H264.vod /mnt/h264/ffmpeg-0.5.1/picture/1m%04d.jpg -vcodec mjpeg -ss 0:1:2 -t 0:0:1

以上将视频 1分02秒 处开始,持续1秒长的视频输出为jpg的序列

-ss 起始时间

-t 持续时间。

如果你要从片头开始,转换前2分钟为图片序列,则是:

ffmpeg -i /mnt/11m夜店_H264.vod /mnt/h264/ffmpeg-0.5.1/picture/1m%04d.jpg -vcodec mjpeg -ss 0:0:0 -t 0:2:0

另外告诉你,输出的图片数量是25/s的

急急急!!!java 用ffmpeg将上传的视频转成 .mp4 .ogg .webm 3种格式的视频,没思路,麻烦大神给点思路

import java.io.File;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;

public class ConvertVideo {

private final static String PATH = "c:\\ffmpeg\\input\\c.mp4";

public static void main(String[] args) {

if (!checkfile(PATH)) {

System.out.println(PATH + " is not file");

return;

}

if (process()) {

System.out.println("ok");

}

}

private static boolean process() {

int type = checkContentType();

boolean status = false;

if (type == 0) {

System.out.println("直接将文件转为flv文件");

status = processFLV(PATH);// 直接将文件转为flv文件

} else if (type == 1) {

String avifilepath = processAVI(type);

if (avifilepath == null)

return false;// avi文件没有得到

status = processFLV(avifilepath);// 将avi转为flv

}

return status;

}

private static int checkContentType() {

String type = PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())

.toLowerCase();

// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)

if (type.equals("avi")) {

return 0;

} else if (type.equals("mpg")) {

return 0;

} else if (type.equals("wmv")) {

return 0;

} else if (type.equals("3gp")) {

return 0;

} else if (type.equals("mov")) {

return 0;

} else if (type.equals("mp4")) {

return 0;

} else if (type.equals("asf")) {

return 0;

} else if (type.equals("asx")) {

return 0;

} else if (type.equals("flv")) {

return 0;

}

// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),

// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.

else if (type.equals("wmv9")) {

return 1;

} else if (type.equals("rm")) {

return 1;

} else if (type.equals("rmvb")) {

return 1;

}

return 9;

}

private static boolean checkfile(String path) {

File file = new File(path);

if (!file.isFile()) {

return false;

}

return true;

}

// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.

private static String processAVI(int type) {

ListString commend = new ArrayListString();

commend.add("c:\\ffmpeg\\mencoder");

commend.add(PATH);

commend.add("-oac");

commend.add("lavc");

commend.add("-lavcopts");

commend.add("acodec=mp3:abitrate=64");

commend.add("-ovc");

commend.add("xvid");

commend.add("-xvidencopts");

commend.add("bitrate=600");

commend.add("-of");

commend.add("avi");

commend.add("-o");

commend.add("c:\\ffmpeg\\output\\a.avi");

try {

ProcessBuilder builder = new ProcessBuilder();

builder.command(commend);

builder.start();

return "c:\\ffmpeg\\output\\a.avi";

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)

private static boolean processFLV(String oldfilepath) {

if (!checkfile(PATH)) {

System.out.println(oldfilepath + " is not file");

return false;

}

// 文件命名

Calendar c = Calendar.getInstance();

String savename = String.valueOf(c.getTimeInMillis())+ Math.round(Math.random() * 100000);

ListString commend = new ArrayListString();

commend.add("c:\\ffmpeg\\ffmpeg");

commend.add("-i");

commend.add(oldfilepath);

commend.add("-ab");

commend.add("56");

commend.add("-ar");

commend.add("22050");

commend.add("-qscale");

commend.add("8");

commend.add("-r");

commend.add("15");

commend.add("-s");

commend.add("600x500");

commend.add("c:\\ffmpeg\\output\\a.flv");

try {

Runtime runtime = Runtime.getRuntime();

Process proce = null;

String cmd = "";

String cut = " c:\\ffmpeg\\ffmpeg.exe -i "

+ oldfilepath

+ " -y -f image2 -ss 8 -t 0.001 -s 600x500 c:\\ffmpeg\\output\\"

+ "a.jpg";

String cutCmd = cmd + cut;

proce = runtime.exec(cutCmd);

ProcessBuilder builder = new ProcessBuilder(commend);

builder.command(commend);

builder.start();

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

}

如何将视频拆解成图片

用辅助软件可以办到,下面介绍用Total_Video_Converter-影音转换 V3.11软件达到目的的步骤。

1、百度上下载软件,再打开tvc.exe 软件界面如下:

2、点击新建任务--导入文件--打开视频文件,弹出格式选项框。如下:

(补充一下,如果视频太长,可以适当的裁短一些,方法是:点击新建任务按钮--高级工具--抽取视频即可)

3、选择jpeg图像,就是jpg图片格式,在打开的界面右侧点击“设定”,出现对话框,修改每秒的帧数(这个根据自己的需要)

4、然后点击“立即转换”出现界面如下,当然也可以选择“后台转换”

5、转换完成后自动查看(或设定为打开)设定要转换到的文件夹,所有的图片都在这个文件夹里面。

使用JAVA调用ffmpeg组件进行视频转换时不成功

FFMPEG没有java可以直接调用的API,网上那些基本上是通过调用cmd命令来实现转换的。这种方法很容易出错,效率低而且也不容易调试。最好的办法是让提供商提供flv格式的文件。如果不行你只有测试一下直接用FFMPEG的图形界面转看结果如何,然后尝试更换参数,视频文件和FFMPEG版本。

关于ffmpeg.java和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。