FFmpeg框架系列:獲取視訊時長

2020-09-24 14:00:46

1. 業務場景

業務需求:對上傳的視訊顯示該時長。

2. FFmpeg框架處理視訊資訊

FFmpeg官網:http://ffmpeg.org/

3. 程式碼實現

3.1 windows安裝FFmpeg

我在這篇五分鐘JAVA程式碼教會你:FFmpeg實現視訊試看(window版本)中寫的十分詳細,在windows/Linux安裝FFmepg,此處我就不過多闡述了。

3.2 執行口令檢視視訊資訊

在window中安裝FFmpeg後,在cmd執行獲取時長的命令即可:

F:\ffmpegDemo\ffmpeg\bin\ffmpeg.exe -i F://ffmpegDemo//test.mp4

PS:解壓在windows原生的ffmpeg程式F:\ffmpegDemo\ffmpeg\bin\ffmpeg.exe以及存放在windows本地視訊:F://ffmpegDemo//test.mp4

執行效果,如下:
在這裡插入圖片描述

3.3 Java解析資訊並返回時長

通過FFmpeg執行命令列,獲取返回的視訊資訊,通過java篩選到視訊資訊的目標資料,進行返回即可。

public static void main(String[] args) {
        
        String timeLength = getVideoTime("F://ffmpegDemo//test.mp4","F:\\ffmpegDemo\\ffmpeg\\bin\\ffmpeg.exe");
        if(timeLength.length()>0){//字串擷取
            timeLength =timeLength.substring(0,timeLength.indexOf("."));
        }
        System.out.println("視訊時長:"+timeLength);
       
    }

在這裡插入圖片描述

4. 貼出完成Demo

public class ExecWindowCMD {

    public static void main(String[] args) {
        
        String timeLength = getVideoTime("F://ffmpegDemo//test.mp4","F:\\ffmpegDemo\\ffmpeg\\bin\\ffmpeg.exe");
        if(timeLength.length()>0){//字串擷取
            timeLength =timeLength.substring(0,timeLength.indexOf("."));
        }
        System.out.println("視訊時長:"+timeLength);
       
    }

     /**
     *獲取視訊時間
     * @param video_path  視訊路徑
     * @param ffmpeg_path ffmpeg安裝路徑
     * @return
     */
    public static String getVideoTime(String video_path, String ffmpeg_path) {
        List<String> commands = new java.util.ArrayList<String>();
        commands.add(ffmpeg_path);
        commands.add("-i");
        commands.add(video_path);
        System.out.println("命令列:"+ffmpeg_path+" -i "+video_path);
        try {
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commands);
            final Process p = builder.start();

            //從輸入流中讀取視訊資訊
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            StringBuffer sb = new StringBuffer();
            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            br.close();

            //從視訊資訊中解析時長
            String regexDuration = "Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s";
            Pattern pattern = Pattern.compile(regexDuration);
            Matcher m = pattern.matcher(sb.toString());
            if (m.find()) {

                //System.out.println(video_path+",視訊時長:"+m.group(1)+", 開始時間:"+m.group(2)+",位元率:"+m.group(3)+"kb/s");
                return m.group(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "";
    }
}

執行效果如下:
在這裡插入圖片描述

視訊原始檔:
在這裡插入圖片描述