Este tópico descreve como integrar o ApsaraVideo Player SDK ao Native RTS SDK no Android para ativar o RTS.
Integração do SDK
Adicione as dependências do ApsaraVideo Player SDK e do Native RTS SDK por um dos métodos a seguir:
Uso da API do SDK
Use a API do ApsaraVideo Player SDK para aproveitar o recurso RTS. Para detalhes sobre outros recursos do ApsaraVideo Player SDK, consulte Recursos avançados e Referência da API.
Os trechos de código a seguir servem apenas para demonstração. Para acessar o source completo, visite nosso projeto open-source.
Ao reproduzir um stream RTS com o ApsaraVideo Player SDK, não use o método
pause()para pausar a transmissão ao vivo. Em vez disso, chamestop()para interromper a reprodução e, em seguida, chameprepare()para reiniciá-la.A operação
seeknão tem suporte.
-
Carregue a biblioteca
Adicione
System.loadLibrary("RtsSDK");à Activity apropriada.static { System.loadLibrary("RtsSDK"); } -
Crie um player
A classe
AliPlayerFactoryoferece dois tipos de player:AliPlayereAliListPlayer. Para reproduzir uma única fonte de mídia, useAliPlayer. O código a seguir demonstra como criar uma instância deAliPlayer:AliPlayer aliyunVodPlayer; ..... aliyunVodPlayer = AliPlayerFactory.createAliPlayer(getApplicationContext()); -
Defina os listeners do player
O player disponibiliza diversos listeners para tratar eventos, como
onPreparedeonCompletion. O exemplo a seguir mostra como configurar esses listeners:aliyunVodPlayer.setOnErrorListener(new IPlayer.OnErrorListener() { @Override public void onError(ErrorInfo errorInfo) { // Called when an error occurs. } }); aliyunVodPlayer.setOnPreparedListener(new IPlayer.OnPreparedListener() { @Override public void onPrepared() { // Called when the player is prepared. } }); aliyunVodPlayer.setOnVideoSizeChangedListener(new IPlayer.OnVideoSizeChangedListener() { @Override public void onVideoSizeChanged(int width, int height) { // Called when the video resolution changes. } }); aliyunVodPlayer.setOnRenderingStartListener(new IPlayer.OnRenderingStartListener() { @Override public void onRenderingStart() { // Called when the first frame is rendered. } }); aliyunVodPlayer.setOnInfoListener(new IPlayer.OnInfoListener() { @Override public void onInfo(int type, long extra) { // Called for playback information events, such as loop start, buffering progress, or current position. } }); aliyunVodPlayer.setOnLoadingStatusListener(new IPlayer.OnLoadingStatusListener() { @Override public void onLoadingBegin() { // Called when buffering starts. } @Override public void onLoadingProgress(int percent, float kbps) { // Buffering progress. } @Override public void onLoadingEnd() { // Called when buffering finishes. } }); aliyunVodPlayer.setOnSubtitleDisplayListener(new IPlayer.OnSubtitleDisplayListener() { @Override public void onSubtitleShow(long id, String data) { // Called when a subtitle is displayed. } @Override public void onSubtitleHide(long id) { // Called when a subtitle is hidden. } }); aliyunVodPlayer.setOnTrackChangedListener(new IPlayer.OnTrackChangedListener() { @Override public void onChangedSuccess(TrackInfo trackInfo) { // Called when the track or resolution is switched successfully. } @Override public void onChangedFail(TrackInfo trackInfo, ErrorInfo errorInfo) { // Called when switching the track or resolution fails. } }); aliyunVodPlayer.setOnStateChangedListener(new IPlayer.OnStateChangedListener() { @Override public void onStateChanged(int newState) { // Called when the player state changes. } }); aliyunVodPlayer.setOnSnapShotListener(new IPlayer.OnSnapShotListener() { @Override public void onSnapShot(Bitmap bm, int with, int height) { // Called when a snapshot is captured. } }); -
Crie uma fonte de dados
O player aceita quatro tipos de fontes de reprodução:
VidSts,VidAuth,VidMpseUrlSource. Para usar o recurso RTS com reprodução direta por url, use o protocoloartc://na url ao trabalhar comUrlSource.UrlSource urlSource = new UrlSource(); urlSource.setUri("artc://"); aliyunVodPlayer.setDataSource(urlSource); -
Configure a view de exibição
Se a fonte de reprodução contiver vídeo, defina uma view de exibição para renderizar os quadros de vídeo. Há suporte tanto para
SurfaceViewquanto paraTextureView. O exemplo a seguir usaSurfaceView: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); } }); -
Controle de reprodução
Crie sua própria interface para os controles de reprodução e chame os métodos correspondentes do player nos manipuladores de eventos dos botões. O exemplo a seguir ilustra operações básicas de controle, como iniciar e parar:
// Prepare the player. In the onPrepared callback, call start() to begin playback. aliyunVodPlayer.prepare(); // Start playback. aliyunVodPlayer.start(); // Stop playback. aliyunVodPlayer.stop(); // Reset the player. aliyunVodPlayer.reset(); // Release the player. Once released, the player instance cannot be reused. aliyunVodPlayer.release(); -
Configure os parâmetros de reprodução
Ajuste os parâmetros de reprodução para otimizar o desempenho do RTS.
// Get the current configuration. PlayerConfig config = mAliyunVodPlayer.getConfig(); // Set the maximum latency to 1,000 ms. Latency is managed by the ARTC protocol. config.mMaxDelayTime = 1000; // Set the start buffer and high buffer duration to 10 ms. Buffering is managed by the ARTC protocol. config.mHighBufferDuration = 10; config.mStartBufferDuration = 10; ....// Other settings // Apply the configuration to the player. mAliyunVodPlayer.setConfig(config); -
Logging
// 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); -
Degradação de stream ao vivo
A degradação de stream ao vivo é uma estratégia de fallback que altera uma url de reprodução com prefixo
artc://para uma URL HTTP-FLV. Em seguida, atualize oUrlSourcedo player e reinicie a reprodução./** * Degradation strategy */ private void willBeDemoted() { mRtsAliPlayer.stop(); if (mUrl.startsWith("artc://")) { setDataSource("http://xxxx.flv"); mRtsAliPlayer.prepare(); } } -
Obtenção do TraceId
O evento
InfoCode.DirectComponentMSGno callbackonInfoindica uma mensagem de passagem direta do componente RTS subjacente. Para obter oTraceId, analise a stringextraMsgdesse evento. Quando a mensagem contivercode=104(evento de ID de rastreamento), extraia oTraceIdprocessando a substring após o delimitador-sub-.private static final int TRACE_ID_CODE = 104; // Listen for the player's 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); } } /** * Parses 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("\\", ""); } }
