3

我正面临一个非常烦人的问题,适用于 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 以及最后一个播放失败时。(权利实际上已正确检索和安装,但尝试播放时失败)。

有谁知道为什么会发生这种情况,特别是如何避免它?

顺便说一句:媒体播放器嵌入在一个片段中,这个片段在另一个片段中。

谢谢!

4

0 回答 0