添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
ExoPlayer QoE 解读

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 Send First Rendered Time 
 // ... 
val videoQoEListener = VideoQoEListener() 
// exoplayer instance 
player.addAnalyticsListener(videoQoEListener) 
 

AnalyticsListener 常用指标说明
AnalyticsListener 提供了非常多的方法方便开发者进行调用,你可以去 官方文档 查看具体的含义,这里罗列一些非常有用的方法。

onMetadata

@Override 
public void onMetadata(EventTime eventTime, Metadata metadata) { 
 // TODO Handle Some Video MetaData 
} 


onMetadata 是一个非常重要的监听函数,你可以通过该方法判断视屏元信息的获取,并且拿到一些和视频 Header 相关的信息。

onVolumeChanged

@Override 
public void onVolumeChanged(EventTime eventTime, float volume) { 
 // 比较简单用于监听音量变化 
 

onRenderedFirstFrame

 @Override 
 public void onRenderedFirstFrame(EventTime eventTime, @Nullable Surface surface) { 
 // TODO 
    } 


顾名思义,表示第一帧解码完成,经常性的用于我们统计视频的起播时间。

onDroppedVideoFrames

@Override 
public void onDroppedVideoFrames(EventTime eventTime, int droppedFrames, long elapsedMs) { 
 // TODO  
} 


onDroppedVideoFrames 也非常有意义,可以用于我们出现的一些音画同步的现象上报。

onVideoSizeChanged

@Override 
public void onVideoSizeChanged(EventTime eventTime, int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) { 
 // TODO  
} 


这个比较好理解,主要用于 UI 的一些监听,当视频 PlayerView 发送改变后触发。

onBandwidthEstimate

 @Override 
public void onBandwidthEstimate(EventTime eventTime, int totalLoadTimeMs, long totalBytesLoaded, long bitrateEstimate) { 
    Log.e(TAG, "onBandwidthEstimate: 带宽估计 总加载时间"+totalLoadTimeMs+"   已加载的字节总数"+totalBytesLoaded +"应该是网速"+bitrateEstimate/(1024*1024)); 
} 


onBandwidthEstimate 也是非常有效的一个手段,用于检测用户的网络状况,你可以非常便捷的上报用户的宽带速度预估情况。

onSeekStarted 和 onSeekProcessed

 @Override 
public void onSeekStarted(EventTime eventTime) { 
    Log.e(TAG, "onSeekStarted:开始seek " ); 
@Override 
public void onSeekProcessed(EventTime eventTime) { 
    Log.e(TAG, "onSeekProcessed: seek 处理" ); 
} 


onSeekStarted onSeekProcessed 用于用户触发 Seek 操作的监听。

onLoadStarted 与 onLoadCompleted

@Override 
public void onLoadStarted(EventTime eventTime, MediaSourceEventListener.LoadEventInfo loadEventInfo, MediaSourceEventListener.MediaLoadData mediaLoadData) { 
 // showLoading();    
@Override