现在的位置: 首页 > 综合 > 正文

如何使用java代码进行视频格式的转换(FLV)

2013年11月17日 ⁄ 综合 ⁄ 共 4589字 ⁄ 字号 评论关闭

一,前言

    在给网页添加视频播放功能后,发现上传的视频有各种格式,那么就需要将他么转换成FLV,以很好的支持在线视频播放。

二,准备

    工具包    http://pan.baidu.com/share/link?shareid=4285322805&uk=539692501

    drv43260.dll,ffmpeg.exe,mencoder.exe,pncrt.dll,pthreadGC2.dll








    原理其实是使用java代码在CMD下调用MediaCode,完成视频格式的转换。





PS:有时间还要研究一下java如何调用CMD




三,代码

package yctc.cp.converter;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
public class ConvertFlv {
    public static void main(String[] args) {
        ConvertFlv.convert("D:\\2.avi", "D:\\3.flv");
    }
     
    public static boolean convert(String inputFile, String outputFile)
    {
        if (!checkfile(inputFile)) {
            System.out.println(inputFile + " is not file");
            return false;
        }
        if (process(inputFile,outputFile)) {
            System.out.println("ok");
            return true;
        }
        return false;
    }
    //检查文件是否存在
    private static boolean checkfile(String path) {
        File file = new File(path);
        if (!file.isFile()) {
            return false;
        }
        return true;
    }
    private static boolean process(String inputFile,String outputFile) {
        int type = checkContentType( inputFile);
        boolean status = false;
        if (type == 0) {
            status = processFLV(inputFile,outputFile);// 直接将文件转为flv文件
        } else if (type == 1) {
            String avifilepath = processAVI(type,inputFile);
            if (avifilepath == null)
                return false;// avi文件没有得到
            status = processFLV(avifilepath,outputFile);// 将avi转为flv
        }
        return status;
    }
    /**
     * 检查视频类型
     * @param inputFile
     * @return ffmpeg 能解析返回0,不能解析返回1
     */
    private static int checkContentType(String inputFile) {
        String type = inputFile.substring(inputFile.lastIndexOf(".") + 1,
inputFile.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;
    }
    /**
     *  ffmepg: 能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
     * @param inputFile
     * @param outputFile
     * @return
     */
    private static boolean processFLV(String inputFile,String outputFile) {
        if (!checkfile(inputFile)) {
            System.out.println(inputFile + " is not file");
            return false;
        }
        List<String> commend = new java.util.ArrayList<String>();
        //低精度
        commend.add("");
        commend.add("-i");
        commend.add(inputFile);
        commend.add("-ab");
        commend.add("128");
        commend.add("-acodec");
        commend.add("libmp3lame");
        commend.add("-ac");
        commend.add("1");
        commend.add("-ar");
        commend.add("22050");
        commend.add("-qscale");
        commend.add("4");
        commend.add("-s"); 
        commend.add("350x240");
        commend.add("-r");
        commend.add("29.97");
        commend.add("-b");
        commend.add("512");
        commend.add("-y");
        commend.add(outputFile);
        StringBuffer test=new StringBuffer();
        for(int i=0;i<commend.size();i++)
            test.append(commend.get(i)+" ");
        System.out.println(test);
        try {
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            builder.start();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * Mencoder:
     *  对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
     * @param type
     * @param inputFile
     * @return
     */
    private static String processAVI(int type,String inputFile) {
        File file =new File("");
        if(file.exists())   file.delete();
        List<String> commend = new java.util.ArrayList<String>();
        commend.add("");
        commend.add(inputFile);
        commend.add("-oac");
        commend.add("mp3lame");
        commend.add("-lameopts");
        commend.add("preset=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("");
        StringBuffer test=new StringBuffer();
        for(int i=0;i<commend.size();i++)
            test.append(commend.get(i)+" ");
        System.out.println(test);
        try
        {
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            Process p=builder.start();
            /**
             * 清空Mencoder进程 的输出流和错误流
             * 因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,
             * 如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。
             */
            final InputStream is1 = p.getInputStream();
            final InputStream is2 = p.getErrorStream();
            new Thread() {
                public void run() {
                    BufferedReader br = new BufferedReader( new
InputStreamReader(is1));
                    try {
                        String lineB = null;
                        while ((lineB = br.readLine()) != null ){
                            if(lineB != null)System.out.println(lineB);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
            new Thread() {
                public void run() {
                    BufferedReader br2 = new BufferedReader( new
InputStreamReader(is2));
                    try {
                        String lineC = null;
                        while ( (lineC = br2.readLine()) != null){
                            if(lineC != null)System.out.println(lineC);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
             
            p.waitFor();
             System.out.println("who cares");
            return "";
        }catch (Exception e){
            System.err.println(e);
            return null;
        }
    }
}

【上篇】
【下篇】

抱歉!评论已关闭.