Vitamio 填坑之路

1 篇文章 0 订阅
1 篇文章 0 订阅
    项目跟教育有关,那么就免不了跟视频打交道,之前的APP用的是安卓提供的原生的播放器,项目前期只是进行了简单的封装。
    后期由于不断的添加各种各样的功能(清晰度切换,线路切换,添加讲义,网络视频和本地下载视频切换播放,记忆播放,续播等等)。
    到目前为止已将近5000行代码(呵呵,TM除了老子,谁还看得懂)。
上个APP搞定后,不少学员强烈要求要视频可以倍速播放,我擦,IOS还好说(他们自带倍速播放),安卓嘛,就坑了!
视频倍速播放需要涉及到编解码(我TM是个搞Java的啊),没办法只能求助万能的互联网了!找了几个开源的视频播放器,最后定在另外VLC和Vitamio。
VLC看了半天,各种编译,想我这种菜鸟想搞也是没什么希望了。看了看Vitamio,Java层的代码还是蛮简单的,最新的版本是16年10月份的,有搞头!
下了Demo,找了项目中播放地址,加上防盗链,Run一下,OK,没问题!很好!按照文档设置播放速度,设到2.0倍速也能播放。
唯一不好的地方是音频和图像并不是很同步(绝大部分情况会出现,播放本地视频OK的),音频和图像大概有2到5秒的时差!(虽然不完美,还是可以接受的 =3=)。

开始整合项目:

    1.导入Vitamio的依赖工程。

(1)在Eclipse中的Demo跑通后,左键InitActivity项目,Export带.gradle文件。
(2)Android studio 的File ---->new----->Import Module 导入刚才导出的InitActivity依赖工程(导入之后可能在InitActivity的build.gradle文件中出错。
一般情况是编译版本之类的错,你将你原工程对应文件的相对应的配置copy过去,再重新编译一下就OK了)

导出依赖工程
Android studio导入依赖工程

    2.开始编写InitActivity中相应的代码(原InitActivity中的进度条丑的一逼,我们需要修改)。
    需要注意的地方就是控制条中各个组件对应的ID。还需要添加的按钮,就仿照着他的方式继续添加就OK了。
    最后加完之后的点击事件,你可以写接口在VideoView类中进行实现,或者暴露方法,在你自己的代码中实现(我是这种方式)。

修改后的MediaControler布局
原依赖工程中的注解,大意就是自己在定义控制器的时候,暂停/播放,进度条,视频名称这三个控件的ID不能改,必须是使用Vitamio定义好的

    3.底部控制器的布局搞定之后就是播放器的实施了(按照Demo来,一般都可以正常的播放)


    4.下面就开始填坑了。


    (1)seekTo(long msec)如果你的播放器有记忆播放(用户播放到一半,退出去了,下次进来从上次那个播放点开始播放),这个就是一个小坑。


这是VideoView中提供的seekTo方法
public void seekTo(long msec) {
    if (isInPlaybackState()) {
        android.util.Log.e("qqqqq",msec+"<--------------");
      mMediaPlayer.seekTo(msec);
      mSeekWhenPrepared = 0;
    } else {
        android.util.Log.e("ppppp",msec+"<--------------");
      mSeekWhenPrepared = msec;
    }
  }
Vitamio的官方文档告诉我们说,在以下这个接口seekTo()到你指定的播放地点了
public void setOnPreparedListener(OnPreparedListener l) {
  mOnPreparedListener = l;
}
然而,你调用之后并没有什么卵用,进度条确实向后跳了,但是很短的时间后又从头开始播放了。打断点,输出日志,看源码,对呀,并没有什么错啊!
怎么不跳呢!
呵呵,我的猜测是seekTo的调用应该是视频已经开始播放的时候才起作用。
也就是说OnpreparedListener的监听并没有监听的很准确,也就是监听到视屏要开始播放了,
但是并没有播放,这时候开始seek的话,并没有起作用(也可能是机型的问题,我的测试机是华为EMUI)。
我的解决办法是在OnpreparedListener监听后的500ms后再seek,成功了!

handler推迟0.5秒发送seek动作

(2)public void setVideoLayout(int layout, float aspectRatio)
根据文档的描述,这个方法是设置播放界面的尺寸和视频的宽高比例的。
在华为的机子上跑的很顺,横屏跟竖屏切换的时候并没有出现什么问题。
但是在小米(测试机用的4c ,note1),还有部分华为的机子上就出现了。
横屏时,不能填充父控件(其实填充了,你可以重写OnTouch方法进行识别),只占了播放的画布一部分。
测试之后发现其实是此方法中的getHolder().setFixedSize(mSurfaceWidth, mSurfaceHeight);

**mSurfaceWidth和mSurfaceHeight并没有发生变化**

这是方法体

setVideoLayout的方法体

解决的方案就是(重新定义一个方法,在布局发生变化的时候传入宽高进行重新设置):

public void setVedioLayout(int width,int height){
    LayoutParams lp = getLayoutParams();
    ViewGroup parent = (ViewGroup) getParent();
    lp.width = width;
    lp.height = height;
    Log.e("VIDEO3=====",lp.width+"============"+ lp.height);
    setLayoutParams(lp);
    getHolder().setFixedSize(width,  height);
}
(3)手机测试时是没有任何问题的,项目到目前为止很顺利。开始进行pad适配工作。问题又来了
dlopen failed: "libstlport_shared.so" has unexpected e_machine: 183
(当时很郁闷,手机没问题,官方Demo没问题,就整合到自己的项目中出现这种问题)
右边的框框中的so文件加载不到

MeddiaPlayer类

这个是Android studio导入工程后的配置问题。
需要在build.gradle加入下面的配置

ndk配置

还需要在gradle.properties配置一下这个

这里写图片描述

**注意的是都都是在你自己的工程中,而不是在依赖工程中。**

(3)最后一个问题并没有深究,估计也深究不出什么玩意!
FIND_NAME_SYM vvo, render_yuv #82
这个错误,报出来后APP并不崩溃,进度条上的视频总时长也没有什么问题!
但是!但是。。。它是黑屏的状态。加了Vitamio的技术交流群,看到有大牛说是机器渲染的问题,应该是什么方法搞反了。
我的解决方法是偶然测试出来的。具体是怎么回事,我也是不太明白!目前项目就先这样搞了!有问题再扯!
解决的方案是把对VideoView的错误监听事件和信息变化事件去掉就OK了(我的项目确实是这样解决了)!

这里写图片描述

好了,就扯到这了!有什么扯得不对的地方,希望大家指正!共同进步!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值