Java視頻格式轉(zhuǎn)化的實(shí)現(xiàn)方法
本文實(shí)例為大家分享了Java視頻格式轉(zhuǎn)化的具體代碼,供大家參考,具體內(nèi)容如下
核心是利用ffmpeg進(jìn)行視頻轉(zhuǎn)換,我們自己并不寫(xiě)轉(zhuǎn)換視頻的代碼,只是調(diào)用ffmpeg,它會(huì)幫我們完成視頻的轉(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能解析的)格式。
廢話不大多說(shuō)了,首先要把相關(guān)的庫(kù)和要轉(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實(shí)現(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文件沒(méi)有得到
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;
}
// 對(duì)ffmpeg無(wú)法解析的文件格式(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;
}
List<String> commend = new ArrayList<String>();
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;
}
}
// 對(duì)ffmpeg無(wú)法解析的文件格式(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<String> commend = new ArrayList<String>();
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í)行程序和動(dòng)態(tài)鏈接庫(kù)以及轉(zhuǎn)化過(guò)程中生成的臨時(shí)視頻文件的位置
* @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";
//通過(guò)mencoder轉(zhuǎn)換成的avi存放路徑
public static final String avifilepath = "d:\\myeclipse\\temp.avi";
}
常量類Constants ,主要設(shè)置可執(zhí)行程序和動(dòng)態(tài)鏈接庫(kù)以及轉(zhuǎn)化過(guò)程中生成的臨時(shí)視頻文件的位置。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ?IDEA教程之clean或者install?Maven項(xiàng)目的操作方法
這篇文章主要介紹了IntelliJ?IDEA教程之clean或者install?Maven項(xiàng)目的操作方法,本文分步驟給大家介紹兩種方式講解如何調(diào)試出窗口,需要的朋友可以參考下2023-04-04
Spring-cloud 注冊(cè)服務(wù)提供者搭建方法
本篇文章主要介紹了Spring-cloud 注冊(cè)服務(wù)提供者搭建方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
SWT(JFace)體驗(yàn)之Sash(活動(dòng)控件)
SWT(JFace)體驗(yàn)之Sash(活動(dòng)控件)2009-06-06
Spring?Feign超時(shí)設(shè)置深入了解
Spring?Cloud中Feign客戶端是默認(rèn)開(kāi)啟支持Ribbon的,最重要的兩個(gè)超時(shí)就是連接超時(shí)ConnectTimeout和讀超時(shí)ReadTimeout,在默認(rèn)情況下,也就是沒(méi)有任何配置下,F(xiàn)eign的超時(shí)時(shí)間會(huì)被Ribbon覆蓋,兩個(gè)超時(shí)時(shí)間都是1秒2023-03-03
Java OpenCV圖像處理之仿射變換,透視變換,旋轉(zhuǎn)詳解
這篇文章主要為大家詳細(xì)介紹了Java OpenCV圖像處理中仿射變換,透視變換,旋轉(zhuǎn)的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)一下2022-10-10
基于Java SSM實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng)
本項(xiàng)目基于Java SSM框架實(shí)現(xiàn)在線點(diǎn)餐系統(tǒng),主要實(shí)現(xiàn)系統(tǒng)的在線點(diǎn)餐功能。文中的示例代碼講解詳細(xì),感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-02-02

