Java 本身不具備影音編碼能力,常見做法是呼叫外部工具 MEncoder(轉碼)與 FFmpeg(截圖),再由 Runtime.exec() 或 ProcessBuilder 執行命令列。
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; }
}
}
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 | 覆蓋輸出檔不提示 |
process.waitFor(timeout, TimeUnit.SECONDS) 防止掛起。掌握命令列參數與 Java 進程控制,即可快速建立影片轉檔與截圖微服務。