基于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生成视频缩略图-腾讯云开发者社区-腾讯云

相关推荐
气泡音人声分离1 小时前
音频 Key 和 BPM 识别原理:歌曲调性和速度是如何分析出来的?
音视频·升降调·音频变速
海带紫菜菠萝汤4 小时前
WebCodecs API 实战:浏览器原生视频编解码的原理与性能测试
前端·javascript·音视频·视频编解码
kriston20265 小时前
2026音频指纹识别方案准确率对比:主流厂商差距与选型指南
音视频
薛定谔的猫-菜鸟程序员5 小时前
基于 Electron 的本地短视频解析与下载工具:架构设计与工程实践
java·electron·音视频
程序员大辉6 小时前
seedance2.0做的视频太贵?开源免费最佳替代方案:bernini生视频,ltx2.3来配音
音视频·视频大模型·ltx2.3·bernini
勿忘初心12218 小时前
【Windows流媒体实战1】FFmpeg+Nginx-RTMP Windows详细搭建教程
ffmpeg·nginx-rtmp·windows流媒体搭建·rtmp直播
AI星桥小王子8 小时前
镜头、角色、剧情自由把控,可控式 AI 视频工作台横向测评
人工智能·音视频
EasyDSS8 小时前
巡逻调度、应急呼叫、多路同屏——企业级融媒体平台EasyDSS一站式搞定园区安保所有音视频需求
音视频·媒体
hz567898 小时前
应急管理部门跨部门会商用什么系统?指挥调度视频会议方案解析
网络·安全·音视频·实时音视频·信息与通信
人工智能研究所10 小时前
ResearchStudio-Reel: 学术论文到海报、视频、博客的“最后一公里“
人工智能·microsoft·音视频·博客·ppt·学术论文·ai创作