このトピックでは、Android用Native RTS SDKをApsaraVideo Player SDKと統合して、リアルタイムストリーミング (RTS) 機能を使用する方法について説明します。
SDK 統合
次の方法を使用して、ApsaraVideo Player SDKとNative RTS SDKの依存関係を追加できます。
ApsaraVideo Player SDKの呼び出しメソッド
ApsaraVideo Player SDKのメソッドを呼び出して、RTS機能を使用します。 ApsaraVideo Player SDKの機能の詳細については、「高度な機能およびApsaraVideo Player SDK For AndroidのAPI操作」をご参照ください。
次のサンプルコードに例を示します。 完全なコードの詳細については、オープンソースプロジェクトページをご覧ください。
ApsaraVideo Playerに基づいてRTS経由でストリームプルを実行する場合、一時停止メソッドを呼び出してライブストリームを一時停止することはできません。 stopメソッドを呼び出してライブストリームの再生を停止し、prepareメソッドを呼び出してライブストリームを再度再生することができます。
seeingはサポートされていません。
ライブラリを読み込む
ビジネス要件に基づいて、必要なアクティビティに
System.loadLibrary("RtsSDK");
を追加します。static { System.loadLibrary("RtsSDK"); }
プレーヤーを作成する
AliPlayerFactoryクラスを使用してプレーヤーを作成します。 AliPlayerとAliListPlayerの2種類のプレイヤーを作成できます。 単一のストリームを再生する場合は、AliPlayerを使用します。 次のコードを実行して、AliPlayerを作成できます。
AliPlayer aliyunVodPlayer; ..... aliyunVodPlayer = AliPlayerFactory.createAliPlayer(getApplicationContext());
プレーヤーリスナーの設定
ApsaraVideo Player SDKは、onPreparedやonCompletionなどのさまざまなリスナーを提供します。 次のコードを実行して、リスナーを設定できます。
aliyunVodPlayer.setOnErrorListener(new IPlayer.OnErrorListener() { @Override public void onError(ErrorInfo errorInfo) { // Listens to the occurrence of errors. } }); aliyunVodPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { // Listens to successful preparation. } }); aliyunVodPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(int width, int height) { // Listens to the change of video resolution. } }); aliyunVodPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() { @Override public void onRenderingStart() { // Listens to the display of the first frame. } }); aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() { @Override public void onInfo(int type, long extra) { // Listens to other events, such as the start of loop playback, the buffer position, the current playback position, and the start of autoplay. } }); aliyunVodPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() { @Override public void onLoadingBegin() { // Listens to the start of buffering. } @Override public void onLoadingProgress(int percent, float kbps) { // Listens to the buffering progress. } @Override public void onLoadingEnd() { // Listens to the end of buffering. } }); aliyunVodPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() { @Override public void onSubtitleShow(long id, String data) { // Listens to the display of subtitles. } @Override public void onSubtitleHide(long id) { // Listens to the hiding of subtitles. } }); aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() { @Override public void onChangedSuccess(TrackInfo trackInfo) { // Listens to the success of switching between audio and video streams or between resolutions. } @Override public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) { // Listens to the failure of switching between audio and video streams or between resolutions. } }); aliyunVodPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() { @Override public void onStateChanged(int newState) { // Listens to the change of player status. } }); aliyunVodPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() { @Override public void onSnapShot(Bitmap bm, int with, int height) { // Listens to the capture of snapshots. } });
再生ソースの設定
ApsaraVideo Playerは、VidSts、VidAuth、VidMps、UrlSourceの4種類の再生ソースをサポートしています。 UrlSourceは、URLベースの再生に使用されます。 UrlSourceを使用する場合、RTS機能を使用するには、URLのプレフィックスに
artc://
を付ける必要があります。UrlSource urlSource = new UrlSource(); urlSource.setUri("artc://<Streaming URL>"); aliyunVodPlayer.setDataSource(urlSource);
ユーザーインターフェイス (UI) ビューを設定する
再生ソースにビデオ画像が含まれている場合は、ビデオ画像を表示するようにUIビューを設定する必要があります。 SurfaceViewとTextureViewがサポートされています。 SurfaceViewのサンプルコード:
surfaceView = (SurfaceView) findViewById(R.id.playview); surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { aliyunVodPlayer.setDisplay(holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { aliyunVodPlayer.surfaceChanged(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { aliyunVodPlayer.setDisplay(null); } });
再生コントロールの設定
再生コントロールを実装するには、再生コントロールボタンを作成し、クリックイベントを再生コントロールメソッドに関連付ける必要があります。 基本的な制御機能には、再生と停止が含まれます。 サンプルコード:
// Prepare for playback. You can specify the start() method in the callback so that the playback starts upon the completion of preparation. aliyunVodPlayer.prepare(); // Start playback. aliyunVodPlayer.start(); // Stop playback. aliyunVodPlayer.stop(); // Reset the player. aliyunVodPlayer.reset(); // Release the player. The player cannot be used after it is released. aliyunVodPlayer.release();
再生パラメータの設定
再生パラメーターを設定して、RTS効果を改善できます。
// Query the configurations. PlayerConfig config = mAliyunVodPlayer.getConfig(); // Set the maximum latency to 1 second. The Alibaba Real-Time Communication (ARTC) protocol controls the latency. config.mMaxDelayTime = 1000; // Set the buffer period to 10 milliseconds. The ARTC protocol controls the buffer period. config.mHighBufferDuration = 10; config.mStartBufferDuration = 10; .... // Configure other settings. // Load the settings for the player. mAliyunVodPlayer.setConfig(config);
ロギングの有効化または無効化
// Enable logging. Logger.getInstance(context).enableConsoleLog(true); Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_TRACE); // Disable logging. Logger.getInstance(context).enableConsoleLog(false); Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_NONE);
ライブストリーミングに劣化したプロトコルを使用する
ソースURLのプレフィックスをartc:// からHTTP-FLV形式に変更し、ApsaraVideo PlayerでUrlSourceを更新できます。 これにより、劣化したプロトコルを使用してライブストリームを再生できます。
/** * Configure the degradation policy. */ private void willBeDemoted() { mRtsAliPlayer.stop(); if (mUrl.startsWith("artc://")) { setDataSource("http://xxxx.flv"); mRtsAliPlayer.prepare(); } }
TraceIdの取得
再生コンポーネントによって渡されたメッセージがプレーヤーイベントのコールバックで返されたら、プレーヤーイベントを説明するJSON文字列を解析します。 取得するコードは、RTS SDKのメッセージです。 E_HELP_SUPPORT_ID_SUBSCRIBEを受け取ったら、文字列の "-sub-" の後の部分を解析してTraceIdを取得します。
private static final int TRACE_ID_CODE = 104; // 1. Listen to the onInfo callback and parse the RTS event message. mRtsAliPlayer.setOnInfoListener(infoBean -> { if (infoBean.getCode() == InfoCode.DirectComponentMSG) { String extraMsg = infoBean.getExtraMsg(); parseDirectComponentMSG(extraMsg); } }); private void parseDirectComponentMSG(String msg) { if (msg.contains("code=" + TRACE_ID_CODE)) { parseTraceId(msg); } } /** * Parse the TraceId. */ private void parseTraceId(String msg) { String[] split = msg.split("-sub-"); if (split.length >= 1) { mTraceId = "RequestId:" + (split[1].substring(0, split[1].length() - 1)); mTraceId = mTraceId.replace("\"", "").replace("\\", ""); } }