我正面临一个非常烦人的问题,适用于 Android 的 Widevine 库。出于某种原因,在尝试使用 Widevine 流式传输 HLS 时,某些设备(特别是三星设备)在尝试播放时会出现以下错误:
WV_Info_GetCodecConfig ESDS 返回错误 2002
在此之后,由于它没有开始播放,我停止、重置并释放媒体播放器以及 DrmClient。
@Override
public void onCompletion(MediaPlayer mp) {
mPlayIndicator.setEnabled(false);
mSurfaceView.setVisibility(View.INVISIBLE);
mTimelineSeekBar.setMax(0);
if (PlayerEnvConfig.USE_DEBUG_LOGGING) {
Log.d("VideoPlayer", "ClosingVideoThread");
}
hideLoading();
if (mScheduleTaskExecutor != null) {
mScheduleTaskExecutor.shutdown();
}
if (mp != null) {
if (PlayerEnvConfig.USE_DEBUG_LOGGING) {
Log.d("VideoPlayer", "Stop Playing");
}
if (mp.isPlaying()) {
mp.stop(); // It's always safe to call stop()
}
if (PlayerEnvConfig.USE_DEBUG_LOGGING) {
Log.d("VideoPlayer", "Reset");
}
mp.reset();
if (PlayerEnvConfig.USE_DEBUG_LOGGING) {
Log.d("VideoPlayer", "Release");
}
mp.release(); // release resources internal to the MediaPlayer
mMediaPlayer = null; // remove reference to MediaPlayer to allow GC
}
// IMPORTANT: It is important to release the DRM client after releasing the media player other wise there are
// situations where the media player it is left in a bad state and does not play any more DRM protected content
// until the restart of the device.
// If the video is DRM protected then release the resource associated with the DRM.
if (mIsDrmProtected) {
mDrmManager.releaseDrmClient();
}
if (!mStopEventFired) {
// Fire the event into the bus to the subscribed views to replace the views accordingly
fireStopVideoPlaybackEvent();
}
}
以及 DrmManager 中用于释放 DrmClient 的代码:
@SuppressLint("NewApi")
public void releaseDrmClient() {
BusProvider.getInstance().unregister(this);
if (mDrmManagerClient != null) {
if (PlayerEnvConfig.USE_DEBUG_LOGGING) {
Log.d("DRMManager", "Releasing DRM");
}
mDrmManagerClient.removeAllRights();
// Starting from API 16 they included this function to release the drm client.
int currentApiVersion = android.os.Build.VERSION.SDK_INT;
if (currentApiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
mDrmManagerClient.release();
}
// Set to null so will be removed by the garbage collector
mDrmManagerClient = null;
if (PlayerEnvConfig.USE_DEBUG_LOGGING) {
Log.d("DRMManager", "Releasing DRM Finally");
}
}
}
好吧,它不播放。我可以确认所有这些代码都按照它们出现在日志中的方式执行。但这是真正的大问题,在这种情况下,一个进程留在后台(我无法在设备中找到进程的任何位置),就好像视频仍在播放一样,并且以下错误不断显示在日志。
WVSession::SetWarning: status=2014, desc=MPEG2-TS 连续性计数器错误
我意识到,因为第一稳定,设备变得非常热,第二可以使用wireshark来嗅探流量,我可以看到后台发出的请求。
这只发生在使用 HLS 和 Widevine 以及最后一个播放失败时。(权利实际上已正确检索和安装,但尝试播放时失败)。
有谁知道为什么会发生这种情况,特别是如何避免它?
顺便说一句:媒体播放器嵌入在一个片段中,这个片段在另一个片段中。
谢谢!