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

相关推荐
jbk33111 天前
批量给视频添加字幕,并实现多样式可选的功能
音视频
dualven_in_csdn2 天前
【视频优化研究】过程 记录
音视频
纽格立科技2 天前
2025全球DRM数字广播战略实施全景——印尼篇(地缘特征主导下的数字骨干网构建)
网络·科技·音视频·信息与通信·传媒
Black蜡笔小新2 天前
全域互联:EasyCVR如何为多区域视频监控融合治理提供技术支持
音视频
非凡ghost2 天前
MPC-QT视频播放器(基于Qt框架播放器)
开发语言·windows·qt·音视频·软件需求
REDcker2 天前
Android WebView 版本升级方案详解
android·音视频·实时音视频·webview·js·编解码
带土12 天前
2. Linux下FFmpeg C++音视频解码+推流开发
linux·c++·ffmpeg
昨日之日20062 天前
LTX-2 - 一键生成音视频,创作更轻松 支持50系显卡 ComfyUI工作流 一键整合包
人工智能·音视频·视频
aqi002 天前
FFmpeg开发笔记(九十七)国产的开源视频剪辑工具AndroidVideoEditor
android·ffmpeg·音视频·直播·流媒体
Sleepless_斑马2 天前
RTMP/RTSP流媒体服务器搭建、ffmpeg推流桌面、vlc拉流
ffmpeg·rtmp·rtsp