基于javacv实现视频转mp4

背景:由于项目需求,需要将ts视频格式转成mp4格式,发现ffmpeg工具非常强大,遇是盯上了javacv。

第一步,导入jar包

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.4.4</version>
</dependency>

第二步,编写代码

import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacv.*;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.opencv_objdetect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;

import static org.bytedeco.javacpp.avutil.*;
import static org.bytedeco.javacpp.opencv_core.*;

/**
 * 视频工厂
 * @author Litluecat
 */
public class VideoFactoryUtils {
    private static final Logger log = LoggerFactory.getLogger(VideoFactoryUtils.class);

    //转换后的视频格式
    private static final String VIDEO_FORMAT =  ".mp4";
    
    public static void main(String[] args) throws Exception {
        VideoFactoryUtils.convertToMp4(new File("E:\\test.ts"));

    }

    /**
     * 转换视频文件为mp4
     * @param file 目标视频文件
     */
    public static void convertToMp4(File file) throws FrameRecorder.Exception, FrameGrabber.Exception {
        long startTime = System.currentTimeMillis();
        log.info("开始进行ts格式转MP4。。。");

        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(file);
        //视频比率,与清晰度有关
        grabber.setVideoBitrate(2000000);

        //转储后mp4文件地址
        String fileName = file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(".")) + VIDEO_FORMAT;;

        Frame frame = null;

        FFmpegFrameRecorder recorder = null;

        try {
            grabber.start();
            log.info("FFmpegFrameGrabber start已耗时:{}ms", (System.currentTimeMillis() - startTime));

            recorder = new FFmpegFrameRecorder(fileName, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels());
            recorder.setVideoCodec(grabber.getVideoCodec());
            recorder.setFormat(VIDEO_FORMAT);
            recorder.setFrameRate(grabber.getFrameRate());
            recorder.setVideoBitrate(grabber.getVideoBitrate());
            recorder.start();

            log.info("FFmpegFrameRecorder start已耗时:{}ms", (System.currentTimeMillis() - startTime));

            long changeSize = 0L;
            while ((frame = grabber.grabFrame()) != null) {
                recorder.setTimestamp(grabber.getTimestamp());
                recorder.record(frame);
                changeSize++;
            }

            log.info("视频转换总耗时:{}ms, 完成帧数:{}", (System.currentTimeMillis() - startTime), changeSize);
            log.info("转换后的视频地址:{}", fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            log.info("开始关闭FFmpegFrameGrabber、FFmpegFrameRecorder流链接。。。");
            recorder.stop();
            recorder.release();
            grabber.stop();
        }
    }
}

总结:之前使用opencv进行人脸识别、图像处理的时候就使用过javacv与ffmepg,只注重与opencv,没注意到后两者,也算是一次学习~

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值