Vitamio 填坑之路

2023-10-27 22:10
文章标签 之路 填坑 vitamio

本文主要是介绍Vitamio 填坑之路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    项目跟教育有关,那么就免不了跟视频打交道,之前的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了(我的项目确实是这样解决了)!

这里写图片描述

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

这篇关于Vitamio 填坑之路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/288733

相关文章

Xiaojie雷达之路---雷达间干扰(二)置零法对干扰抑制

Hello,大家好,我是Xiaojie,欢迎大家能够和Xiaojie来一起学习毫米波雷达知识,本篇文章主要是介绍一下时域置零对雷达间干扰抑制的效果,一起来看看吧!!! 文章目录 前言正文原理性介绍代码 前言 在上一篇文章中介绍了BPM对雷达间干扰抑制的方法,而本篇文章是采用时域置零的方法进行雷达间干扰抑制 效果图: 视频如下: 雷达间干扰 正文

uni-app填坑指南——解决处理处理静态资源的问题

说实在话,这个标题其实有点夸大了。 uni-app并没有不解决,而是解决的不够充分不够彻底。这里我们来讨论一下uni-app在处理静态资源的问题上的一些不足之处。 1. 问题描述 在uni-app中,我们可以将静态资源放在static目录下,然后通过相对路径的方式引用。比如我们有一个图片资源logo.png,我们可以通过<img src="@/static/logo.png" />的方式引用。

【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)

有关node-sass的深入分析可参考:又报gyp ERR!为什么有那么多人被node-sass 坑过? 主要有如下三方面错误,请自查: 1.node,npm版本需与node-sass版本匹配,像node-sass(^4.14.1)就得node 14.x版本才可以,node 16不行 gyp ERR! build error15 gyp ERR! stack Error: `

填坑之路-记录Redis操作的异常QueryTimeoutException RedisCommandTimeoutException: Command timed out after 1 min

默认配置 1.命令执行的默认超时时间为1分钟 2.默认的Lettuce集群配置里面才有命令执行超时时间,源码请看:LettuceConnectionFactory 3.修改命令超时时间,请手动修改配置构造器中的配置:LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder 中的setCommandTime

Java工程师成神之路 --一篇非常好的文章,让人获益匪浅!!!

一、基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://ifeve.com/jmm-faq/ 1.1.2. 了解JVM各种参数及调优 1.1.3. 学习使用Java工具 jps, jstack, jmap, jconsole

新浪微博的破局之路

当新浪发布上年第四季度财务报表并宣告微博首度实现盈利的前后,关于新浪微博上市的消息又被外媒报道出来,为这个资本狂欢的多事之春添上了又一场分量不轻的戏码。 必须强调的是,财务报表的公开,并不意味着只有到了这一天,新浪才知晓微博已能取得盈利,相反,随着财务数字的每日更新,加上对于趋势的估测和判断,新浪在去年第四季度尚未结束时,应当就能预读微博的盈利结果。 但是新浪微博必须等待财务报表披露出来

IOS成长之路-检测耳机插入/拔出

导入苹果的两个框架是必不可少的环节。。。 代码部分+小解: [cpp]  view plain copy - (void)viewDidLoad   {       [super viewDidLoad];       // Do any additional setup after loading the view, typically from a

前端学习之路6-事件

文章目录 概念捕捉目标冒泡 命名事件函数事件监听 概念 一个事件的生命周期包括三个阶段:捕捉(capture)、目标(target)和冒泡(bubbling) 捕捉 当某个事件被触发时,浏览器会找出事件涉及的元素,它被称为该事件的目标。浏览器会找出body元素和目标之间的所有元素并分别检查它们,看看它们是否带有事件处理器且要求获得其后代元素触发事件的通知。浏览器会先触发这些事

前端学习之路5-DOM

文章目录 操作事件 全局变量document是浏览器为我们创建的关键对象之一。Document对象向你提供文档的整体信息,并让你能够访问模型里的各个对象。 DOM(Document Object Model,文档对象模型)允许我们用JavaScript来探查和操作HTML文档里的内容。这样就给用js动态修改ui界面提供了机会。 DOM功能的多变性。第一种方式是使用某个

前端学习之路13-CSS布局

文章目录 盒子模型盒类型浮动定位position层叠顺序多列布局弹性盒布局 table布局 盒子模型 CSS中的一个基本概念是盒模型(box model)。可见元素会在页面中占据一个矩形区域,该区域就是元素的盒子(box),由四部分组成 盒类型 将display属性设置为block值会创建一个块级元素。块级元素会在垂直方向跟周围元素有所区别。通常在元素前后放置换行符也能