當視訊的DRM中繼資料與媒體串流分開時,在開始播放之前先執行驗證。
視頻資產可以具有相關聯的DRM元資料檔案。 例如:
在這種情況下,請使用DRMHelper
方法下載DRM元資料檔案的內容,對其進行解析,並檢查是否需要DRM驗證。
使用loadDRMMetadata
載入中繼資料URL內容,並將下載的位元組剖析為DRMMetadata
。
與任何其他網路操作一樣,此方法是非同步的,建立自己的線程。
public static void loadDRMMetadata(
final DRMManager drmManager,
final String drmMetadataUrl,
final DRMLoadMetadataListener loadMetadataListener);
例如:
DRMHelper.loadDRMMetadata(drmManager, metadataURL, new DRMLoadMetadataListener());
由於操作是非同步的,因此最好讓用戶知道。 否則,他會納悶為什麼沒有開始播放。 例如,在下載和解析DRM元資料時顯示旋轉輪。
在DRMLoadMetadataListener
中實作回呼。 loadDRMMetadata
會呼叫這些事件處理常式(調度這些事件)。
public interface
<b>DRMLoadMetadataListener</b> {
public void
<b>onLoadMetadataUrlStart</b>();
/**
* @param authNeeded
* whether DRM authentication is needed.
* @param drmMetadata
* the parsed DRMMetadata obtained. */
public void
<b>onLoadMetadataUrlComplete</b>(boolean authNeeded, DRMMetadata drmMetadata);
public void
<b>onLoadMetadataUrlError</b>();
}
onLoadMetadataUrlStart
偵測中繼資料URL載入何時開始。onLoadMetadataUrlComplete
偵測中繼資料URL何時完成載入。onLoadMetadataUrlError
表示無法載入中繼資料。載入完成時,請檢查DRMMetadata
物件,以查看是否需要DRM驗證。
public static boolean <b>isAuthNeeded</b>(DRMMetadata drmMetadata);
例如:
@Override
public void onLoadMetadataUrlComplete(boolean authNeeded, DRMMetadata drmMetadata) {
Log.i(LOG_TAG + "#onLoadMetadataUrlComplete",
"Loaded metadata URL contents. Auth needed:" + authNeeded + ".");
if (!authNeeded) {
// Auth is not required. Start player activity.
showLoadingSpinner(false);
startPlayerActivity(ASSET_URL);
return;
}
如果不需要驗證,請開始播放。
如果需要驗證,請通過獲取許可證來執行驗證。
/**
* Helper method to perform DRM authentication.
*
* @param drmManager
* the DRMManager, used to perform the authentication.
* @param drmMetadata
* the DRMMetadata, containing the DRM specific information.
* @param authenticationListener
* the listener, on which the user can be notified about the
* authentication process status.
*/
public static void performDrmAuthentication(
final DRMManager drmManager,
final DRMMetadata drmMetadata,
final String authUser,
final String authPass,
final DRMAuthenticationListener authenticationListener);
為簡單起見,此示例明確為用戶的名稱和密碼編碼。
DRMHelper.performDrmAuthentication(drmManager, drmMetadata, DRM_USERNAME, DRM_PASSWORD,
new DRMAuthenticationListener() {
@Override
public void onAuthenticationStart() {
Log.i(LOG_TAG + "#onAuthenticationStart", "DRM authentication started.");
// Spinner is already showing.
}
@Override
public void onAuthenticationError(int major, int minor, String errorString, String serverErrorURL) {
Log.e(LOG_TAG + "#onAuthenticationError", "DRM authentication failed. " +
major + " 0x" + Long.toHexString(minor));
showToast(getString(R.string.drmAuthenticationError));
showLoadingSpinner(false);
}
@Override
public void onAuthenticationComplete(byte[] authenticationToken) {
Log.i(LOG_TAG + "#onAuthenticationComplete", "Auth successful. Launching content.");
showLoadingSpinner(false);
startPlayerActivity(ASSET_URL);
}
});
這也意味著網路通信,因此這也是非同步操作。 使用事件偵聽器檢查驗證狀態。
public interface DRMAuthenticationListener {
/**
* Called to indicate that DRM authentication has started.
*/
public void onAuthenticationStart();
/**
* Called to indicate that DRM authentication has been successful.
*
* @param authenticationToken
* the obtained token, which can be stored locally.
*/
public void onAuthenticationComplete(byte[] authenticationToken);
/**
* Called to indicate that an error occurred while performing the DRM
* authentication.
*
* @param major
* the major code.
* @param minorC
* the minor code.
* @param errorString
* the exception thrown.
* @param serverErrorURL
* the URL of the server
* on which the error occurred
*/
public void onAuthenticationError(int major, int minor,
String errorString, String serverErrorURL);
}
如果驗證成功,請開始播放。
如果驗證失敗,請通知使用者並不要開始播放。
您的應用程式必須處理任何驗證錯誤。 無法在播放TVSDK進入錯誤狀態之前成功驗證。 即,它將其狀態更改為ERROR,生成包含來自DRM庫的錯誤代碼的錯誤,並且重放停止。 您的應用程式必須解決問題、重設播放器,並重新載入資源。