关于javaCV图片和音频合成视频的一处小坑



import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacpp.avutil;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.IplImage;
import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameRecorder.Exception;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.opencv.core.Core;

public class PictureAndAudioToVideo {

    public static void main(String[] args) throws Exception,
            org.bytedeco.javacv.FrameGrabber.Exception {
        // 图片转换器
        // 在main函数中时要让系统去加载这个opencv的相关变量
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        // ------------------->begin 初始化视频录制器
        // 参数说明mp4Path.mov,视频的宽和高
        //mp4Path  视频存储位置
        //imageWidth  视频宽
        //imageHeight 视频高
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss");

        String name = df.format(new Date())+"video.mp4";
        String mp4Path = "D:\\video\\f"+name;
        int imageWidth = 600;
        int imageHeight = 800;
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(mp4Path,	imageWidth, imageHeight);
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);	//MP4格式设置成H264,才能在html上播放
        // 设置格式mp4
        recorder.setFormat("mp4");
        // 此处说明每一秒多少帧,即说明1秒会录多少张照片
        recorder.setFrameRate(0.1); //0.01 代表100秒一张图
        // 8000kb/s 这个说明视频每秒大小,值越大图片转过来的压缩率就越小质量就会越高
        recorder.setVideoBitrate(8000000);
        // yuv420p
        recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
        // 先默认吧,这个应该属于设置视频的处理模式  不可变(固定)音频比特率
        recorder.setAudioOption("crf", "0");
        // 最高质量
        recorder.setAudioQuality(0);
        // 音频比特率
        recorder.setAudioBitrate(192000);
        // 音频采样率
         recorder.setSampleRate(44100);
        // 双通道(立体声)
        recorder.setAudioChannels(2);
        // ------------------->end 初始化视频录制器
        recorder.start();// 开始录制

        // ------------------->begin 图片处理开始
        OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage(); // 申明一个图片处理的变量
        // 图片目录的位置
        String imagesPath = "D:\\image\\";
        // 列出目录中所有的图片,都是jpg的,以1.jpg,2.jpg的方式,方便操作
        File file = new File(imagesPath);
        File[] flist = file.listFiles();
        for (int i = 1; i <= flist.length; i++) {
            IplImage image = opencv_imgcodecs.cvLoadImage(imagesPath + i + ".png"); // 非常吃内存!!
            Frame frame = conveter.convert(image);
            recorder.record(frame); // 录制
            // 释放内存 非常吃内存!!
            opencv_core.cvReleaseImage(image);
        }
        // ------------------->end 图片处理开始

        // ------------------->begin 开始录制音频
        String mp3Path = "D:\\music\\dome.mp3";
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(mp3Path);
        grabber.start();// 开始录制音频
        Frame audioSamples;
        while ((audioSamples = grabber.grab()) != null) {
            recorder.setTimestamp(grabber.getTimestamp()); // 告诉录制器这个audioSamples的音频时长
            recorder.record(audioSamples); // 录入音频
        }
        // ------------------->end 开始录制音频
        grabber.stop();
        grabber.release();
        recorder.stop();
        recorder.release();
    }
}


recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); //MP4格式设置成H264,才能在html上播放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值