java ffmpeg 转码
转: Java 视频转码(转为MPEG-4格式) 1、引入相关依赖2、视频转码工具类二、使用ffmpeg工具转码参考:java+ffmpeg实现mp4转m3u8切片(ts)在实际开发中,可以通过调用命令,使用ffmpeg进行切片操作
·
一、使用java ffmpeg相关包转码
1、引入相关依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-platform</artifactId>
<version>3.4.1-1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>3.4.2-1.4.1</version>
</dependency>
2、视频转码工具类
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.FrameRecorder;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
/**
* 视频转码工具类
*/
public class VideoConvertUtil {
public void convert(String inputFile, String outputFile) throws Exception {
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(inputFile);
Frame captured_frame;
FFmpegFrameRecorder recorder = null;
try {
grabber.start();
recorder = new FFmpegFrameRecorder(outputFile, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels());
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setFormat("mp4");
recorder.setFrameRate(grabber.getFrameRate());
recorder.setSampleRate(grabber.getSampleRate());
recorder.setVideoBitrate(grabber.getVideoBitrate());
recorder.setAspectRatio(grabber.getAspectRatio());
recorder.setAudioBitrate(grabber.getAudioBitrate());
recorder.setAudioOptions(grabber.getAudioOptions());
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.start();
while (true) {
captured_frame = grabber.grabFrame();
if (captured_frame == null) {
System.out.println("转码完成");
break;
}
recorder.record(captured_frame);
}
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
} finally {
if (recorder != null) {
try {
recorder.close();
} catch (Exception e) {
System.out.println("recorder.close异常" + e);
}
}
try {
grabber.close();
} catch (FrameGrabber.Exception e) {
System.out.println("frameGrabber.close异常" + e);
}
}
}
}
二、使用ffmpeg工具转码
参考:java+ffmpeg实现mp4转m3u8切片(ts)
前提是要安装FFmpeg,如果不安装需要把ffmpeg执行文件放在包里指定执行文件的路径
在实际开发中,可以通过java
调用cmd
命令,使用ffmpeg进行切片操作
ffmpeg -i D:/m3u8/demo.mp4 -c:v copy -c:a copy -f ssegment -segment_format mpegts -segment_list D:/m3u8/hls/test.m3u8 -segment_time 10 D:/m3u8/hls/test%05d.ts
ffmpeg -i /a/1.avi -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 10 /a/b/1.m3u8
private static boolean process(List<String> command) throws FFmpegException {
String sys = System.getProperties().getProperty("os.name").toLowerCase();
if(sys .startsWith("win")) {
return processWin(command);
}
return processLinux(command);
}
private static boolean processWin(List<String> command) throws FFmpegException {
if (null == command || command.size() == 0) {
return false;
}
try {
Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start();
new PrintStream(videoProcess.getErrorStream()).start();
new PrintStream(videoProcess.getInputStream()).start();
int exitcode = videoProcess.waitFor();
return exitcode != 1;
} catch (Exception e) {
}
}
private static boolean processLinux(List<String> command) throws FFmpegException{
if (null == command || command.size() == 0) {
return false;
}
StringBuffer cmd = new StringBuffer();
for (int i = 0; i < command.size(); i++) {
cmd.append(command.get(i) + " ");
}
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd.toString());
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
log.info(sb.toString());
} catch (Exception e) {
log.error("执行:" + cmd + "出错", e);
}
return true;
}
更多推荐
所有评论(0)