edwardcmh

人氣不過肥皂泡

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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");
    }
}
posted on 2012-05-08 15:00  edwardcmh  阅读(467)  评论(0编辑  收藏  举报