由于想要利用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.avutil
at 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=yasm
make -j $MAKEJ
make 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 latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "config.log" produced by configure as this will help
solve the problem.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
哎,真是千难万难啊。
在尝试使用javaCV调用ffmpeg API时,作者在CentOS系统下遇到编译javaCPP-presets的困难。文章详细记录了使用`mvn install --projects ffmepg`命令编译过程中遇到的avx2指令集不支持问题,导致编译失败。作者进入javacpp-presents源码目录,尝试`mvn install --projects ffmpeg`命令,但因设备不支持avx2导致libvpx目录下的源文件编译出错。为解决此问题,作者修改了cppbuild.sh脚本中的相关编译命令。

3947

被折叠的 条评论
为什么被折叠?



