這兩天完善了一下視頻轉換這個東西,以前做的那套東西上傳完之后就開始轉換,無法適應大并發(fā)量下的視頻轉換(我覺得同時有10個ffmpeg進程在轉視頻服務器肯定要掛掉),所以我用了另一套方案,視頻上傳之后先不轉換,把視頻的基本信息存到數據庫中,然后由程序定時的從數據庫中讀取數據,依次轉換視頻。具體做法是:1、上傳文件,將文件名存入數據庫,同時在數據庫標明videostat字段為0(表示未轉換)
2、通過程序,每隔30秒(根據不同情況可以改變)取出一個未轉換(videostat=0)且失敗次數小于5(confailtime<5)的紀錄
3、開始轉換視頻,這里要先將數據庫中videostat字段改為2(表示正在轉換)不然30秒鐘轉換不完下個進程又會讀到這條紀錄開始轉換......
4、等待轉換進程結束,如果成功將相應紀錄的videostat字段的值改為1(表示轉換成功),若轉換失敗則將失敗次數字段加一(confailtime=confailtime+1)
在鼓搗這東西的過程中,遇到了一個問題,如果一個進程先執(zhí)行p.waitFor();方法而后輸出命令行中的結果是不行的,即:

Code
int flag = p.waitFor();
InputStream inErr = p.getErrorStream();
InputStream inIns = p.getInputStream();
BufferedReader brErr = new BufferedReader(new InputStreamReader(
inErr));
BufferedReader brIns = new BufferedReader(new InputStreamReader(
inIns));
// inErr讀取輸出信息開始
String strsErr = "";
String strErr = brErr.readLine();
while (strErr != null) {
strsErr = strsErr + strErr + "\n";
System.out.println(strErr);
strErr = brErr.readLine();
}
// inErr讀取輸出信息結束
// inIns讀取輸出信息開始
String strsIns = "";
String strIns = brIns.readLine();
while (strIns != null) {
strsIns = strsIns + strIns + "\n";
System.out.println(strIns);
strIns = brErr.readLine();
}
如果這樣執(zhí)行的話進程會掛起,無法繼續(xù)下午,而正確的方法是先讀取命令行的數據,再來waitFor();
還有一點需要注意的是獲得命令行的輸出結果先要從錯誤流中獲得,即(ErrorStream),而非從輸入流(InputStream)中獲得,很有用的經驗。

--------------------------
09博客園紀念T恤新聞:
自由軟件基金會列舉Windows 7之七宗罪網站導航:
博客園首頁 個人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2009/08/04/1538824.html
posted on 2009-08-04 17:45
破名超難起 閱讀(272)
評論(0) 編輯 收藏