ffmpeg -y -i "d:\video\a1.avi" -title "Test" -vcodec xvid -s 368x208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 "d:\video\a2.wmv"
参数说明:
-y 覆盖输出文件,即如果 output.wmv 文件已经存在的话,不经提示就覆盖掉 -i "1.avi" 输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字 -title "Test" 在PSP中显示的影片的标题 -vcodec xvid 使用XVID编码压缩视频,不能改的 -s 368x208 输出的分辨率为368x208,注意片源一定要是16:9的不然会变形 -r 29.97 帧数,一般就用这个吧 -b 1500 视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale 4和-qscale 6,4的质量比6高 -acodec aac 音频编码用AAC -ac 2 声道数1或2 -ar 24000 声音的采样频率,好像PSP只能支持24000Hz -ab 128 音频数据流量,一般选择32、64、96、128 -vol 200 200%的音量,自己改 -muxvb 768 好像是给PSP机器识别的码率,一般选择384、512和768,我改成1500,PSP就说文件损坏了 -f psp 输出psp专用格式 "output.wmv" 输出文件名,也可以加路径改文件名
示例1:
截取一张352x240尺寸大小的,格式为jpg的图片:
ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg
示例2:
把视频的前30帧转换成一个Animated Gif:
ffmpeg -i test.asf -vframes 30 -y -f gif a.gif
示例3:
在视频的第8.01秒处截取 352*240 的缩略图:
ffmpeg -i test2.asf -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg
在项目中也用到了ffmpeg的视频转码和缩略图提取功能,参考了这篇文章,对作者表示感谢。
import java.io.File;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
public class ConvertVideo {
private static HashMap<String, String> fileType;
static {
fileType = new HashMap<String, String>();
fileType.put("avi", "true");
fileType.put("mpg", "true");
fileType.put("wmv", "true");
fileType.put("3gp", "true");
fileType.put("mov", "true");
fileType.put("mp4", "true");
fileType.put("asf", "true");
fileType.put("asx", "true");
//fileType.put("flv", "true");
}
public static boolean processFlv(String INPUT_PATH,String OUTPUT_PATH) {
System.out.println("OUTPUT_PATH="+OUTPUT_PATH);
//效验文件是否存在,自行取舍
if(new File(OUTPUT_PATH).exists()) return true;
List<String> commend = new java.util.ArrayList<String>();
//ffmpeg地址,不需要带.exe后缀
commend.add("d:\\video\\ffmpeg\\ffmpeg");
commend.add("-i");
commend.add(INPUT_PATH);
commend.add("-y");
commend.add("-s");
commend.add("480*360");
commend.add("-b");
commend.add("1000");
commend.add("-qscale");
commend.add("4");
commend.add(OUTPUT_PATH);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.redirectErrorStream(true);
//builder.start();
Process process = builder.start();
InputStream in = process.getInputStream();
byte[] re = new byte[1024];
while (in.read(re)!= -1) {
System.out.println(new String(re));
}
in.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static boolean processImg(String INPUT_PATH,String IMG_PATH) {
System.out.println("IMG_PATH="+IMG_PATH);
if(new File(IMG_PATH).exists()) return true;
List<String> commend = new java.util.ArrayList<String>();
commend.add("d:\\video\\ffmpeg\\ffmpeg");
commend.add("-i");
commend.add(INPUT_PATH);
commend.add("-y");
commend.add("-f");
commend.add("image2");
commend.add("-ss");
commend.add("10");
commend.add("-t");
commend.add("0.001");
commend.add("-s");
commend.add("320x240");
commend.add(IMG_PATH);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.start();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private static boolean checkContentType(String INPUT_PATH) {
String type = INPUT_PATH.substring(INPUT_PATH.lastIndexOf(".") + 1, INPUT_PATH.length()).toLowerCase();
// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
return "true".equals(fileType.get(type));
}
public static void convertToFLV(String INPUT_PATH) {
String FILE_PATH = INPUT_PATH.substring(0,INPUT_PATH.lastIndexOf("."));
String OUTPUT_PATH = FILE_PATH + ".flv";
String IMG_PATH = FILE_PATH + ".jpg";
System.out.println("INPUT_PATH="+INPUT_PATH);
processImg(INPUT_PATH,IMG_PATH);
if (checkContentType(INPUT_PATH)){
processFlv(INPUT_PATH,OUTPUT_PATH);
}
}
public static void main(String[] args){
convertToFLV("D:\\video\\a1.avi");
}
}

浙公网安备 33010602011771号