項目中有這樣一個需求,網頁上上傳了一個視頻,需要獲取此視頻的時長、大小,把這兩個數據返回給前台在頁面顯示。后台使用的是springboot框架,項目部署在linux上面。下面是核心代碼:
1、pom文件中需要導入的jar包依賴
(分為兩部分:核心包、ffmpeg包兩部分,ffmpeg包又分為Windows環境以及Linux環境,同時又區分32位系統以及64位系統。針對於不同的運行環境要導入不同的包,這一點對於開發、測試環境為Window而生產環境為Linux的情況,尤其要注意需要導入所有的包,使其在兩種環境下都能夠使用)
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>2.4.5</version>
</dependency>
<!-- window32位 ffmpeg -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-native-win32</artifactId>
<version>2.4.5</version>
</dependency>
<!-- window64位 ffmpeg -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-native-win64</artifactId>
<version>2.4.5</version>
</dependency>
<!-- linux32位 ffmpeg -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-native-linux32</artifactId>
<version>2.4.6</version>
</dependency>
<!-- linux64位 ffmpeg -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-native-linux64</artifactId>
<version>2.4.6</version>
</dependency>
2、controller層代碼
package com.aaa.bbb.controller;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import ws.schild.jave.MultimediaInfo;
import ws.schild.jave.MultimediaObject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.channels.FileChannel;
@Slf4j
@RestController
@RequestMapping("/readVideo")
@Api(tags = "獲取視頻時長、大小相關信息的接口")
public class ReadVideoController {
/**
* 獲取視頻時長
*
* @param fileUrl
* @return
*/
@PostMapping("/videoLengthAndSize")
public static String getLengthAndSize(@RequestParam String fileUrl) throws FileNotFoundException {
ReadVideoController r = new ReadVideoController();
String path = ResourceUtils.getURL("classpath:").getPath() + "static";
System.out.println("666666666666666666666666666666【" + path + "】666666666666666666666666666666】");
fileUrl = path + fileUrl;
String videoLength = r.ReadVideoTime(fileUrl);//視頻時長
System.out.println("===========================視頻時長:" + videoLength + "===========================");
return videoLength;
}
/**
* 視頻時長
*
* @param FileUrl
* @return
*/
public static String ReadVideoTime(String FileUrl) {
File source = new File(FileUrl);
String length = "";
try {
MultimediaObject instance = new MultimediaObject(source);
MultimediaInfo result = instance.getInfo();
long ls = result.getDuration() / 1000;
Integer hour = (int) (ls / 3600);
Integer minute = (int) (ls % 3600) / 60;
Integer second = (int) (ls - hour * 3600 - minute * 60);
String hr = hour.toString();
String mi = minute.toString();
String se = second.toString();
if (hr.length() < 2) {
hr = "0" + hr;
}
if (mi.length() < 2) {
mi = "0" + mi;
}
if (se.length() < 2) {
se = "0" + se;
}
length = hr + ":" + mi + ":" + se;
} catch (Exception e) {
e.printStackTrace();
}
return length;
}
/**
* 視頻大小
*
* @param source
* @return
*/
@SuppressWarnings({"resource"})
public static String ReadVideoSize(File source) {
FileChannel fc = null;
String size = "";
try {
FileInputStream fis = new FileInputStream(source);
fc = fis.getChannel();
BigDecimal fileSize = new BigDecimal(fc.size());
size = fileSize.divide(new BigDecimal(1024 * 1024), 2, RoundingMode.HALF_UP) + "MB";
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != fc) {
try {
fc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return size;
}
}
