當視訊的DRM中繼資料與媒體資料流不同時,您應在開始播放之前進行驗證。
視訊資產可以有相關聯的DRM中繼資料檔案,例如:
"url": "https://www.domain.com/asset.m3u8"
"drmMetadata": "https://www.domain.com/asset.metadata"
在此範例中,您可以使用 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 DRMLoadMetadataListener {
public void onLoadMetadataUrlStart();
/**
* @param authNeeded
* whether DRM authentication is needed.
* @param drmMetadata
* the parsed DRMMetadata obtained. */
public void onLoadMetadataUrlComplete(boolean authNeeded, DRMMetadata drmMetadata);
public void onLoadMetadataUrlError();
}
以下是有關處理常式的其他詳細資料:
onLoadMetadataUrlStart
會偵測中繼資料URL何時開始載入。onLoadMetadataUrlComplete
會偵測中繼資料URL何時完成載入。onLoadMetadataUrlError
表示中繼資料無法載入。載入完成後,請檢查 DRMMetadata
物件來決定是否需要DRM驗證。
public static boolean isAuthNeeded(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處於錯誤狀態,並停止播放。 您的應用程式必須解決問題、重設播放器,然後重新載入資源。