本文實例為大家分享了Java視頻格式轉(zhuǎn)化的具體代碼,供大家參考,具體內(nèi)容如下
在新縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作定制網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,成都全網(wǎng)營銷,外貿(mào)網(wǎng)站制作,新縣網(wǎng)站建設(shè)費(fèi)用合理。
核心是利用ffmpeg進(jìn)行視頻轉(zhuǎn)換,我們自己并不寫轉(zhuǎn)換視頻的代碼,只是調(diào)用ffmpeg,它會幫我們完成視頻的轉(zhuǎn)換。ffmpeg支持的類型有:asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等,這些類型,可以利用ffmpeg進(jìn)行直接轉(zhuǎn)換。ffmpeg不支持的類型有:wmv9,rm,rmvb等,這些類型需要先用別的工具(mencoder)轉(zhuǎn)換為avi(ffmpeg能解析的)格式。
廢話不大多說了,首先要把相關(guān)的庫和要轉(zhuǎn)化的視頻準(zhǔn)備好,如下圖
下面就是代碼部分了
package com.sino.test; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; /** * java實現(xiàn)視頻格式的轉(zhuǎn)化 * @author liuyazhuang * */ public class ChangeVideo { public static void main(String[] args) { ChangeVideo.convert("d:\\myeclipse\\aa.avi", "d:\\myeclipse\\bb.mp4"); } /** * @param inputFile:需要轉(zhuǎn)換的視頻 * @param outputFile:轉(zhuǎn)換后的視頻w * @return */ public static boolean convert(String inputFile, String outputFile) { if (!checkfile(inputFile)) { System.out.println(inputFile + " is nokt 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; } /** * @param inputFile * @param outputFile * @return * 轉(zhuǎn)換視頻文件 */ private static boolean process(String inputFile, String outputFile) { int type = checkContentType(inputFile); boolean status = false; if (type == 0) { status = processFLV(inputFile, outputFile);// 直接將文件轉(zhuǎn)為flv文件 } else if (type == 1) { String avifilepath = processAVI(type, inputFile); if (avifilepath == null) return false;// avi文件沒有得到 status = processFLV(avifilepath, outputFile);// 將avi轉(zhuǎn)為flv } return status; } 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)轉(zhuǎn)換為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; } // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)直接轉(zhuǎn)換為目標(biāo)視頻 private static boolean processFLV(String inputFile, String outputFile) { if (!checkfile(inputFile)) { System.out.println(inputFile + " is not file"); return false; } Listcommend = new ArrayList (); commend.add(Constants.ffmpegPath); 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("-r"); commend.add("29.97"); //高品質(zhì) commend.add("-qscale"); commend.add("6"); //低品質(zhì) // 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; } } // 對ffmpeg無法解析的文件格式(wmv9,rm,rmvb等), // 可以先用別的工具(mencoder)轉(zhuǎn)換為avi(ffmpeg能解析的)格式. private static String processAVI(int type, String inputFile) { File file = new File(Constants.avifilepath); if (file.exists()) file.delete(); List commend = new ArrayList (); commend.add(Constants.mencoderPath); 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(Constants.avifilepath); 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(); 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(); // 等Mencoder進(jìn)程轉(zhuǎn)換結(jié)束,再調(diào)用ffmepg進(jìn)程 p.waitFor(); System.out.println("who cares"); return Constants.avifilepath; } catch (Exception e) { System.err.println(e); return null; } } }
類ChangeVideo主要進(jìn)行視頻格式的轉(zhuǎn)化
package com.sino.test; /** * 常量類,主要設(shè)置可執(zhí)行程序和動態(tài)鏈接庫以及轉(zhuǎn)化過程中生成的臨時視頻文件的位置 * @author liuyazhuang * */ public class Constants { //ffmpeg存放的路徑 public static final String ffmpegPath = "d:\\myeclipse\\ffmpeg.exe"; //mencoder存放的路徑 public static final String mencoderPath = "d:\\myeclipse\\mencoder.exe"; //通過mencoder轉(zhuǎn)換成的avi存放路徑 public static final String avifilepath = "d:\\myeclipse\\temp.avi"; }
常量類Constants ,主要設(shè)置可執(zhí)行程序和動態(tài)鏈接庫以及轉(zhuǎn)化過程中生成的臨時視頻文件的位置。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。