このトピックでは、Android で ApsaraVideo Player SDK と Native RTS SDK を統合してRTS (リアルタイムストリーミング) を有効にする方法について説明します。
SDK 統合
次のいずれかの方法を使用して、ApsaraVideo Player SDK と Native RTS SDK の依存関係を追加します。
SDK API の使用
ApsaraVideo Player SDK API を呼び出して RTS 機能を使用します。ApsaraVideo Player SDK のその他の機能の詳細については、「高度な機能」および「API リファレンス」をご参照ください。
-
以下のコードスニペットはデモ用です。完全なソースコードについては、オープンソースプロジェクトをご参照ください。
-
ApsaraVideo Player SDK で RTS ストリームを再生する場合、
pause()メソッドを呼び出してライブストリームを一時停止することはできません。代わりに、stop()を呼び出して再生を停止し、その後prepare()を呼び出して再開する必要があります。 -
seek操作はサポートされていません。
-
ライブラリのロード
適切な Activity に
System.loadLibrary("RtsSDK");を追加します。static { System.loadLibrary("RtsSDK"); } -
プレーヤーの作成
AliPlayerFactoryクラスは、AliPlayerとAliListPlayerの2種類のプレーヤーを提供します。単一のメディアソースを再生するには、AliPlayerを使用します。次のコードは、AliPlayerインスタンスを作成する方法を示しています。AliPlayer aliyunVodPlayer; ..... aliyunVodPlayer = AliPlayerFactory.createAliPlayer(getApplicationContext()); -
プレーヤーリスナーの設定
プレーヤーは、
onPreparedやonCompletionなどのイベントを処理するためのさまざまなリスナーを提供します。次のコードは、これらのリスナーを設定する方法を示しています。aliyunVodPlayer.setOnErrorListener(new IPlayer.OnErrorListener() { @Override public void onError(ErrorInfo errorInfo) { // エラー発生時に呼び出されます。 } }); aliyunVodPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { // プレーヤーの準備が完了したときに呼び出されます。 } }); aliyunVodPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(int width, int height) { // ビデオの解像度が変更されたときに呼び出されます。 } }); aliyunVodPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() { @Override public void onRenderingStart() { // 最初のフレームがレンダリングされたときに呼び出されます。 } }); aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() { @Override public void onInfo(int type, long extra) { // ループ開始、バッファリングの進行状況、現在の位置などの再生情報イベントで呼び出されます。 } }); aliyunVodPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() { @Override public void onLoadingBegin() { // バッファリング開始時に呼び出されます。 } @Override public void onLoadingProgress(int percent, float kbps) { // バッファリングの進行状況。 } @Override public void onLoadingEnd() { // バッファリング終了時に呼び出されます。 } }); aliyunVodPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() { @Override public void onSubtitleShow(long id, String data) { // 字幕が表示されたときに呼び出されます。 } @Override public void onSubtitleHide(long id) { // 字幕が非表示になったときに呼び出されます。 } }); aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() { @Override public void onChangedSuccess(TrackInfo trackInfo) { // トラックまたは解像度の切り替えに成功したときに呼び出されます。 } @Override public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) { // トラックまたは解像度の切り替えに失敗したときに呼び出されます。 } }); aliyunVodPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() { @Override public void onStateChanged(int newState) { // プレーヤーの状態が変化したときに呼び出されます。 } }); aliyunVodPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() { @Override public void onSnapShot(Bitmap bm, int with, int height) { // スナップショットがキャプチャされたときに呼び出されます。 } }); -
データソースの作成
プレーヤーは、
VidSts、VidAuth、VidMps、UrlSourceの4種類の再生ソースをサポートしています。URL 直接再生で RTS 機能を使用するには、UrlSourceを使用する際に URL でartc://プロトコルを使用する必要があります。UrlSource urlSource = new UrlSource(); urlSource.setUri("artc://<your_streaming_url>"); aliyunVodPlayer.setDataSource(urlSource);</your_streaming_url> -
表示ビューの設定
再生ソースにビデオが含まれている場合、ビデオフレームをレンダリングするために表示ビューを設定する必要があります。
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); } }); -
再生コントロール
再生コントロール用の独自の UI を作成し、ボタンのイベントハンドラで対応するプレーヤーメソッドを呼び出す必要があります。次の例は、再生や停止などの基本的なコントロール操作を示しています。
// プレーヤーを準備します。onPrepared コールバックで start() を呼び出して再生を開始します。 aliyunVodPlayer.prepare(); // 再生を開始します。 aliyunVodPlayer.start(); // 再生を停止します。 aliyunVodPlayer.stop(); // プレーヤーをリセットします。 aliyunVodPlayer.reset(); // プレーヤーを解放します。一度解放すると、プレーヤーインスタンスは再利用できません。 aliyunVodPlayer.release(); -
再生パラメーターの設定
再生パラメーターを設定して、RTS のパフォーマンスを最適化します。
// 現在の設定を取得します。 PlayerConfig config = mAliyunVodPlayer.getConfig(); // 最大レイテンシーを 1,000 ms に設定します。レイテンシーは ARTC プロトコルによって管理されます。 config.mMaxDelayTime = 1000; // 開始バッファーと高バッファーの持続時間を 10 ms に設定します。バッファリングは ARTC プロトコルによって管理されます。 config.mHighBufferDuration = 10; config.mStartBufferDuration = 10; ....// その他の設定 // 設定をプレーヤーに適用します。 mAliyunVodPlayer.setConfig(config); -
ログ記録
// ログ記録を有効にします Logger.getInstance(context).enableConsoleLog(true); Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_TRACE); // ログ記録を無効にします Logger.getInstance(context).enableConsoleLog(false); Logger.getInstance(context).setLogLevel(Logger.LogLevel.AF_LOG_LEVEL_NONE); -
ライブストリームのデグレード
ライブストリームのデグレードは、再生 URL の
artc://プレフィックスを HTTP-FLV URL に変更するフォールバック戦略です。その後、プレーヤーのUrlSourceを更新して再生を再開できます。/** * デグレード戦略 */ private void willBeDemoted() { mRtsAliPlayer.stop(); if (mUrl.startsWith("artc://")) { setDataSource("http://xxxx.flv"); mRtsAliPlayer.prepare(); } } -
TraceId の取得
onInfoコールバックのInfoCode.DirectComponentMSGイベントは、基盤となる RTS コンポーネントからのパススルーメッセージを示します。TraceIdを取得するには、このイベントのextraMsg文字列を解析します。メッセージにcode=104(トレース ID イベント) が含まれている場合、-sub-デリミタに続く部分文字列を解析することでTraceIdを抽出できます。private static final int TRACE_ID_CODE = 104; // プレーヤーの onInfo コールバックをリッスンし、RTS イベントメッセージを解析します。 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); } } /** * 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("\\", ""); } }
