本人eclipse开发java,准备用的opencv进行合成视频,经查找需要javacv的支持。
于是找到最新的opencv-3.4.1,然后下载了对应的java支持javacv1.4.1
1、下载opencv、javacv
进入opencv官网下载opencv-3.4.1(https://ayera.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.4.1/opencv-3.4.1-vc14_vc15.exe 大概172M),再从(http://www.softpedia.com/get/Programming/Other-Programming-Files/JavaCV.shtml 大概390M)下载 javacv1.4.1的各环境支持
(如果需要可以再下载例子来看。opencv-3.4.1(https://codeload.github.com/opencv/opencv/zip/3.4.1 大概87M))
2、配置环境
解压opencv,解压javacv (eclipse、tomcat、jdk这两个就不用再说了吧)
配置opencv的路径,在Path增加指向opencv (本人是64位系统,我的指向路径是C:\opencv\opencv\build\x64\vc15\bin;C:\opencv\opencv\build\java\x64;)
说明一下 ...vc15\bin 是告诉java程序使用opencv的哪个版本进行视频的处理
...\build\java\x64 是告诉java程序 系统的支持需要的dll文件
其他环境说明:Tomcat用的是8 ,jdk用的是1.8
3、创建普通项目(window环境)
新建普通java项目,eclipse导入java包的支持,从javacv中取到ffmpeg.jar、javacpp.jar、javacv.jar、opencv.jar、javacv-platform.jar、ffmpge-windows-x86_64.jar、opencv-windows-x86_64.jar导到新项目中
以下是例子代码:在main函数中
//图片转换器
//在main函数中时要让系统去加载这个opencv的相关变量,其它有运行容器(如Tomcat)则不用
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage(); //申明一个图片处理的变量
//------------------->begin 初始化视频录制器
// 参数说明视频存储位置mergeMp4Path:xxx.mov,视频的宽和高
recorder = new FFmpegFrameRecorder(mergeMp4Path,MAX_W,MAX_H);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4); // 13
recorder.setFormat("mov"); //设置格式mov为快播短播
recorder.setFrameRate(FRAME_RATE); //此处说明每一秒多少帧,即说明1秒会录多少张照片
// recorder.setGopSize(FRAME_RATE*2); //这一步没有感觉到有多少影响,暂时不管
recorder.setVideoBitrate(8000000); //8000kb/s 这个说明视频每秒大小,值越大图片转过来的压缩率就越小质量就会越高
// recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); // yuv420p 先默认吧,这个应该属于设置视频的处理模式吧
// 不可变(固定)音频比特率
recorder.setAudioOption("crf", "0");
// 最高质量
recorder.setAudioQuality(0);
// 音频比特率
// recorder.setAudioBitrate(192000);
// 音频采样率
// recorder.setSampleRate(44100);
// 双通道(立体声)
recorder.setAudioChannels(2);
//------------------->end 初始化视频录制器
recorder.start();//开始录制
//------------------->begin 如果有多张,则以下代码则执行多次即可
String frame = "xxxx.jpg";//单张图片的位置
IplImage image = opencv_imgcodecs.cvLoadImage(frame); // 非常吃内存!!
Frame frame = conveter.convert(image);
recorder.record(frame); //录制
// 释放内存
cvLoadImage(fname); // 非常吃内存!!
opencv_core.cvReleaseImage(image);
//------------------->end 如果有多张,则以下代码则执行多次即可
//------------------->begin 开始录制音频
grabber = new FFmpegFrameGrabber(mp3Path);
grabber.start();// 开始录制音频
while ((audioSamples = grabber.grab()) != null) {
recorder.setTimestamp(grabber.getTimestamp()); //告诉录制器这个audioSamples的音频时长
recorder.record(audioSamples); //录入音频
}
//------------------->end 开始录制音频
grabber.stop();
grabber.release();
recorder.stop();
recorder.release();
到此图片和音频的动作就合成成功了
4、创建web项目(Windows 64位+Tomcat 8)
新建一个web项目,将ffmpeg.jar、javacpp.jar、javacv.jar、opencv.jar、javacv-platform.jar、ffmpge-windows-x86_64.jar、opencv-windows-x86_64.jar导到项目 WEB-INF的lib下,使项目引用了lib依赖并引用Tomcat依赖
将上述main函数抽成一个静态方法,例如是: AA.createVedio();
在web项目中新建一个Servlet,并在doPost和doGet调用 AA.createVedio();
此时项目成功访问,并能成功生成视频
5、搭建Linux环境(Linux Centos7 64位 + Tomcat 8)
将上述Windows + Tomcat项目中的 ffmpge-windows-x86_64.jar和opencv-windows-x86_64.jar换成Linux的jar包,从javacv中找到 ffmpge-linux-x86_64.jar和opencv-linux-x86_64.jar替换即可
这样项目的代码基本完成,接下来就是在linux环境搭opencv (jdk和Tomcat 就不再描述了)
将刚下载的opencv-3.4.1.zip 放到服务器,然后用cmake命令生成opencv的运行依赖
本人当时参照的是 https://www.cnblogs.com/hc101/p/7890115.html
当然我遇到的问题是如下
注意一下:
一、命令的使用cmake xxxx(opencv的源码路径我的是\opencv\sources) -D CMAKE_BUILD_TYPE=DEBUG -D CMAKE_INSTALL_PREFIX=/usr/local(/usr/local指的是什么,感觉没有用),这个命令在哪执行则它就会安装到哪里
二、配置环境变量
在/etc/profile 中首部加入
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
在/etc/ld.so.conf.d 增加opencv.conf
在opencv.conf 加入/usr/local/lib
sudo ldconfig //生效ID配置
source /etc/profile //生效环境变量
部署Tomcat ,将中的windows+Tomcat 的代码放到linux下,运行成功生成视频