背景:由于项目需求,需要将ts视频格式转成mp4格式,发现ffmpeg工具非常强大,遇是盯上了javacv。
第一步,导入jar包
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.4</version>
</dependency>
第二步,编写代码
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacv.*;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.opencv_objdetect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import static org.bytedeco.javacpp.avutil.*;
import static org.bytedeco.javacpp.opencv_core.*;
/**
* 视频工厂
* @author Litluecat
*/
public class VideoFactoryUtils {
private static final Logger log = LoggerFactory.getLogger(VideoFactoryUtils.class);
//转换后的视频格式
private static final String VIDEO_FORMAT = ".mp4";
public static void main(String[] args) throws Exception {
VideoFactoryUtils.convertToMp4(new File("E:\\test.ts"));
}
/**
* 转换视频文件为mp4
* @param file 目标视频文件
*/
public static void convertToMp4(File file) throws FrameRecorder.Exception, FrameGrabber.Exception {
long startTime = System.currentTimeMillis();
log.info("开始进行ts格式转MP4。。。");
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(file);
//视频比率,与清晰度有关
grabber.setVideoBitrate(2000000);
//转储后mp4文件地址
String fileName = file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(".")) + VIDEO_FORMAT;;
Frame frame = null;
FFmpegFrameRecorder recorder = null;
try {
grabber.start();
log.info("FFmpegFrameGrabber start已耗时:{}ms", (System.currentTimeMillis() - startTime));
recorder = new FFmpegFrameRecorder(fileName, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels());
recorder.setVideoCodec(grabber.getVideoCodec());
recorder.setFormat(VIDEO_FORMAT);
recorder.setFrameRate(grabber.getFrameRate());
recorder.setVideoBitrate(grabber.getVideoBitrate());
recorder.start();
log.info("FFmpegFrameRecorder start已耗时:{}ms", (System.currentTimeMillis() - startTime));
long changeSize = 0L;
while ((frame = grabber.grabFrame()) != null) {
recorder.setTimestamp(grabber.getTimestamp());
recorder.record(frame);
changeSize++;
}
log.info("视频转换总耗时:{}ms, 完成帧数:{}", (System.currentTimeMillis() - startTime), changeSize);
log.info("转换后的视频地址:{}", fileName);
} catch (Exception e) {
e.printStackTrace();
}finally{
log.info("开始关闭FFmpegFrameGrabber、FFmpegFrameRecorder流链接。。。");
recorder.stop();
recorder.release();
grabber.stop();
}
}
}
总结:之前使用opencv进行人脸识别、图像处理的时候就使用过javacv与ffmepg,只注重与opencv,没注意到后两者,也算是一次学习~