用java小例題說明更直觀:(能夠直接編譯運行)java
環境我在windows平臺下測試的。。。windows
須要在e:/下有ffmpeg.exe;mencoder.exe;drv43260.dll;pncrt.dll共4個文件。ide
如何獲得這4個文件參考文章http://blog.sina.com.cn/u/4a424eca010005kb工具
還要在e:/input下放各類文件名爲a的如下各類視頻文件;還要e:/output;java程序執行後能獲得一個a.flv的已轉換的文件。測試
ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
對ffmpeg.exe沒法解析的文件格式(wmv9,rm,rmvb等),ui
能夠先用別的工具(mencoder)轉換爲avi(ffmpeg能解析的)格式;this
mencoder.exe;drv43260.dll;pncrt.dll這3個文件是爲文件格式(wmv9,rm,rmvb等)插件
轉換爲avi(ffmpeg能解析的)格式準備的;再把轉換好的avi文件再用ffmpeg.exe轉換成flv格式的視頻文件。。。code
package com.jh.test;視頻
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ConvertVideo {
private static String inputPath = "";
private static String outputPath = ""; private static String ffmpegPath = ""; public static void main(String args[]) throws IOException { getPath(); if (!checkfile(inputPath)) { System.out.println(inputPath + " is not file"); return; } if (process()) { System.out.println("ok"); } } public static void getPath(){ // 先獲取當前項目路徑,在得到源文件、目標文件、轉換器的路徑 File diretory = new File(""); try { String currPath = diretory.getAbsolutePath(); //視頻的地址 inputPath = "C:\\平行四邊形面積.flv"; //視頻轉完格式存放地址 outputPath = "E:\\mp4\\"; //轉換視頻的插件位置 ffmpegPath = "G:\\工具類\\ffmpeg-20171225-be2da4c-win64-static\\ffmpeg-20171225-be2da4c-win64-static\\bin\\"; System.out.println(currPath); } catch (Exception e) { System.out.println("getPath出錯"); } } public static boolean process() { int type = checkContentType(); boolean status = false; System.out.println("直接轉成mp4格式"); status = processMp4(inputPath);// 直接轉成mp4格式 return status; } private static int checkContentType() { String type = inputPath.substring(inputPath.lastIndexOf(".") + 1, inputPath.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; } private static boolean checkfile(String path) { File file = new File(path); if (!file.isFile()) { return false; } return true; } // 對ffmpeg沒法解析的文件格式(wmv9,rm,rmvb等), 能夠先用別的工具(mencoder)轉換爲avi(ffmpeg能解析的)格式. private static String processAVI(int type) { List<String> commend = new ArrayList<String>(); commend.add(ffmpegPath + "mencoder"); commend.add(inputPath); commend.add("-oac"); commend.add("lavc"); commend.add("-lavcopts"); commend.add("acodec=mp3:abitrate=64"); commend.add("-ovc"); commend.add("xvid"); commend.add("-xvidencopts"); commend.add("bitrate=600"); commend.add("-of"); commend.add("mp4"); commend.add("-o"); commend.add(outputPath + "a.AVI"); try { ProcessBuilder builder = new ProcessBuilder(); Process process = builder.command(commend).redirectErrorStream(true).start(); new PrintStream(process.getInputStream()); new PrintStream(process.getErrorStream()); process.waitFor(); return outputPath + "a.AVI"; } catch (Exception e) { e.printStackTrace(); return null; } } // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) private static boolean processFlv(String oldfilepath) { if (!checkfile(inputPath)) { System.out.println(oldfilepath + " is not file"); return false; } List<String> command = new ArrayList<String>(); command.add(ffmpegPath + "ffmpeg"); command.add("-i"); command.add(oldfilepath); command.add("-ab"); command.add("56"); command.add("-ar"); command.add("22050"); command.add("-qscale"); command.add("8"); command.add("-r"); command.add("15"); command.add("-s"); command.add("600x500"); command.add(outputPath + "a.flv"); try { // 方案1
// Process videoProcess = Runtime.getRuntime().exec(ffmpegPath + "ffmpeg -i " + oldfilepath
// + " -ab 56 -ar 22050 -qscale 8 -r 15 -s 600x500 "
// + outputPath + "a.flv");
// 方案2 Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start(); new PrintStream(videoProcess.getErrorStream()).start(); new PrintStream(videoProcess.getInputStream()).start(); videoProcess.waitFor(); return true; } catch (Exception e) { e.printStackTrace(); return false; } }
private static boolean processMp4(String oldfilepath) {
if (!checkfile(inputPath)) { System.out.println(oldfilepath + " is not file"); return false; } List<String> command = new ArrayList<String>(); command.add(ffmpegPath + "ffmpeg"); command.add("-i"); command.add(oldfilepath); command.add("-c:v"); command.add("libx264"); command.add("-mbd"); command.add("0"); command.add("-c:a"); command.add("aac"); command.add("-strict"); command.add("-2"); command.add("-pix_fmt"); command.add("yuv420p"); command.add("-movflags"); command.add("faststart"); command.add(outputPath + "a.mp4"); try { // 方案1 // Process videoProcess = Runtime.getRuntime().exec(ffmpegPath + "ffmpeg -i " + oldfilepath // + " -ab 56 -ar 22050 -qscale 8 -r 15 -s 600x500 " // + outputPath + "a.flv"); // 方案2 Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start(); new PrintStream(videoProcess.getErrorStream()).start(); new PrintStream(videoProcess.getInputStream()).start(); videoProcess.waitFor(); return true; } catch (Exception e) { e.printStackTrace(); return false; } }
}
class PrintStream extends Thread
{
java.io.InputStream is = null;
public PrintStream(java.io.InputStream is)
{
is = is;
}
public void run() { try { while(this != null) { int _ch = __is.read(); if(_ch != -1) System.out.print((char)_ch); else break; } } catch (Exception e) { e.printStackTrace(); } }
}