javacv视频处理一:图片生成视频

本文介绍了如何利用javacv库结合opencv和FFmpeg处理视频,详细讲解了从创建FFmpegFrameRecorder对象到设置其属性,再到合成视频的步骤,并提供了全部的代码示例。
摘要由CSDN通过智能技术生成

javacv是基于opencv, FFmpeg, videoInput等计算机视觉库,方便的对视频,音频进行处理

github地址: javacv

 

第一步: maven引入:
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.3</version>
</dependency>

 

第二步:创建一个FFmpegFrameRecorder对象:

/**
* mp4SavePath mp4的生成目录
* width 视频宽
* height 视频高
*/
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(mp4SavePath, width, height);

第三步:设置FFmpegFrameRecorder的各种属性:

//设置视频编码层模式
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
//设置视频为25帧每秒
recorder.setFrameRate(25);
//设置视频图像数据格式
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
// mp4
recorder.setFormat("mp4");

第四步:开始合成:

recorder.start();
Java2DFrameConverter converter = new Java2DFrameConverter();
//录制一个22秒的视频
for (int i = 0; i < imgMap.size(); i++) {
  BufferedImage read = ImageIO.read(imgMap.get(i));
  //一秒是25帧 所以要记录25次
  for (int j = 0; j < 25; j++) {
       recorder.record(converter.getFrame(read));
  }
}

第五步:全部代码如下:

import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
 * 多张图片合成一个视频
 */
public class ImageToMp4 {

    static Logger log = LoggerFactory.getLogger(ImageToMp4.class);

    public static void main(String[] args) throws Exception {
        //合成的MP4
        String mp4SavePath = "C:\\Users\\admin\\Desktop\\111\\zip4\\img.mp4";
        //图片地址 这里面放了22张图片
        String img = "C:\\Users\\admin\\Desktop\\111\\zip4";
        int width = 1600;
        int height = 900;
        //读取所有图片
        File file = new File(img);
        File[] files = file.listFiles();
        Map<Integer, File> imgMap = new HashMap<Integer, File>();
        int num = 0;
        for (File imgFile : files) {
            imgMap.put(num, imgFile);
            num++;
        }
        createMp4(mp4SavePath, imgMap, width, height);
    }


    /**
     * @param mp4SavePath 生成MP4的目录
     * @param imgMap      图片目录
     * @param width       宽
     * @param height      长
     * @throws FrameRecorder.Exception
     */
    public static void createMp4(String mp4SavePath, Map<Integer, File> imgMap, int width, int height) throws FrameRecorder.Exception {
        //视频宽高最好是按照常见的视频的宽高  16:9  或者 9:16
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(mp4SavePath, width, height);
        //设置视频编码层模式
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        //设置视频为25帧每秒
        recorder.setFrameRate(25);
        //设置视频图像数据格式
        recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
        recorder.setFormat("mp4");
        try {
            recorder.start();
            Java2DFrameConverter converter = new Java2DFrameConverter();
            //录制一个22秒的视频
            for (int i = 0; i < imgMap.size(); i++) {
                BufferedImage read = ImageIO.read(imgMap.get(i));
                //一秒是25帧 所以要记录25次
                for (int j = 0; j < 25; j++) {
                    recorder.record(converter.getFrame(read));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //最后一定要结束并释放资源
            recorder.stop();
            recorder.release();
        }
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liming10101010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值