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,包含软件、详细文档及java代码。 ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
java调用视频转换工具ffmpeg[归纳].pdf
NULL 博文链接:https://technicalsearch.iteye.com/blog/1467364
可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式; mencoder.exe;drv43260.dll;pncrt.dll这3个文件是为文件格式(wmv9,rm,rmvb等) 转换为avi(ffmpeg能解析的)格式准备的;再把转换好的avi文件再用...
NULL 博文链接:https://ljz0898.iteye.com/blog/654601
使用java+ffmpeg实现的视频转换器,可支持大部分的视频转换
导入依赖就可以运行
利用ffmpeg工具,获取视频详细信息,并将获取到的视频信息转换成易于处理的json格式。前提都是服务器必须安装了ffmpeg工具环境,否则是无法使用的。
附件有ffmpeg及memcoder的exe及插件, 同时附有使用说明文档和java工具类代码
util 类 内含 java-1.0.2.jar 开发人员可以使用JAVE 在不同的格式间转换视频和音频 例如将 AVI 转成 MPEG 动画 等等 ffmpeg 中可以完成的在 JAVE 都有对应的方法
源码中有说明文档,按照文档...源码中包括有视频合成,视频加背景音乐,多图片+音频合并为视频,音频合并,视频加字幕,视频去声音,视频格式转换,视频播放,视频裁剪,获取音频或视频信息,定义视频大小,视频截图
这是基于Java的视频转换程序,里面有例子,有工具了,又需要的拿去
用于音频转换的工具类,java可以调用此工具,将amr格式音频转换称mp3
中档中包含linux安装yasm环境,ffmpeg工具,lame解码器,以及环境报错解决方案,如何使用jave包maven导入pom配置,java代码帮你实现转换拷入有效,以及所有工具的下载地址,让你不走弯路5分钟解决音视频转码问题,...
NULL 博文链接:https://lhutil.iteye.com/blog/1102691
利用java实现了Rtsp网络数据的拆包组帧转换为H264数据帧。
Tarsos代码转换器 TarsosTranscoder是一个Java库,使您可以快速播放和处理编码为MP3,Flac,Vorbis或Java环境中任何其他音频格式的音频。 它还提供对http和其他流的支持。 它在后台使用了平台相关的库,这些库自动为...
视频转换器 该脚本会将定义的所有视频文件转换为转换后的文件夹。 跳过任何已转换的文件。 该脚本将生成两个视频和一个图像。 脚本使用ffmpeg 2.6.4版进行了测试在Scaleway C1 Arm服务器上测试的脚本 下载此脚本或...
用Java编写的批处理音频文件转换器/重采样器。 该软件只能与音频文件一起使用。 它主要用于在具有多个无损音频文件的情况下提供一种或多种格式/采样率,并且您希望将它们全部转换为一种特定的格式/采样率。 它支持...
媒体转换器 地位: Media Converter 是一个用 Java 编写的简单易用的媒体转换和转码应用程序。 此应用程序使用流行的实用程序。 使用 ffmpeg,您可以放心程序的质量和多功能性。 ffmpeg 是同一个程序,它支持许多...