Java獲取視頻文件時長


網上大多數博客的代碼經過測試都是無用的,因為業務需要所以自己實現並封裝了工具類供大家參考。

引入jave(多媒體處理包) pom依賴

<!-- jave 核心依賴 -->
<dependency>
     <groupId>ws.schild</groupId>
     <artifactId>jave-core</artifactId>
     <version>2.4.6</version>
</dependency>

<!-- 根據不同操作系統引入不同FFmpeg包 -->

<!-- window32位 FFmpeg -->
<dependency>
     <groupId>ws.schild</groupId>
     <artifactId>jave-native-win32</artifactId>
     <version>2.4.6</version>
</dependency>
<!-- window64位 FFmpeg -->
<dependency>
     <groupId>ws.schild</groupId>
     <artifactId>jave-native-win64</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>
<!-- macos64位 FFmpeg -->
<dependency>
     <groupId>ws.schild</groupId>
     <artifactId>jave-native-osx64</artifactId>
     <version>2.4.6</version>
</dependency>

<!-- Apache Commons -->
<dependency>
     <groupId>commons-fileupload</groupId>
     <artifactId>commons-fileupload</artifactId>
     <version>1.2.1</version>
</dependency>
<dependency>
     <groupId>commons-io</groupId>
     <artifactId>commons-io</artifactId>
     <version>2.7</version>
</dependency>

獲取視頻文件時長工具類:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import ws.schild.jave.MultimediaInfo;
import ws.schild.jave.MultimediaObject;
import java.io.File;
@Slf4j
public class FileUtil {
    private static ImmutableList<String> videoSuffixList = ImmutableList.of("mp4", "mov", "avi", "mkv", "m4v", "wmv",
 "asf", "asx", "rm", "rmvb", "3gp", "dat", "flv", "vob");
 /**
 * 獲取視頻時長 * @param file 視頻文件
 * @return 時長(秒)
 */ public static int getVideoDuration(MultipartFile file){
        int duration = 0;
 File tempFile = null;
 try{
            tempFile = File.createTempFile(UUIDUtil.uuid(), "." + FilenameUtils.getExtension(file.getOriginalFilename()));
 file.transferTo(tempFile);
 MultimediaObject multimediaObject = new MultimediaObject(tempFile);
 MultimediaInfo info = multimediaObject.getInfo();
 duration = (int) Math.ceil((double) info.getDuration() / 1000);
 } catch (Exception e){
            log.error("獲取視頻時長失敗", e);
 } finally {
            if (tempFile != null){
                tempFile.delete();
 }
        }
        return duration;
 }
    /**
 * 判斷文件是否是視頻 * @param file 文件
 * @return 是否是啊視頻
 */ public static boolean isVideo(MultipartFile file){
        return videoSuffixList.contains(FilenameUtils.getExtension(file.getOriginalFilename()));
 }
}
@Configuration
public class MultipartResolverConfig {
    @Bean
 public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
 resolver.setDefaultEncoding("UTF-8");
 resolver.setMaxInMemorySize(Integer.MAX_VALUE);
 return resolver;
 }
}

把File轉化為MultipartFile過程記錄

 大家都知道在做文件上傳的時候,后端直接用MultipartFile類接收就行了,那么為什么還要考慮把File轉化為MultipartFile呢?我偶然在測試Excel導入的時候用到了,直接用Junit測試,Excel文件放在工程中,這就需要把本地文件轉為File,再轉為MultipartFile。當然僅僅為了測試一個Excel文件導入完全不必這樣。哈哈,沒錯,我就是閑的。下面是過程。

  引入以下依賴:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

 下面是具體代碼:

 

package com.leiyuke.file.excel.one;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

public class FileUtil {

public MultipartFile fileToMultipartFile(File file) {
FileItem fileItem = createFileItem(file);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
return multipartFile;
}

private static FileItem createFileItem(File file) {
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item = factory.createItem("textField", "text/plain", true, file.getName());
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return item;
}

}

注意:導入的是org.apache.commons下的包,一定記住,我踩過的雷。。。

 

 

 

轉載

轉載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM