千金縱買相如賦越败,脈脈此情誰訴焚鹊。
概述
有時候我們希望使用某一張圖片作為視頻素材的封面 腕够,而不是素材中的某幀逊脯。今天使用ffmpeg
批量替換視頻素材封面优质。
環(huán)境裝備
從官網(wǎng)下載安裝 ffmpeg
準備素材
準備好視頻素材和封面圖片
編寫程序
package cn.merryyou.file;
import java.io.*;
/**
* 修改視頻封面
* Created by i@merryyou.cn on 2020/3/24
*
* @VERSION 1.0
*/
public class ChangeVedioCover {
public static final String FFMPEG_PATH = "D:/ffmpeg/bin/ffmpeg.exe"; // ffmpeg 程序迷路
public static final String FILE_PATH = "E:/BaiduNetdiskDownload/測試"; //需要替換封面的視頻目錄
public static final String IMAGE_PATH = "E:/BaiduNetdiskDownload/測試/1.png"; // 需要替換的封面照片
public static final String COMMAND = "%s -i %s -i %s -map 1 -map 0 -c copy -disposition:0 attached_pic -y %s"; // ffmpeg 替換封面的命令
public static void main(String[] args) throws Exception {
printPath(new File(FILE_PATH));
}
public static void printPath(File file) throws IOException {
File[] files = file.listFiles();
for (File a : files) {
System.out.println(a.getAbsolutePath());
if (a.getAbsolutePath().endsWith(".mp4")) {
String newPath = a.getParent() + "/" + a.getName().substring(0, a.getName().lastIndexOf(".")) + "_.mp4"; // 新生成的文件名后面添加_ 下劃線
String cmd = String.format(COMMAND, FFMPEG_PATH, a.getAbsolutePath(), IMAGE_PATH, newPath);
execCmd(cmd);
a.delete();// 刪除源文件
}
if (a.isDirectory()) {
printPath(a);
}
}
}
public static void execCmd(String cmd) {
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/C", cmd);
Process process = null;
try {
process = builder.redirectErrorStream(true).start();
} catch (IOException e) {
e.printStackTrace();
}
InputStream in = process.getInputStream();
outStream(in);
}
private static void outStream(InputStream in) {
// 用一個讀輸出流類去讀
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
// 逐行讀取輸出到控制臺
try {
while ((line = br.readLine()) != null) {
// System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
效果如下
修改封面前
修改封面后
總結
更多ffmpeg
命令參考鏈接