导入需要的依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-platform</artifactId>
<version>3.4.3-1.4.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.0.2-1.4.3</version>
</dependency>
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
public class M3U8Slicer {
public static void main(String[] args) {
// 输入视频路径
String inputPath = "input.mp4";
// 输出 M3U8 文件路径
String outputM3U8 = "output.m3u8";
// 输出 TS 片段路径
String outputTS = "output%04d.ts";
avutil.av_log_set_level(avutil.AV_LOG_ERROR);
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputPath);
try {
grabber.start();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputM3U8, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels());
recorder.setFormat("hls");
recorder.setOption("hls_time", "10");
recorder.setOption("hls_playlist_type", "vod");
recorder.setOption("hls_list_size", "0");
recorder.setOption("hls_segment_filename", outputTS);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.start();
//这里还有一些具体的参数,需要更具自己需求设置
//设置视频帧率
//recorder.setFrameRate();
//设置gop大小
//recorder.setGopSize();
//设置视频质量0.1-1.0 这个在设置的时候需要谨慎,我因为设置了这个参数,一个5MB的切成了98MB
//recorder.setVideoQuality(1.0);
//设置视频比特率
//recorder.setVideoBitrate();
long startTime = System.currentTimeMillis();
Frame frame;
while ((frame = grabber.grabFrame()) != null) {
// 将帧写入输出
recorder.record(frame);
}
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
double frameRate = grabber.getFrameRate();
System.out.println("Video slicing completed.");
System.out.println("Total frames: " + grabber.getLengthInFrames());
System.out.println("Elapsed time: " + elapsedTime + " ms");
System.out.println("Average frame rate: " + frameRate + " fps");
recorder.close();
grabber.stop();
grabber.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}