查看详情

ExoPlayer QoE 解读

对于很多初次尝试播放器的同学而言,在完成基本的开发的下一步,是需要对整个播放状况有个初步的认识,其中需要涉及到埋点设计和实现,因此这一块,对于新手而言是非常有难度的。 之前写过文章 基于 Android EXOPlayer 创建视频播放器 介绍过 ExoPlayer。它是谷歌开源的一款播放器,目前用于 YouTube 生产线,我推荐新手区学习它的原因,它整体包很小,里面有很多不错的实现帮助我们去理解播放最基本的事情。当然如果在生产线,还需要结合自己的实际情况取舍,可以参考 Ijkplayer、ExoPlayer、VLC播放器综合比较 的对比,再做实际选择,这里从 ExoPlayer 为基础,分析整个如何确保我们播放体验(QoE)文档。 接入 AnalyticsListener AnalyticsListener 是 Exoplayer 里面实现的一个接口,用于使用该播放器的开发同学方便的进行播放指标相关的统计。 class VideoQoEListener() : AnalyticsListener { override fun onRenderedFirstFrame(eventTime: AnalyticsListener.EventTime, surface: Surface?) { // Add Your Code to 详情 »

查看详情

Android WebView onPageFinished 对于 Document 意味着什么?

这是因为之前遇到一个线上问题引起的,这篇文章阅读的对象也比较适合 Android 和前端阅读。 我们说下 标题的 Document 对象,这个对 Android 开发者而言有些陌生,可以详见 MDN 里面的解释,简单的说就是它可以去代表我们要加载的这个网页对象。里面包含一些基本的信息和所谓生命周期。 Android WebView 提供了基于 WebViewClient 的页面周期的监听方法,常见的有: onPageStarted 当页面开始请求 onPageFinished 页面完成加载 onReceivedError 当加载出现错误的时候 更多方法可以详见 https://developer.android.com/reference/android/webkit/WebViewClient 在 JS 中,我们监听页面加载有两种常见的方法,一种是监听 window.onload 另外一个是 document 里的 readychange 来实现的。 其中 window.onload 定义是当页面完全加载时候触发,包括页面的上包含的图片和样式资源,脚本资源。 而 详情 »

查看详情

基于 Android EXOPlayer 创建视频播放器

谷歌在开放 Android 套件的时候也非常方便的把自家的 Youtube 播放相关的前端开源总结了出来,也就是我们经常提到的 ExoPlayer 。这里也顺道说下其他端,如果你是 Web 端,你可以使用 谷歌家的 shaka-player , 如果你是 iOS 的话,你可以使用 AVPlayer 。他们都提供从基础 UI 空间到自适应分辨率的支持。当然你也可以选择其他框架。 创建一个简单的 MP4 播放器 首先我们引入依赖 implementation 'com.google.android.exoplayer:exoplayer:2.11.7' 这里我是直接用的最新的版本 2.11.7 接下来我们需要做一些初始化的工作 val player = SimpleExoPlayer.Builder(context!!).build() exoplayer_view.player = player val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory( 详情 »

查看详情

Android 自定义滚动条

做前端肯定离不开设计师要求自定义滚动条内容,相对于 iOS / Web ,Android 相对比较容易控制,我们可以非常方便的改变 View 或者 WebView 的样式。Android 提供了两个 xml 属性 android:scrollbarThumbVertical android:scrollbarTrackVertical 他们分别表示我们需要改变滚动条的拖拽部分和底部轨道的样式。 如下图 比较常规的设计,我们实现一个带圆角的矩形,我们在 drawable 目录下新建两个文件 custom_scrollbar_thumbnail.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > 详情 »

查看详情

修复 Android Studio Error while executing: am start -n 启动失败

大概这种问题只会突然出现,就是在真机调试突然报这样的错误 Error while executing: am start -n "com.xxx/com.xx.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=pagekageName/.ac.WelcomeActivity } Error type 3 Error: Activity class {com.xxx/com.xx.MainActivity} does not exist. Error 详情 »

查看详情

Swift 和 Kotlin 获取代码执行行数和文件名

如果我们需要需要实现一个类似打印当前函数调用的文件名和函数的化,我们需要借助一些类库。 在 swift 中我们可以借助 #file 和 #line 来实现数据获取/。 类似 public static func log(file: String = #file, line: Int = #line) { } 而在 Android 我们需要借助 Thread 来实现 var str = "" try { val filename = Thread.currentThread().stackTrace[your_trace_index].fileName val line = Thread.currentThread().stackTrace[your_trace_index].lineNumber str = " $filename [l$line]" } catch (err: 详情 »