基于JavaCV实现FFmpeg设置视频moov前置以及截取封面图片

在Java中调用FFmpeg:基于JavaCV实现FFmpeg设置视频moov前置以及截取封面图片

1 JavaCV

复制代码
JavaCV是一个用于计算机视觉的开源框架,它封装了OpenCV、FFmpeg等库的功能,主要包括javacv和javacv-platform两部分,前者是核心功能,相当于一个Java的调用封装,需要先安装OpenCV或FFMpeg等库,而javacv-platform已经包含了各个Windows、Linux、MacOS等平台下的OpenCV和FFmpeg等原生库,直接引入jar包即可使用。

在项目的pom.xml中加入以下代码,引入包
xml 复制代码
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.9</version>
</dependency>

2 调用JavaCV

java 复制代码
import org.bytedeco.ffmpeg.avcodec.AVPacket;
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class JavaCVTest {
    public static void main(String args[]){
        FFmpegFrameGrabber grabber = null;
        FFmpegFrameRecorder recorder = null;

        System.out.println(new File(".").getAbsolutePath());


        try {
            long startTime = System.nanoTime();
            // 输入视频文件
            String inputFile = "1.mp4";
            // 输出视频文件
            String outputFile = "output.mp4";

            grabber = new FFmpegFrameGrabber(inputFile);
            grabber.start();

            recorder = new FFmpegFrameRecorder(outputFile, 0);
            recorder.setFormat("mp4");
            // 设置movflags为faststart,确保moov前置
            recorder.setOption("movflags", "faststart");
            // 复制视频和音频编解码参数
            recorder.setVideoCodec(grabber.getVideoCodec());
            recorder.setAudioCodec(grabber.getAudioCodec());
            // 设置媒体参数,如分辨率、采样率等
            recorder.setImageWidth(grabber.getImageWidth());
            recorder.setImageHeight(grabber.getImageHeight());
            recorder.setSampleRate(grabber.getSampleRate());
            recorder.setAudioChannels(grabber.getAudioChannels());
            recorder.setAudioBitrate(grabber.getAudioBitrate());

            // 启动录制器
            recorder.start(grabber.getFormatContext());

            AVPacket packet;
            while ((packet = grabber.grabPacket()) != null) {
                // 直接写入数据包,避免编解码
                recorder.recordPacket(packet);
                avcodec.av_packet_unref(packet); // 释放数据包资源
            }

            // 截取指定帧作为封面
            double timestampInSeconds = 1.0; // 提取第10秒的帧

            // 跳到指定的时间点
            grabber.setTimestamp((long) (timestampInSeconds * 1000 * 1000));

            // 抓取一帧
            Frame frame = grabber.grabImage();

            if (frame != null) {
                // 将帧转换为BufferedImage
                Java2DFrameConverter converter = new Java2DFrameConverter();
                BufferedImage bufferedImage = converter.getBufferedImage(frame);

                // 保存图像
                File file = new File("./cover.jpg");
                ImageIO.write(bufferedImage, "jpg", file);

                System.out.println("缩略图已生成: ");
            } else {
                System.out.println("未能在指定时间点找到帧");
            }

            grabber.stop(); // 停止抓取
            long endTime = System.nanoTime();
            long executionTime = endTime - startTime;
            System.out.println("执行时间: " + executionTime / 1_000_000.0 + " ms");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (recorder != null) {
                    recorder.close();
                }
                if (grabber != null) {
                    grabber.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

javacv-platform

记录一次使用 javacv + FFmpeg 处理mp4的moov 前置功能的过程

【详解】使用javacv生成视频缩略图-腾讯云开发者社区-腾讯云

相关推荐
昨日之日200613 小时前
Higgs Audio v3 - 超自然多语言情感TTS,一键克隆声音 一键整合包下载
人工智能·音视频
ltlovezh15 小时前
ROI 编码学习指南:Android 与 FFmpeg 的真实实现边界
android·ffmpeg·音视频开发
声光界16 小时前
《星闪无线短距通信使能智能音频》
音视频
吾名招财18 小时前
视频+全景视频多视角快速抽帧工具(可免费使用)
音视频·视频抽帧·全景视频
王木风18 小时前
Spring Boot + LLM 工程化:把短视频流水线拆成 16 个独立角色的踩坑记录
人工智能·spring boot·后端·开源·新媒体运营·音视频·agent
学编程的小程20 小时前
以前做视频靠时间,现在做视频靠提示词——Codex+Remotion体验记
音视频
鸽芷咕20 小时前
鸿蒙PC迁移:MoonPlayer Qt 视频播放器鸿蒙PC适配全记录
qt·音视频·harmonyos
qq_422152571 天前
视频转 GIF 工具怎么选?2026 年动图制作方案与画质参数对比
javascript·vue.js·音视频
byte轻骑兵1 天前
【LE Audio】CAS精讲[2]: 服务核心规则,落地音频设备的标准化标识
人工智能·音视频·le audio·低功耗音频·车机蓝牙
wen_zhufeng1 天前
AudioX\-Turbo:面向通用音频生成的高效多模态统一框架
人工智能·算法·音视频