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

相关推荐
晚霞的不甘8 小时前
CANN 编译器深度解析:TBE 自定义算子开发实战
人工智能·架构·开源·音视频
愚公搬代码8 小时前
【愚公系列】《AI短视频创作一本通》016-AI短视频的生成(AI短视频运镜方法)
人工智能·音视频
那个村的李富贵9 小时前
CANN赋能AIGC“数字人”革命:实时视频换脸与表情驱动实战
aigc·音视频
晚霞的不甘9 小时前
CANN 支持强化学习:从 Isaac Gym 仿真到机械臂真机控制
人工智能·神经网络·架构·开源·音视频
晚霞的不甘14 小时前
CANN 支持多模态大模型:Qwen-VL 与 LLaVA 的端侧部署实战
人工智能·神经网络·架构·开源·音视频
拾荒的小海螺1 天前
开源项目:LTX2 高效可控的开源视频生成模型
开源·音视频
EasyGBS1 天前
视频画面模糊、卡顿、丢失?EasyGBS新增“视频质量诊断”功能,告别人工盯屏
视觉检测·音视频·gb28181·花屏·视频质量诊断·蓝屏检测
zhuweisky1 天前
ArkTS实现鸿蒙手机视频聊天、屏幕分享(HarmonyOS)
音视频·harmonyos·鸿蒙开发
XHW___0011 天前
webrtc 关键模块创建的时机
网络·音视频·webrtc
Leinwin1 天前
VibeVoice-ASR:突破60分钟长音频处理瓶颈,语音识别进入端到端时代
人工智能·音视频·语音识别