首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 影片轉檔與截圖實戰:整合 MEncoder 與 FFmpeg

     編輯:Java 相關知識

架構概覽

Java 本身不具備影音編碼能力,常見做法是呼叫外部工具 MEncoder(轉碼)與 FFmpeg(截圖),再由 Runtime.exec() 或 ProcessBuilder 執行命令列。

核心程式碼結構

1. 參數組裝工具類

public class ProcessClass {
    public static synchronized Process exec(List<String> cmdList) {
        StringBuilder sb = new StringBuilder();
        for (String s : cmdList) { sb.append(s).append(' '); }
        try { return Runtime.getRuntime().exec(sb.toString()); }
        catch (IOException e) { e.printStackTrace(); return null; }
    }
}

2. 影片處理主流程

public class VideoProcess {
    public static boolean processTransToImg2(String src, String flvOut, String imgOut) {
        List<String> mencoder = new ArrayList<>();
        List<String> ffmpeg = new ArrayList<>();

        // MEncoder 轉 FLV
        mencoder.add("F:/mencoder/summer/mencoder");
        mencoder.add(src);
        mencoder.add("-o"); mencoder.add(flvOut);
        mencoder.add("-of"); mencoder.add("lavf");
        mencoder.add("-oac"); mencoder.add("mp3lame");
        mencoder.add("-lameopts"); mencoder.add("abr:br=32:vol=1");
        mencoder.add("-srate"); mencoder.add("22050");
        mencoder.add("-ovc"); mencoder.add("lavc");
        mencoder.add("-lavcopts"); mencoder.add("vcodec=flv:vbitrate=480:mbd=2:v4mv:turbo:vb_strategy=1:last_pred=2:trell");
        mencoder.add("-vf"); mencoder.add("scale=400:226");

        // FFmpeg 第 8 秒截 100x100 縮圖
        ffmpeg.add("F:/mencoder/summer/ffmpeg.exe");
        ffmpeg.add("-i"); ffmpeg.add(src);
        ffmpeg.add("-y"); ffmpeg.add("-f"); ffmpeg.add("image2");
        ffmpeg.add("-ss"); ffmpeg.add("8");
        ffmpeg.add("-t"); ffmpeg.add("0.001");
        ffmpeg.add("-s"); ffmpeg.add("100x100");
        ffmpeg.add(imgOut);

        try {
            ProcessClass.exec(mencoder);
            ProcessClass.exec(ffmpeg);
            return true;
        } catch (Exception e) { e.printStackTrace(); return false; }
    }

    public static void main(String[] args) {
        processTransToImg2("f:/shanghaitan.rm", "f:/shanghaitan.flv", "f:/shanghaitan.jpg");
    }
}

關鍵參數解析

工具參數用途
MEncoder-of lavf輸出封裝格式為 libavformat(支援 FLV)
-oac mp3lame音訊編碼器 LAME MP3
-lameopts abr:br=32平均比特率 32 kbps
-ovc lavc視訊編碼器 libavcodec
-lavcopts vcodec=flv:vbitrate=480視訊編碼 FLV,目標 480 kbps
-vf scale=400:226縮放解析度
FFmpeg-ss 8跳至第 8 秒
-t 0.001僅擷取極短片段(單張圖)
-s 100x100輸出圖片尺寸
-f image2輸出格式為圖片序列
-y覆蓋輸出檔不提示

生產環境強化建議

  1. 改用 ProcessBuilder:支援目錄、環境變數、輸出流重導向,避免命令字串注入風險。
  2. 非同步讀取 stdout/stderr:防止緩衝區滿導致子進程卡死。
  3. 超時控制:process.waitFor(timeout, TimeUnit.SECONDS) 防止掛起。
  4. 路徑外部化:工具路徑、參數模板置於設定檔,支援跨平台部署。
  5. 考慮 JavaCV / Xuggler:若不想依賴外部二進制,可改用 JNI 封裝庫,部署更簡單但體積較大。

常見坑點

  • Windows 路徑含空白需雙引號包裹。
  • MEncoder/FFmpeg 版本差異導致參數不支援,建議鎖定版本並打包隨專案部署。
  • 大檔案轉碼耗時長,建議併入工作佇列(如 Quartz、Spring Batch)非同步處理。

掌握命令列參數與 Java 進程控制,即可快速建立影片轉檔與截圖微服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved