查看详情

基于 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( 详情 »

查看详情

如何实现 Bilibili 视频播放Chrome 媒体控制效果

Chrome 最新的版本更新了媒体控制菜单的按钮 UI,也就是每次我们的网页产生声音或者视频时候,菜单栏头像附近,方便我们在多个 Tab 进行控制时候加的,方便我们操作这些网页 Tab 下面的音视频。 尤其最新的样式实现非常酷炫,加入对封面的支持,这样整体效果看着非常棒。 很早之前我们写过一篇关于 使用 mediaSession 实现媒体播放的通知栏控制 这里介绍了我们如何在网页播放音频的时候锁屏控件如何显示当前播放音乐的封面和简介,或者控制上一曲下去。 同意视频播放现在也可以,你只需要监听 MediaSession 的相关事件然后设置 mediaSession MetaData 的信息就好。 设置封面标题 if ('mediaSession' in navigator) { var data = mediaList[index] navigator.mediaSession.metadata = new MediaMetadata({ title: data.title, artist: data.director, artwork: [ { src: data.cover, sizes: '192x192' } ] }); } 进行播放控制 // $video has 详情 »

查看详情

IFrame 等开放服务存在的法律风险警示

目前很多视频服务商比如 Bilibili, 优酷, 腾讯等都支持基于 iFrame,将自己上传的视频或者别的作者的视频, 内嵌到自己的网站,从而提升内容或者宣传的质量。记得很早的时候火影忍者中文网就是嵌入的优酷的视频。 IFrame 不仅降低了接入成本,也降低了接入门槛,稍微懂点相关的知识就可以投放到自己的网站。但是这里实际上会存在一种安全警示。 我们知道腾讯视频除了(B站)是有前贴广告的,这么做是为了增加金主爸爸的品牌广告的曝光量。而基于 IFrame 的形式,很容易被一些广告主当做免费的视频托管平台,把自己的一些教程或者宣传该网站金主爸爸广告的视频嵌入到比较吸睛的内容上(赌博,色情等)。 不妨看下下面这张截图: 是不是很多人经常不慎点进去,为了方便大家使用,网站主可能会投一些教程视频,方便大家学习如何充值以及如何参与等。然而这里面的风险点,便是这样的网站对前贴曝光的品牌比如一些金主爸爸的(保洁,苹果,华为等),实际上是品牌影响的,就像很多人一看这个视频,会觉得是这些品牌在该网站的投放,从而进一步对该网站产生信任或者对该广告品牌产生质疑。 又或者在某些色情网站上,色情网站流量较大经常会嵌入一些游戏的广告链接导流,比如经常看到渣渣辉或者山鸡的传奇游戏广告,这些网站为了宣传游戏的吸引力会投入一些视频做宣传。因此这些色情网站也会嵌入到当前网站中。 然而风险点同样在于前贴广告的曝光,会非常影响这些广告主品牌效应,你想想你在浏览 xxx 网站,刚好你是某品牌的员工,看到自家的广告在这样的网站上播放,可能内心一种无奈在心头,又或者更多问号在头上? 所以我们在做任何开放服务尤其基于 iFrame 做好对 详情 »

查看详情

七月天

傍晚渐渐吹起了热风,我知道暑假来了。 暑假的日子 最近迷雾剧场,《隐秘的角落》不断刷着信息流。当然自己也不忘记追剧。排除里面神秘的案情和一些小细节。自己印象最深的便是开篇,朱朝阳知道妈妈又要去值班的时候,飞奔出去寻找小伙伴的时刻。自己依稀记得,暑假天,会和小伙伴冒着35度的烈日去爬山,然后去学游泳,或者沿着河边抓鱼,一行三人,回来的时候再一起吃起冰糕。爬山的时候便也希望能偶遇电视剧中神秘的山洞,又或者遇到神秘奇珍异兽什么的。可是最后似乎也神秘都没有。日子渐久远,似乎这三人小伙伴,也很久没相遇了,暑假天的日子,还是让人欢喜不少。 业余的开发 最近一直在做之前完全没涉猎的 Android 。想起上一次开发完整手写 Java 代码的时候还是14年 黑客马拉松的比赛。确实真的是变成了 面向 stackoverflow , 大概整体感受对于界面这种重构还是觉得 Web 前端还是挺优势的,效率和设计都挺好的,iOS 无论是 swift 还是 Android xml 写着还是挺别扭的。所以还是长期看好 flutter 或者 react native 这种设计模式。不过话说回来,就是整体 kotlin 详情 »

查看详情

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 详情 »

查看详情

六月天

刚迈入六月份,虽然夏天的风吹起来了,就是还是大了点。 创业 还是愿意在月记里穿插些关于创业的体会。最近 SpaceX 载人飞船的事情,朋友圈刷屏了。大概很多人是觉得,新的领域需要特别坚持的人才。任何事情,收益会在坚持里不断增长,虽然 90 后跳槽很频繁,虽然跳槽会有超出预期的收益,但是长期收益不一定很好。一万小时理论,在任何行业或者某些事情一定是成立的。创业中后期,需要热情,也需要科学化的管理策略,我也特别赞同,并不是所有人都适合创业,它对 人心的磨砺,远超所谓技能或者某些方面的知识的要求高多了。创业一定是一件自我怀疑的事情。如果你特别看好领域,坚持投入,一定有回报的,保持耐心。 可奈 五月底和狼叔吃了顿饭。得知远去杭州淘宝,大概我也觉得这是菜爷走后,整个大前端团队的的尾声。记得17年五月份也是这个时候,那个时候还在忙军师联盟的事情,第一次写关于 YK 的一些看法: 最近在YK那边,其实圈子氛围挺好的,既然我们过去就肯定是希望带来一些 change的,改变或多或少是痛苦,但是谁 TM 叫 A 买了。自己买的东西总不能让它自由生长吧,自己不方便谈论战略性的问题,但是未来会证明, 详情 »

[Netflix Diary]2020-05-27

今天第一件事情就是停掉了阿里云那个轻应用服务器。感觉又是活动想薅羊毛结果自己赔本的事情,什么东西都没弄然后就过期了。 晚上和狼叔吃了一顿饭。他远去杭州淘宝做前端智能化。自己把 niou 的介入化为大优酷前端的转折点,菜爷离开北京,把团队留给  niou ,然后开始了优酷第二代前端的组建工作。现在看看一代这些前端离去,真的是各种滋味在心头。总的来说大文娱的发展已经看到在三家中开始显现颓势了。晚上回去已是十点半,看了下 kotlin 的课程,发现也还是帮助不少。 详情 »

【Netflix Diary】2017-05-26

今天开始想 Netflix 面试的事情。其实这个说句实话我自己都觉得没谱。但是最近看 30 岁的视频,总觉得这一辈子少有为了一件事情特别努力的情况。最近看了一些翻墙去谷歌和FB 的比比皆是。当然也不是没什么机会。 我觉得 Netflix 面试需要准备三个方面的东西。 算法 英语 基础知识 大概也是从今天开始制定了每周的一个计划和日程,目标是十月份准备第一次 interview 挑战 , 其实这个年龄还想着,但是自己总觉得还是应该为梦拼一次。上一次连载日记还是创业的时候,自己一直想的是人还是应该多少为一些事情努力到无悔。 大概必须得每天腾出时间学习和记忆。一直觉得记忆很重要,需要记住很多东西才有效。 今天开始,你值得努力。 详情 »

查看详情

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: 详情 »