日期:2018/08/13
本文寫(xiě)的是純java調(diào)用FFmepg.exe,推薦有c基礎(chǔ)的dalao們可以去雷神的博客找解決方案
這段時(shí)間要做一個(gè)小東西(對(duì)我來(lái)說(shuō)并不是)去實(shí)現(xiàn)多視頻的一鍵轉(zhuǎn)碼上傳壳影,網(wǎng)上查來(lái)查去,最后還是選擇FFmpeg逼裆,不過(guò)FFmpeg網(wǎng)上資料不太多知态,中間也是經(jīng)常卡壮龈铩(主要是自己水平問(wèn)題)...閑話少說(shuō)吧叠萍,寫(xiě)這篇文章是因?yàn)槲易约喊俣日?strong>Java調(diào)用FFmpeg.exe芝发,轉(zhuǎn)一個(gè)視頻輸出一個(gè)提示的時(shí)候沒(méi)有搜到比較有用的東西,所以實(shí)現(xiàn)之后我就自己寫(xiě)一篇給純java的兄dei們一點(diǎn)參考吧
思路:
將FFmpeg命令的集合放到cmd里面運(yùn)行
↓
獲取cmd中ffmpeg的輸出信息苛谷,轉(zhuǎn)完一個(gè)后返回提示
很簡(jiǎn)單吧(沒(méi)錯(cuò))辅鲸,但是我相信也會(huì)有和我一樣的小白不會(huì)的,瓶頸是對(duì)cmd操作的不熟悉腹殿,還有百度找不到相關(guān)信息
代碼:
ShowTime
CmdExcuter.java:最重要的類(lèi)独悴,創(chuàng)建進(jìn)程生成器調(diào)用FFmpeg.exe并獲取cmd的輸出,這里的List<String> cmd就是輸入的cmd命令锣尉,把調(diào)用FFmpeg的String數(shù)組賦值給cmd變量即可
這段代碼并不是我個(gè)人原創(chuàng)刻炒,實(shí)習(xí)公司的dalao給了很多幫助,一些地方我也沒(méi)法正確表述自沧,因此我就不寫(xiě)太多注釋了坟奥,看jdk文檔吧
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
public class CmdExecuter {
private static Logger logger = LoggerFactory.getLogger(CmdExecuter.class);
public static void exec(List<String> cmd, CmdOutputGetter getter) {
if (logger.isInfoEnabled()) {
logger.info("exec command: ");
StringBuilder sb = new StringBuilder();//StringBuilder是字符串生成器,上面這部分和cmd操作沒(méi)關(guān)系
for (String c : cmd) {
sb.append(c).append(" ");
}
logger.info(sb.toString());
}
//cmd操作部分
try {
ProcessBuilder builder = new ProcessBuilder();//創(chuàng)建新線程
builder.command(cmd);//執(zhí)行FFmpeg命令
builder.redirectErrorStream(true);
Process proc = builder.start();
BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = stdout.readLine()) != null) {
if (getter != null)
getter.dealLine(line);
}
proc.waitFor();
stdout.close();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
CmdOutputGetter.java:用于獲取cmd輸出的每行信息,要自己寫(xiě)deal方法決定怎么處理返回的每行信息
public interface CmdOutputGetter {
public void dealLine(String str);
}
ConvertVideo.java(部分)我只把有關(guān)聯(lián)的那幾行放一下
commend是ffmpeg命令的集合(存放一條完整的ffmpeg命令)
//調(diào)用cmd操作類(lèi)
CmdExecuter.exec(commend, new CmdOutputGetter() {
@Override
public void dealLine(String line) {
System.out.println(line);//把cmd輸出的信息每行syso爱谁,這個(gè)是實(shí)時(shí)輸出的晒喷,可以換其他的處理方式
}
});
System.out.println("AMD,YES!");//可以換成其他提示轉(zhuǎn)換完成的方法
之后我會(huì)做個(gè)小demo放評(píng)論里面,供需要的人下載访敌,現(xiàn)在是凌晨1點(diǎn)凉敲,感覺(jué)再熬會(huì)禿頭
這是我第一次寫(xiě)博客,對(duì)于這篇文章有什么不太明白的地方歡迎評(píng)論寺旺,我會(huì)盡力說(shuō)明