author:fanfq(xiaoban)
Email:fangqing.fan#gmail.com
link:http://fanfq.iteye.com/admin/blogs/655569
changelog:
有很多朋友发邮件问我关于ffmpeg视频转码的相关问题,我也尝试了帮助他们去解决这些问题,由于个人精力有限就blog上总结一下大家所遇到的一些问题。
以下代码只要是使用的我的包是肯定没有问题的,但是至限于*-》flv,因为不同格式的视频转码所对应的参数也是不一样的,想要达到效果教好的视频的话就得修改这些参数,但是我们有一个通用的方式,只要是ffmpeg支持的视频的话。使用 ffmpeg -i form.** to.** 就可以了,但是这只局限与测试。
windows环境测试
一.磨刀不误砍柴工
1.首先在c:\ffmpeg放入红色方框内中的必要文件(下载)。
ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
对ffmpeg.exe无法解析的文件格式(wmv9,rm,rmvb等),
可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式;
mencoder.exe;drv43260.dll;pncrt.dll这3个文件是为文件格式(wmv9,rm,rmvb等)
转换为avi(ffmpeg能解析的)格式准备的;再把转换好的avi文件再用ffmpeg.exe转换成flv格式的视频文件。。。
2.C:\ffmpeg\input目录中存放事先下载好的不同格式的视频文件。
3. C:\ffmpeg\output目录是将来存放转换后的文件。
二.废话不说直接上代码
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) {
List<String> commend = new ArrayList<String>();
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);
List<String> commend = new ArrayList<String>();
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;
}
}
}
三.成果
1. rmvb->avi
Mencoder.exe进程是在将rmvb->avi 估算值100KB/s。
2. avi/*->flv
ffmpeg.exe进程是在将avi/*->flv 估算值300KB/s。
‘*’表示ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)

- 大小: 39.3 KB

- 大小: 29.7 KB

- 大小: 98.3 KB

- 大小: 24.3 KB

- 大小: 37 KB

- 大小: 35.5 KB
分享到:
相关推荐
Java调用视频转换工具FFmpeg是一项常见的任务,特别是在多媒体处理和流媒体服务中。FFmpeg是一个强大的跨平台命令行工具,用于转换、流化、编辑和处理音频和视频文件。在Java应用程序中集成FFmpeg,可以实现灵活的...
总的来说,Java调用FFmpeg是一个常用的技术手段,可以帮助开发者在Java应用程序中实现丰富的音视频处理功能。需要注意的是,由于FFmpeg的命令行语法较为复杂,因此在实际使用中,理解其参数和选项至关重要,同时也要...
### Java调用视频转换工具FFmpeg知识点归纳 #### 一、环境配置与文件准备 **1.1 FFmpeg工具的安装与配置** - **下载与安装:** - 首先,确保已经在本地计算机上安装了FFmpeg工具。可以在官方网站上下载适合...
Java FFmpeg Wrapper将FFmpeg的命令行工具包装成Java API,使得开发者可以在Java代码中直接调用转换视频的方法,无需关心底层的命令行执行细节。 以下是一些核心知识点: 1. **FFmpeg命令行工具**:FFmpeg的基本...
总结来说,通过Java调用FFmpeg和Mencoder进行视频格式转换,需要理解这两个工具的命令行语法,以及如何在Java中执行外部进程。此过程涉及到文件类型的检查、预处理转换(如果必要)、最终的格式转换以及错误处理,...
Java调用FFmpeg转换视频格式为...总之,Java调用FFmpeg转换视频格式是一项常见任务,涉及到系统进程调用、第三方库的使用,以及对FFmpeg命令和参数的理解。通过合理的编程实践,我们可以构建稳定、高效的视频处理功能。
4. 使用说明文档:`java调用视频转换工具ffmpeg.doc`很可能是详细的使用教程,涵盖了如何配置环境、调用FFmpeg的命令行参数以及如何在Java代码中调用这些命令。阅读这份文档对于理解整个转换过程至关重要。 5. 其他...
在Java开发中,通过调用FFmpeg的命令行工具,可以方便地集成到应用程序中进行视频处理,例如本实例中的视频压缩。在百度AI和腾讯AI的活体验证场景中,高质量、低大小的视频文件是必要的,因此使用FFmpeg进行视频压缩...
总之,Java FFmpeg视频转换涉及了多媒体处理的基本原理和Java调用外部进程的技术。理解FFmpeg的组件和命令结构,以及如何在Java中正确地执行和处理FFmpeg命令,是成功实现这一功能的关键。遇到问题时,参考社区资源...
在Windows环境下,使用Java调用FFmpeg进行视频处理是一项常见的任务,尤其在开发涉及多媒体处理的应用时。FFmpeg是一款强大的跨平台的音频和视频处理工具,而Java则是一种广泛使用的编程语言,它提供了丰富的库来与...
Java 使用 FFmpeg 截取视频图片是一个常见的任务,它涉及到多媒体处理、命令行操作和跨平台编程。FFmpeg 是一个强大的开源工具集,用于处理音频和视频文件,包括编码、解码、转码、流处理等功能。在 Java 中,我们...
LAME(LAME Ain't an MP3 Encoder)是许多音频编辑软件和转换工具背后的引擎。3.99.5是LAME的一个稳定版本,提供了良好的编码质量和速度平衡。在Java项目中,可以通过Java的外部进程调用来集成LAME,实现音频文件的...
6. **环境搭建**:配合"windows下java调用ffmpeg视频处理环境搭建",这部分可能包括如何在Windows系统上安装FFmpeg,设置环境变量,以及如何确保Java程序能正确找到并执行FFmpeg的可执行文件。 7. **错误处理和日志...
在Java中使用FFmpeg获取视频时长,首先需要安装FFmpeg命令行工具,并将其添加到系统的PATH环境变量中,以便Java程序可以调用。此外,还需要引入一个Java的FFmpeg绑定库,例如`ffmpeg-java`或`fluent-ffmpeg`,这些库...
在Java中使用ffmpeg,通常会通过调用系统命令或者使用第三方库如`Xuggle`或`ffmpeg-java`来实现。在这个项目中,开发者选择了一个简洁的方法,仅通过一个类和二十多行代码就实现了功能,这使得代码易于理解和维护。 ...
这个压缩包文件"java 调用 ffmpeg 进行视频转换以及截图.rar"显然提供了一个解决方案,让我们能够在Java环境中利用`ffmpeg`的功能。 首先,让我们详细了解一下如何在Java中调用`ffmpeg`。这通常涉及到使用Java的`...
6. **执行命令**:在Java中,你可能还需要使用`Runtime.getRuntime().exec()`方法来执行FFmpeg命令行工具,以直接生成指定帧的图片,而无需先解码视频。这可以简化流程,但可能限制了灵活性。 7. **错误处理和资源...
Java使用FFmpeg解析视频、截图和获取播放时间的实践是一个重要的技术主题,尤其在多媒体处理领域。FFmpeg是一个强大的开源工具集,包含了多种用于处理音频和视频的工具,如ffprobe、ffmpeg等。在Java中集成FFmpeg,...
3) 编写Java代码:使用Java调用FFmpeg命令行,执行转换操作。例如: ```java Process process = Runtime.getRuntime().exec("ffmpeg -i input.mp4 -hls_time 10 -hls_list_size 0 output.m3u8"); ``` 上述...
通过以上分析,我们可以看出这个项目的核心是利用Java调用FFmpeg实现视频和音频的转码功能,涉及到多媒体处理、文件操作、系统调用等多个方面。对于开发者来说,理解FFmpeg的工作原理以及如何在Java中有效地利用它是...