CentOS系统下使用maven编译javaCPP-ffmpeg

来源:互联网 发布:python基础教程 知乎 编辑:程序博客网 时间:2024/04/29 04:54

由于想要利用javaCV调用ffmpeg的API,遇到了一个很奇怪的错误,在网上查了半天,真的很费力,最终问题还是没有解决,自己被一个问题困扰到了,却没有发现或许这个问题并不是一个问题,现在想想还真是有点郁闷,编译了一天还是没有编译成功。之前看的是(http://www.ibm.com/developerworks/cn/java/j-lo-cpp/)这篇博文的教程,说的很简单,但是中间遇到的问题还是很多的。

1、编译过程中使用mvn install --projects ffmepg命令编译,看到别人说在CentOS系统中,需要自己编译javaCPP-presets这个项目,然后自己就傻傻的跑去编译ffmpeg了,虽然目标不是很明确。编译ffmpeg的原因是,因为在程序中,发现了这样一个错误。

Exception in thread "Thread-2" java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutilat java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)<span style="white-space:pre"></span>at org.bytedeco.javacpp.Loader.load(Loader.java:464)<span style="white-space:pre"></span>at org.bytedeco.javacpp.Loader.load(Loader.java:409)<span style="white-space:pre"></span>at org.bytedeco.javacpp.avcodec$AVPacket.<clinit>(avcodec.java:1559)<span style="white-space:pre"></span>at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:149)<span style="white-space:pre"></span>at org.bytedeco.javacv.FFmpegFrameRecorder.<init>(FFmpegFrameRecorder.java:126)<span style="white-space:pre"></span>at javaCVTest1.GrabberShow.convert(GrabberShow.java:34)<span style="white-space:pre"></span>at javaCVTest1.GrabberShow.run(GrabberShow.java:64)<span style="white-space:pre"></span>at java.lang.Thread.run(Unknown Source)

google了半天还是没有找到解决的方法,所以傻傻的认为,只要自己能够编译ffmpeg成功,自己就能解决这个问题。

2、接下来就是苦逼的编译之路,下载好javacpp-presents源码,解压然后cd进去,然后使用mvn install --projects ffmpeg这条命令,然后就开始编译了。然后就开始报错了,maven就没怎么用过,感觉自己太渣了。说一下最主要的问题吧。

主要的问题是,在编译过程中会遇到avx2这个指令集(磨人的小妖精),由于我使用的设备不支持这个指令集所以编译过不去。主要是因为包含avx2这个指令集的源文件不能编译通过。所以我修改了xx/javacpp-presets/ffmpeg/cppbuild.sh脚本中的一些命令,因为avx2编译出错实在libvpx这个目录下的所以修改cppbuild.sh中对应该目录的执行命令语句

cd ../libvpx-$VPX_VERSION./configure --prefix=$INSTALL_PATH --enable-static --enable-pic --disable-examples --disable-avx2 --disable-unit_tests --target=x86_64-linux-gcc --as=yasmmake -j $MAKEJmake install
里面的--disable-avx2 --disable-unit_tests是我自己加的,目的是想要跳过avx2的编译过程,还有测试过程,因为测试过程中也会涉及到avx2指令集的一些参数,添加这两个参数之后,libvpx终于可以编译过去了,但是在编译ffmpeg中的libavcodec.so这个库时,里面又开始出现了avx2的相关参数,看到这里真的要疯了,又报错了,生无可恋,有大神看到的话可以帮忙看看,求帮助啊。

libavcodec/libavcodec.so: undefined reference to `vpx_sub_pixel_variance64x64_avx2'libavcodec/libavcodec.so: undefined reference to `vpx_variance32x32_avx2'libavcodec/libavcodec.so: undefined reference to `vpx_fdct32x32_rd_avx2'libavcodec/libavcodec.so: undefined reference to `vpx_mse16x16_avx2'libavcodec/libavcodec.so: undefined reference to `vpx_variance32x16_avx2'libavcodec/libavcodec.so: undefined reference to `vpx_get16x16var_avx2'libavcodec/libavcodec.so: undefined reference to `vpx_sad64x32_avg_avx2'collect2: error: ld returned 1 exit status
然后我把ffmpeg的configure配置命令也加上了--disable-avx2,但是还是出现了上边的问题,然后我又加上了--disable-avcodec这个参数结果出现了下边这个错误,我就崩溃了。

If you think configure made a mistake, make sure you are using the latestversion from Git.  If the latest version fails, report the problem to theffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.Include the log file "config.log" produced by configure as this will helpsolve the problem.[INFO] ------------------------------------------------------------------------[INFO] BUILD FAILURE
哎,真是千难万难啊。



0 0