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"); } }