使用FFmepg对视频进行切片

导入需要的依赖

     <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();
        }
    }
}


你可能感兴趣的:(音视频,ffmpeg,java)