作者:郭嘉
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWells
一 Vitamio无法使用的错误
1.1 SO库相关问题
Error loading libs java.lang.UnsatisfiedLinkError: Library … libstlport_shared.so not found ________________________________________ java.lang.UnsatisfiedLinkError: Couldn't load vinit: findLibrary returned null ________________________________________ java.lang.UnsatisfiedLinkError: unloadOMX_native ________________________________________ Native libs libffmpeg.so not exists!
凡是此类错误,一般只有以下几种情况:
Vitamio只支持ARMv6+以上的CPU,如果报以上错误,说明不支持你的机器。(注意:模拟器要使用4.0以上)
没有调用检测解码包的代码(即没有解压解码包,Vitamio会根据当前CPU的类型自动解压相应平台的库),使用方法参照DEMO:
// ~~~ 检测Vitamio是否解压解码包 if (!LibsChecker.checkVitamioLibs(this)) return;
注意:Vitamio官方给出的Demo中res/raw目录下有个libarm.so也要拷贝到你的工程中,如下图所示:
没有以Library的方式使用Vitamio,漏拷贝了VitamioBundle里面的类库或代码,例如libvinit.so、libarm.so等。
如果您有自己的so,请参考Vitamio的libs文件夹(armeabi、armeabi-v7a、x86)将so拷贝、新建相应的文件夹。
如果您是从旧版本Vitamio升级过来,尤其是早期以集成方式使用的,而现在又以Library方式使用,请删除相关的类和文件(res/raw/libarm.so、libs下面的libvinit.so、io.vov.vitamio下面相应的类文件),最后改一下当前项目的versionCode(Vitamio根据当前项目的版本自动重新解压升级)。最后可以尝试卸载之前的app重新安装。强烈建议下载最新版本,先跑通官网例子,没有问题再自己集成,最后搞不定还可以直接在官网例子上修改。
极少数几款设备,比如华为S8600、三星GT-S5830(CPU是ARMv6+,但是无法使用)。
二 视频无法播放的错误
2.1 avformat_open_input: I/O error
确保视频没有问题。先拿VLC、系统自带的播放器或者PC上的播放器,测试一下链接,确保视频是可以播放的。
确保调用方法没有问题。参考官方的例子,先用官网例子测试一个可以播放的链接,然后再不改动其他的代码情况下仅更改播放地址进行测试。
确保测试环境一致。比如拿能上网的PC测试完后拿无法上网的手机测试,那肯定不行。
前面都确保没有问题后最后使用VPlayer来进行测试,如果VPlayer能够播放,那Vitamio一定能播放,否则只有一种情况:不支持!
2.2 java.io.FileNotFoundException: No content provider
这个不是错误,是正常的处理。现在播放视频是这样做的:先把 URL 当做一个 ContentProvider 来打开,如果打不开,就直接当做 URL 来打开
java.lang.SecurityException:Not allowed to bind to service Intent … VitamioService
如果手机上安装了VPlayer并且使用了旧版本(3.0以前)的Vitamio,可能会报这个错,可以简单理解为冲突,所以后续VitamioService这个类在3.0以后就没有了,还有相关的MediaScannerService也没有了。
2.3 java.lang.NoClassDefFoundError: io.vov.vitamio.R$raw
Vitamio 3.0默认以Android Library的方式使用,对raw的引用使用的io.vov.vitamio.R,如果不是以这种方式使用比如简单的拷贝合并就报这个错。建议以Android Library方式使用,便于后续升级。如果仍然坚持要拷贝合并,可以通过在本工程新建包名io.vov.vitamio,新建R类来实现:
package io.vov.vitamio; public class R { public static final class raw { public static final int libarm = com.nmbb.oplayer.R.raw.libarm; public static final int pub = com.nmbb.oplayer.R.raw.pub; } }
2.4 Fatal signal 11 (SIGSEGV) at 0xb77ea280 (code=1), thread 1243 (ov.vitamio.demo)
类似Fatal signal崩溃的问题,一般是MediaPlayer的生命周期没有使用正确。比如还没有prepare就去调用isPlaying等其他方法都会导致这个问题,使用系统的MediaPlayer也会抛出IllegalStateException的异常。建议去Android官网看文档:http://developer.android.com/reference/android/media/MediaPlayer.html。尤其是MediaPlayer的状态图。