最近由於需要將在愛奇藝下載的視頻(qsv)轉化了mp4,用JavaFX開發一個視頻轉碼工具,算是JavaFX開發的第一個應用吧。
支持qsv轉碼mp4,理論上支持各種格式,僅測試了flv,qsv格式。
文末有安裝包獲取途徑
~ JavaFX桌面應用開發系列文章傳送門 ~
- JavaFX-桌面應用開發系列文章匯總篇
- JavaFX桌面應用開發-HelloWorld
- JavaFX布局神器-SceneBuilder
- JavaFX讓UI更美觀-CSS樣式
- JavaFX桌面應用-為什么應用老是“未響應”
- JavaFX桌面應用-MVC模式開發,“真香”
- JavaFX桌面應用-loading界面
- JavaFX桌面應用-表格用法
1. 應用程序預覽
UI界面主要分為三個部分,頂部用於顯示當前轉碼的視頻信息,右側按鈕用於選擇需要轉碼的視頻,已經啟動轉碼,中間是轉碼視頻列表信息顯示。
2. UI 布局
使用BorderPane進行布局,top為視頻信息顯示區,center為表格顯示區
<center>
<TableView fx:id="table" prefHeight="187.0" prefWidth="600.0"/>
</center>
<top>
<VBox>
<children>
<HBox alignment="CENTER" prefHeight="30.0">
<children>
<Label fx:id="info" alignment="CENTER" contentDisplay="CENTER" prefWidth="600.0"/>
</children>
</HBox>
<HBox alignment="CENTER_RIGHT" prefHeight="30.0" spacing="10">
<children>
<Button text="選擇..." onAction="#selectVideoHandler"/>
<Button text=" 啟動 " onAction="#executeConvertHandler"/>
</children>
</HBox>
</children>
<BorderPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/>
</BorderPane.margin>
</VBox>
</top>
3. 事件處理
這里需要處理兩個按鈕的事件,即“選擇”按鈕和“啟動”按鈕的事件。
a. “選擇”事件處理
當用戶點擊“選擇”時,彈出視頻文件選擇框,支持同時選擇多個視頻。
public void selectVideoHandler(ActionEvent actionEvent) {
FileChooser fileChooser = new FileChooser();
List<File> fs = fileChooser.showOpenMultipleDialog(App.stage);
int idx = 0;
if (fs != null && !fs.isEmpty()) {
for (File f : fs) {
if (f.exists() && f.isFile()) {
model.getTableList()
.add(TableColumnModel.fromWork(new Work(System.currentTimeMillis() + idx++, f.getAbsolutePath())));
}
}
}
}
b. “啟動”事件處理
當用戶點擊啟動按鈕的時候,開始轉碼,並禁用啟動按鈕,防止多次啟動轉碼。
public void executeConvertHandler(ActionEvent actionEvent) {
if (model.getTableList().isEmpty()) {
new Alert(Alert.AlertType.INFORMATION, "沒有轉碼任務,請選擇視頻進行轉碼。").show();
return;
}
if (ffmpeg == null) {
new Alert(Alert.AlertType.ERROR, "FFmpeg.exe Not Found.").show();
return;
}
((Button) actionEvent.getSource()).setDisable(true);
new VideoConvertExecutor(ffmpeg, model.getTableList(), s -> Platform.runLater(() -> model.setInfo(s))).start();
}
4. 視頻轉碼主流程
視頻轉碼采用FFmpeg工具進行轉碼,當視頻進行轉碼時,將任務放入轉碼任務池,並啟動轉碼;如果轉碼出現異常,則將異常信息放入model中顯示在界面上,如果所有任務都已執行完成后退出轉碼線程。
@Override
public void run() {
while (true) {
Optional<TableColumnModel> opt = modelList.stream().filter(i -> !VideoConvertHolder.has(i.getId())).findFirst();
if (opt.isPresent()) {
try {
VideoConvertHolder.add(opt.get().getId());
convert(opt.get());
} catch (Exception e) {
e.printStackTrace();
Platform.runLater(() -> opt.get().setMessage(e.getMessage()));
}
} else {
break;
}
}
}
5. 應用打包、安裝
應用打包只需用InnoSetup生成打包配置iss,如何將應用打包成安裝包即可,下面是安裝界面:
安裝成功后,目錄結構如下:
6. 應用卸載
如果需要卸載應用,只需要運行安裝目錄下面的unins000.exe
即可。
7. 轉碼效果
經過轉碼后的qsv視頻就可以采用視頻播放工具播放了。
=========================================================
關注 公眾號 “HiIT青年” 發送 “視頻轉碼工具” 獲取安裝包。(如果沒有收到回復,可能是你之前取消過關注。)
關注公眾號,閱讀更多文章。