依赖包
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.3</version>
</dependency>
关键实现类
- FFmpegFrameGrabber:采集图像。从网络或者本地采集。
- FFmpegFrameRecorder:记录图像到你指定的文件或输出流
mp4网络地址转flv写入到响应
@SneakyThrows
public static void convertMp4ToFlvAndWriteToResponse(String fileURL, HttpServletResponse response) {
FFmpegFrameRecorder recorder = null;
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(new URL(fileURL).openStream())){
grabber.start();
int imageWidth = grabber.getImageWidth();
int imageHeight = grabber.getImageHeight();
recorder = new FFmpegFrameRecorder(response.getOutputStream(), imageWidth, imageHeight);
recorder.setInterleaved(true);
recorder.setVideoBitrate(2500000);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("flv");
recorder.setFrameRate(grabber.getFrameRate());
recorder.setGopSize((int) (grabber.getFrameRate() * 2));
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
recorder.start();
Frame frame;
while (true) {
frame = grabber.grabFrame();
if (frame == null) {
break;
}
recorder.record(frame);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (recorder != null) {
recorder.stop();
}
}
}
本地mp4转flv
@SneakyThrows
public static void main(String[] args) {
String inputFilePath = "C:\\Users\\admin\\Desktop\\a.mp4";
String outputFilePath = "C:\\Users\\admin\\Desktop\\b.flv";
FFmpegFrameRecorder recorder = null;
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFilePath)){
grabber.start();
int imageWidth = grabber.getImageWidth();
int imageHeight = grabber.getImageHeight();
recorder = new FFmpegFrameRecorder(outputFilePath, imageWidth, imageHeight);
recorder.setInterleaved(true);
recorder.setVideoBitrate(2500000);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("flv");
recorder.setFrameRate(grabber.getFrameRate());
recorder.setGopSize((int) (grabber.getFrameRate() * 2));
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
recorder.start();
Frame frame;
while (true) {
frame = grabber.grabFrame();
if (frame == null) {
break;
}
recorder.record(frame);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (recorder != null) {
recorder.stop();
}
System.out.println("转换完成");
}
}
import(选看)
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;