Link Visual App端SDK提供了音视频播放、语音对讲等功能。

依赖SDK 概述
API通道 提供API通道能力

初始化

在初始化Link Visual视频Media SDK前,需要正确集成安全图片。详细请参见集成安全图片

依赖引入

// 1. 在根目录下的build.gradle中添加Aliyun Maven仓库的引用
allprojects {
    repositories {
        maven {
            url "http://maven.aliyun.com/nexus/content/repositories/releases"
        }
    }
}

// 2. App build.gradle中添加依赖
implementation('com.aliyun.iotx:linkvisual-media:1.2.21-ilop') 

更多版本发布信息请看Link Visual SDK更新记录

混淆配置

# keep and don't warn Link Visual

-dontwarn com.aliyun.iotx.linkvisual.**
-dontwarn com.google.android.exoplayer2.**

-keep class com.aliyun.iotx.linkvisual.media.** { *; }

使用方式

视频播放器按功能分为三种。

  • 直播播放器
    • 用于RTMP直播源,具有时延低的特点。
    • 支持P2P(需使用接入Link Visual设备端SDK的摄像头)。
  • 设备录像点播播放器

    用于设备录像回放的播放,可调整播放进度。

  • HLS播放器
    • 用于基于HLS的云端录像回放的播放,支持MPEG-TS和fMP4容器,AES-128加密方式。
    • 提供两种HLS播放器供选择:自研HLS播放器和基于ExoPlayer封装的播放器。
功能 直播播放器 设备录像点播播放器 HLS播放器(自研) HLS播放器(ExoPlayer)
视频播放
音频播放
暂停/恢复 x
跳至指定位置播放 x
总时长 x
当前播放进度 x
播放器状态变更通知
设置播放音量
变速播放 x
循环播放 x x x
单帧步进 x x
画面缩放模式设置
播放器截图
截图到文件 x
边播边录 x
硬解码
数字变焦
提供YUV数据 x
提供SEI数据 x

播放器的使用样例代码如下:

  • 直播播放器
    // 构造播放器实例
    LivePlayer player = new LivePlayer(getApplicationContext());
    
    // 设置textureview
    player.setTextureView(textureView);
    // 设置必要的状态监听
    player.setOnPlayerStateChangedListener(new OnPlayerStateChangedListener() {
        @Override
        public void onPlayerStateChange(int playerState) {
            Log.d(TAG, "play state= " + playerState);
            switch (playerState) {
                case Player.STATE_BUFFERING:
                    break;
                case Player.STATE_IDLE:
                    break;
                case Player.STATE_READY:
                    break;
                case Player.STATE_ENDED:
                    break;
                default:
                    break;
            }
        }
    });
    // 设置错误监听
    player.setOnErrorListener(new OnErrorListener() {
        @Override
        public void onError(PlayerException exception) {
            makeToast("errorcode: " + exception.getCode() + "\n" + exception.getMessage());
        }
    });
    
    // 设置RTMP地址
    player.setDataSource("rtmp://xx.xx.xx.xx/live");
    // 设置数据源就绪监听器
    player.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared() {
            // 数据源就绪后开始播放
            player.start();
        }
    });
    player.prepare();
    ...
    // 停止播放
    player.stop();
    ...
    // 释放播放器资源
    player.release();     
  • 设备录像点播播放器
    // 构造播放器实例
    VodPlayer player = new VodPlayer(getApplicationContext());
    
    // 设置textureview
    player.setTextureView(textureView);
    // 设置必要的状态监听
    player.setOnPlayerStateChangedListener(new OnPlayerStateChangedListener() {
        @Override
        public void onPlayerStateChange(int playerState) {
            Log.d(TAG, "play state= " + playerState);
            switch (playerState) {
                case Player.STATE_BUFFERING:
                    break;
                case Player.STATE_IDLE:
                    break;
                case Player.STATE_READY:
                    break;
                case Player.STATE_ENDED:
                    break;
                default:
                    break;
            }
        }
    });
    // 设置错误监听
    player.setOnErrorListener(new OnErrorListener() {
        @Override
        public void onError(PlayerException exception) {
            makeToast("errorcode: " + exception.getCode() + "\n" + exception.getMessage());
        }
    });
    
    // 设置支持点播的RTMP地址
    player.setDataSource("rtmp://xxxx");
    // 设置数据源就绪监听器
    player.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared() {
            // 数据源就绪后开始播放
            player.start();
        }
    });
    player.prepare();
    ...
    // 暂停播放
    player.pause();
    ...
    // 恢复播放
    player.start();
    ...
    // 停止播放
    player.stop();
    ...
    // 释放播放器资源
    player.release();              
  • HLS云存录像播放器(自研)
    HlsPlayer player = new HlsPlayer(getApplicationContext());
    // 设置textureview
    player.setTextureView(textureView);
    
    // 设置错误监听
    player.setOnErrorListener(new OnErrorListener() {
        @Override
        public void onError(PlayerException exception) {
            makeToast("errorcode: " + exception.getCode() + "\n" + exception.getMessage());
        }
    });
    // 设置状态监听
    player.setOnPlayerStateChangedListener(new OnPlayerStateChangedListener() {
        @Override
        public void onPlayerStateChange(int playerState) {
            switch (playerState) {
                case Player.STATE_BUFFERING:
                    break;
                case Player.STATE_IDLE:
                    break;
                case Player.STATE_READY:
                    break;
                case Player.STATE_ENDED:
                    break;
                default:
                    break;
            }
        }
    });
    
    // 设置m3u8地址
    player.setDataSource("http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear3/prog_index.m3u8");
    // 设置数据源就绪监听器
    player.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared() {
            // 数据源就绪后开始播放
            player.start();
        }
    });
    player.prepare();
    ...
    // 暂停播放
    player.pause();
    ...
    // 恢复播放
    player.start();
    ...
    // 停止播放
    player.stop();
    ...
    // 释放播放器资源
    player.release();   
    ...
  • HLS云存录像播放器(ExoPlayer)推荐使用自研播放器
    ExoHlsPlayer player = new ExoHlsPlayer(getApplicationContext());
    // 设置textureview
    player.setTextureView(textureView);
    // 也可以使用Exo的SimpleExoPlayerView来作为播放器的UI组件
    // simpleExoPlayerView.setPlayer(player.getExoPlayer());
    // simpleExoPlayerView.requestFocus();
    
    // 设置错误监听
    player.setOnErrorListener(new OnErrorListener() {
        @Override
        public void onError(PlayerException exception) {
            makeToast("errorcode: " + exception.getCode() + "\n" + exception.getMessage());
        }
    });
    // 设置状态监听
    player.setOnPlayerStateChangedListener(new OnPlayerStateChangedListener() {
        @Override
        public void onPlayerStateChange(int playerState) {
            switch (playerState) {
                case Player.STATE_BUFFERING:
                    break;
                case Player.STATE_IDLE:
                    break;
                case Player.STATE_READY:
                    break;
                case Player.STATE_ENDED:
                    break;
                default:
                    break;
            }
        }
    });
    
    // 设置m3u8地址
    player.setDataSource("http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear3/prog_index.m3u8");
    // 设置数据源就绪监听器
    player.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared() {
            // 数据源就绪后开始播放
            player.start();
        }
    });
    player.prepare();
    ...
    // 暂停播放
    player.pause();
    ...
    // 恢复播放
    player.start();
    ...
    // 停止播放
    player.stop();
    ...
    // 释放播放器资源
    player.release();   
    ...
    // 截图  
    textureview.getBitmap();

播放器状态介绍

通过设置播放器状态监听器,可接收到状态变更事件,用于相关UI元素的变更。

状态变更事件如:播放中发生错误、主动停止播放等。

player_state
  • IDLE:播放器没有任何内容播放时的状态。
  • BUFFERING:播放器正在缓冲,当前的位置还不可以播放。状态变更事件如:开始播放时缓冲、seek后重新缓冲。
  • READY:播放器已经有内容在播放。状态变更事件如:首帧数据已经渲染、seek缓冲完成开始播放新内容。对于点播播放器,若已seek或播放到文件结尾,则会回调OnCompletionListener.onCompletion()方法,状态不会切换到ENDED。
  • ENDED:播放器已结束播放。播放出错或stop后会切换到该状态。

接口说明

  • LinkVisualMedia
    说明 LinkVisualMedia用于实现预建连,若无预建连优化直播首帧出图速度需求,可忽略
    • 获取单例方法
      LinkVisualMedia getInstance();
    • 初始化方法
      /**
         * 全局资源初始化方法,SDK内部自动完成初始化,无需再调用
         * @Deprecated
         */
       void init();
    • 为IPC设备请求播放预建连
      /**
         * 尝试与IPC设备进行预建连,一旦预建连成功会加快直播的出图速度,需在播放前提前调用
         * @param 已经在线的IPC设备的iotId
         */
      void preConnectByIotId(String iotId);
  • LivePlayer
    • 构造方法
      /**
         * 构造方法
         * @param applicationContext ApplicationContext
         */
        LivePlayer(Context applicationContext);
    • 设置非加密播放源
      /**
         * 设置播放源
         * @param url RTMP地址
         */
        void setDataSource(String url) throws IllegalArgumentException;
    • 设置加密播放源
      /**
         * 设置加密播放源(仅适配Link Visual云提供的RTMP地址)
         * @param url         RTMP源地址
         * @param isEncrypted 是否是加密源
         * @param decryptIv   解密向量,16 byte array
         * @param decryptKey  解密密钥,16 byte array
         * @throws IllegalArgumentException
         */
        void setDataSource(String url, boolean isEncrypted, byte[] decryptIv, byte[] decryptKey) throws IllegalArgumentException;
    • 设置IPC直播数据源,该接口已开启加密和强制I帧
      /**
         * 设置IPC直播数据源,该接口已开启加密和强制I帧
         * @param iotId            IPC设备的iotId
         * @param streamType       流的类型,若有多路码流请关注该参数,C.STREAM_TYPE_MAJOR表示主码流;C.STREAM_TYPE_MINOR表示辅码流
         */
         void setIPCLiveDataSource(String iotId, int streamType);
    • 设置IPC直播数据源,该接口已开启加密和强制I帧
      /**
         * 设置IPC直播数据源,该接口已开启加密和强制I帧
         * @param iotId            IPC设备的iotId
         * @param streamType       流的类型,若有多路码流请关注该参数,C.STREAM_TYPE_MAJOR表示主码流;C.STREAM_TYPE_MINOR表示辅码流
         * @param cacheDurationInMs 云端缓存的视频长度,若有数据,该数据将会被加速快放,单位ms,该值建议不超过1个GOP
         *
         void setIPCLiveDataSource(String iotId, int streamType, int cacheDurationInMs);
    • 设置IPC直播数据源
          /**
           * 设置IPC直播数据源.
           *
           * @param iotId             设备的iotId
           * @param streamType        流的类型,若有多路码流请关注该参数,C.STREAM_TYPE_MAJOR表示主码流;C.STREAM_TYPE_MINOR表示辅码流
           * @param relayEncrypted    云转是否加密,建议开启
           * @param relayEncryptType  云转加密类型
           * @param forceIFrame       是否需要强制I帧,建议开启
           * @param cacheDurationInMs 云端缓存的视频长度,若有数据,该数据将会被加速快放,单位ms,该值建议不超过1个GOP
           */
          void setIPCLiveDataSource(String iotId, int streamType, boolean relayEncrypted, int relayEncryptType, boolean forceIFrame, int cacheDurationInMs)
    • 校验和准备数据
      /**
         * 校验和准备数据
         */
        void prepare();
    • 开始播放视频
      /**
         * 开始播放视频
         */
        void start();
    • 停止播放
      /**
         * 停止播放
         */
        void stop();
    • 重置播放器
      /**
         * 重置播放器
         */
        void reset();
    • 释放播放器资源
      /**
         * 释放播放器资源
         */
        void release();
    • 设置重连次数
          /**
           * 设置重连次数
           * 只针对发生{@link PlayerException#SUB_CODE_UNEXPECTED_PULL_STREAM_ERROR}错误时做重连
           * @param count 默认为0,建议不超过3次
           */
          void setReconnectCount(int count);
    • 截图
      /**
         * 当前视频画面截图
         * @return 如果当前无画面则返回 null
         */
        Bitmap snapShot();
    • 截图到文件
      /**
           * 当前视频画面截图
           * @param jpegFile 保存截图jpeg的文件
           * @return true - 文件保存成功
           */
          boolean snapShotToFile(File jpegFile);
    • 开始录屏
      /**
         * 开始录制当前播放内容,生成MPEG-4格式转存到指定的文件中
         * 文件名后缀必须为.mp4
         * 须在{@link PlayerState#STATE_READY}时调用有效
         * @param contentFile
         * @return 操作成功与否
         */
        boolean startRecordingContent(File contentFile) throws IOException;
    • 获取当前录制的视频时长
          /**
           * 获取当前录制的视频时长
           * @return 单位ms
           */
          long getCurrentRecordingContentDuration();
    • 结束录屏
      /**
         * 停止记录播放内容
         * @return 操作成功与否
         */
        boolean stopRecordingContent();
    • 设置播放器音量
      /**
         * 设置播放器音量
         * @param audioVolume 取值范围:0~1,0为静音
         */
        void setVolume(float audioVolume);
    • 设置音频流通道类型
      /**
         * 设置音频流通道类型,see {@link android.media.AudioManager},默认使用AudioManager.STREAM_MUSIC
         * 如果音频正在播放,则会因为重新创建AudioTrack导致有短暂停顿
         * @param audioStreamType
         */
        void setAudioStreamType(int audioStreamType);
    • 设置画面缩放模式
      /**
         * 设置视频画面缩放模式,默认为{@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
         * @param videoScalingMode 参见:
         * {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}
         * {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
         */
        void setVideoScalingMode(int videoScalingMode);
    • 设置软硬解策略
          /**
           * 设置解码器策略,全局生效
           * 默认使用强制软解
           *
           * @param decoderStrategy 
           *        HARDWARE_FIRST - 硬解优先
           *        FORCE_SOFTWARE - 强制软解
           */
          void setDecoderStrategy(DecoderStrategy decoderStrategy)
    • 获取当前播放的软硬解类型
          /**
           * 获取当前流的解码器类型,软解或硬解
           *
           * @return 若当前未开流,则返回null
           *      HARDWARE - 硬解码
           *      SOFTWARE - 软解码
           */
          DecoderType getDecoderType()
    • 设置播放停止时画面绘制策略
      /**
           * 设置播放停止时画面绘制策略
           * @param playerStoppedDrawingMode
           * ALWAYS_KEEP_LAST_FRAME          播放停止时始终保留最后一帧画面
           * KEEP_LAST_FRAME_WITHOUT_ERROR   播放停止时只有未出现错误时才保留最后一帧画面(默认是此模式) 
           * ALWAYS_BLACK                    播放停止时始终显示黑色
           */
          void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)
    • 设置播放器固定缓存帧数
      /**
         * 设置播放器固定缓存帧数
         * @param frameCount 播放器固定缓存帧数,取值范围:0帧~50帧,数值越大播放器延迟越大,流畅性越好,默认5帧
         */
        void setBufferedFrameCount(int frameCount);
    • 设置播放器抗抖动最大缓冲区时长
          /**
           * 设置播放器抗抖动最大缓冲区时长,默认1000ms,范围200-3000ms
           * @param jitterBufferSizeInMs
           */
          void setMaxJitterBufferSizeInMs(int jitterBufferSizeInMs);
    • 设置surfaceview
      /**
           * 设置SurfaceView, 必须为GLSurfaceView,同一个Window中同时只允许一个播放器播放,若需要支持多播放实例,请使用TextureView
           * 注意:GLSurfaceView必须在Activity的onResume和onPause回调方法中调用GLSurfaceView的onResume和onPause方法; 
           * GLSurfaceView及其容器不可设置背景色
           * @param surfaceview
           */
        void setSurfaceView(SurfaceView surfaceview);
    • 清除surfaceview
      /**
         * 清除surfaceview
         */
        void clearSurfaceView();
    • 设置textureview
      /**
           * 设置TextureView,同一个TextureView不可被多个播放器共享,提供ZoomableTextureView带手势放缩处理可做参照
           * @param textureview
           */
          void setTextureView(TextureView textureView);
    • 清除textureview
      /**
           * 清除textureview
           */
          void clearTextureView();
    • 设置是否由外部来完成YUV数据的渲染
      说明 该模式为高级模式,一旦开启后,播放器内部将不再进行画面渲染,需要自行设置对YUV数据变化的监听,并及时通过YUV数据获取接口取出暂存的YUV数据帧立刻渲染
          /**
           * 设置是否由外部来完成YUV数据的渲染
           * @param useExternalRender true为由外部渲染,false为由内部渲染
           */
          void setUseExternalRender(boolean useExternalRender);
    • 获取是否使用外部渲染
          /**
           * 获取是否使用外部渲染
           * @return true为由外部渲染,false为由内部渲染
           */
          boolean useExternalRender();
    • 设置播放质量和网络监听器
          /**
           * 设置播放质量和网络监听器
           * @param onExternalRenderListener
           */
          void setOnVideoQualityListener(OnVideoQualityListener listener);
      
      public interface OnVideoQualityListener {
          /**
           * 当缓冲区中持续一段时间无数据后回调该方法,一般由网络不稳定引起,可考虑提示降低清晰度
           */
          void onVideoJitterBufferEmpty();
      }
                                  
    • 设置外部渲染监听器
          /**
           * 设置外部渲染监听器
           * @param onExternalRenderListener
           */
          void setOnExternalRenderListener(OnExternalRenderListener onExternalRenderListener);public interface OnExternalRenderListener {
      
      public interface OnExternalRenderListener {
          /**
           * 通知已经有YUV数据帧需要被渲染
           * @param width 视频帧宽
           * @param height 视频帧高
           * @param timestamp 时间戳,单位为ms
           */
          void onVideoFrameUpdate(int width, int height ,long timestamp);
      }
    • 获取YUV帧数据用于渲染
          /**
           * 获取YUV帧数据用于渲染,只在外部渲染模式下有效
           * @return Yuv420p格式视频帧
           */
          Yuv420pFrame getYuvFrame();
    • 设置SEI信息监听器
          /**
           * 设置SEI信息监听器
           *
           * @param seiInfoBuffer  创建用于存储SEI帧数据的缓存,必须保证码流中的SEI信息长度不会超过缓存大小,超过的帧将会被丢弃
           * @param onSeiInfoListener
           */
          void setOnSeiInfoListener(SeiInfoBuffer seiInfoBuffer, OnSeiInfoListener onSeiInfoListener);
      
      interface OnSeiInfoListener {
          /**
           * 当SEI信息更新时回调
           * 请不要执行阻塞的操作,并在该回调中及时处理seiInfoBuffer数据
           * @param seiInfoBuffer
           */
          void onSeiInfoUpdate(SeiInfoBuffer seiInfoBuffer);
      }
                                  
    • 设置数据源准备就绪事件监听器
      /**
         * 设置数据源准备就绪事件监听器
         * @param listener
         */
        void setOnPreparedListener(OnPreparedListener listener);
      
      public interface OnPreparedListener {
          /**
           * 数据源准备就绪回调
           */
          void onPrepared();
      }
    • 设置播放器错误事件监听器
      /**
         * 设置播放器错误事件监听器,错误类型参见:
         * {@link PlayerException.SOURCE_ERROR}
         * {@link PlayerException.RENDER_ERROR}
         * {@link PlayerException.UNEXPECTED_ERROR}
         * @param listener
         */
        void setOnErrorListener(OnErrorListener listener);
      
      public interface OnErrorListener {
          /**
           * 播放器错误回调,参见
           * {@link PlayerException}
           * @param exception
           */
          void onError(PlayerException exception);
      }
    • 设置播放状态变更事件监听器
      /**
         * 设置播放状态变更事件监听器,请参见状态图
         * @param listener
         */
        void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener);
      
      public interface OnPlayerStateChangedListener {
          /**
           * 播放器状态变更回调
           *
           * @param playerState 参见
           *                    {@link PlayerState#STATE_IDLE}
           *                    {@link PlayerState#STATE_BUFFERING}
           *                    {@link PlayerState#STATE_READY}
           *                    {@link PlayerState#STATE_ENDED}
           */
          void onPlayerStateChange(int playerState);
      }
    • 设置首帧被渲染事件监听器
      /**
         * 设置首帧被渲染事件监听器
         * @param listener
         */
        void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener);
      
      public interface OnRenderedFirstFrameListener {
          /**
           * 首帧被渲染回调
           */
          void onRenderedFirstFrame();
      }
    • 设置视频内容宽高变更回调
          /**
           * 设置视频内容宽高变更回调
           * @param listener
           */
          void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
      public interface OnVideoSizeChangedListener {
      
          /**
           * 内容宽高改变时的回调
           *
           * @param width  视频内容宽,单位像素
           * @param height 视频内容高,单位像素
           */
          void onVideoSizeChanged(int width, int height);
      }
    • 获取音量
      /**
         * 获取音量
         * @return 取值范围:0~1,0为静音
         */
        float getVolume();
    • 获取播放器状态
      /**
         * 获取播放状态
         * @return 状态枚举:
         * {@link PlayerState#STATE_IDLE} 播放器初始状态
         * {@link PlayerState#STATE_BUFFERING} 缓冲中状态
         * {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
         * {@link PlayerState#STATE_ENDED} 播放完成状态
         */
        int getPlayState();
    • 获取播放器当前流的连接类型
      /**
         * 获取播放器当前流的连接类型
         * 播放器状态为{@link PlayerState#STATE_READY}后过5S调用能准确反映当前使用的流类型
         *
         * @return {@link StreamConnectType}
         */
        StreamConnectType getStreamConnectType();
    • 获取播放器当前的帧率/码率等信息
      /**
         * 获取播放器当前的帧率/码率等信息
         * 播放器状态为{@link PlayerState#STATE_BUFFERING}及{@link PlayerState#STATE_READY}时调用有效
         * @return 包含帧率/码率等信息的json string
         */
        PlayInfo getCurrentPlayInfo();
  • VodPlayer
    • 构造方法
      /**
         * 构造方法
         * @param applicationContext ApplicationContext
         */    
        VodPlayer(Context applicationContext);
    • 设置非加密播放源
      /**
         * 设置播放源
         * @param url RTMP地址
         */
        void setDataSource(String url) throws IllegalArgumentException;
    • 设置加密播放源
      /**
         * 设置加密播放源(仅适配Link Visual云提供的RTMP地址)
         * @param url         RTMP源地址
         * @param isEncrypted 是否是加密源
         * @param decryptIv   解密向量,16 byte array
         * @param decryptKey  解密密钥,16 byte array
         * @throws IllegalArgumentException
         */
        void setDataSource(String url, boolean isEncrypted, byte[] decryptIv, byte[] decryptKey) throws IllegalArgumentException;
    • 设置播放源为IPC录像(按录像文件名) ,该接口已开启加密
      /**
         * 设置播放源为IPC录像(按录像文件名),该接口已开启加密
         *
         * @param iotId         设备iotId
         * @param fileName      录像文件名
         */
         void setDataSourceByIPCRecordFileName(String iotId, String fileName);
      
      /**
         * 设置播放源为IPC录像(按录像文件名),该接口已开启加密
         *
         * @param iotId                设备iotId
         * @param fileName             录像文件名
         * @param seekToPositionInMs   相对文件头的初始偏移量,单位ms
         */
         void setDataSourceByIPCRecordFileName(String iotId, String fileName, long seekToPositionInMs);
    • 设置播放源为IPC录像(按录像时间段)
          /**
           * 设置播放地址为已接入生活物联网平台的IPC设备,指定录像时间段的本地录像文件地址
           * 该接口已开启加密
           * see {@link #setDataSourceByIPCRecordTime(String, int, int, boolean, int, long)}
           *
           * @param iotId              设备iotId
           * @param beginTimeInS       录像开始时间,1970年1月1日开始的秒数
           * @param endTimeInS         录像结束时间,1970年1月1日开始的秒数
           * @param seekToPositionInMs 相对于beginTime的播放偏移量,单位为ms
           */
          void setDataSourceByIPCRecordTime(String iotId, int beginTimeInS, int endTimeInS, long seekToPositionInMs)
      
          /**
           * 设置播放地址为已接入生活物联网平台的IPC设备,指定录像时间段的本地录像文件地址
           * 该接口已开启加密
           * see {@link #setDataSourceByIPCRecordTime(String, int, int, boolean, int, long)}
           *
           * @param iotId              设备iotId
           * @param beginTimeInS       录像开始时间,1970年1月1日开始的秒数
           * @param endTimeInS         录像结束时间,1970年1月1日开始的秒数
           * @param seekToPositionInMs 相对于beginTime的播放偏移量,单位为ms
           * @param recordType         录像类型: 0(表示计划录像);1(表示报警录像)
           */
          void setDataSourceByIPCRecordTime(String iotId, int beginTimeInS, int endTimeInS, long seekToPositionInMs, int recordType)
       /**
         * 设置播放地址为已接入生活物联网平台的IPC设备,指定录像时间段的本地录像文件地址
         *
         * @param iotId              设备iotId
         * @param beginTimeInS       录像时间段开始时间,UTC时间,1970年1月1日开始的秒数
         * @param endTimeInS         录像时间段结束时间,UTC时间,1970年1月1日开始的秒数
         * @param encrypted          是否流需要加密,强烈建议开启,对于出海产品,务必保持开启
         * @param encryptType        加密类型:目前只支持C.ENCRYPTE_AES_128(AES-128)加密方式
         * @param seekToPositionInMs 相对于beginTimeInS的播放偏移量,单位为ms
         * @param recordType         录像类型: 0(表示计划录像);1(表示报警录像)
         * 出于安全要求,无特殊情况,请尽量开启加密
         */
       void setDataSourceByIPCRecordTime(String iotId, int beginTimeInS, int endTimeInS, boolean encrypted, int encryptType, long seekToPositionInMs, int recordType) 
    • 校验和准备数据
      /**
         * 校验和准备数据
         */
        void prepare();
    • 开始或恢复播放视频
      /**
         * 开始播放或恢复播放视频
         */
        void start();
    • 暂停播放
      /**
         * 暂停播放,调用start()恢复播放
         */
        void pause();
    • seek到指定位置
      /**
         * seek到指定位置
         * @param position 毫秒
         */
        void seekTo(long positionInMs);
    • 逐帧播放
          /**
           * 逐帧播放,恢复请调用start()
           * @return 是否调用成功
           */
          boolean playFrameByFrame();
    • 停止播放
      /**
         * 停止播放
         */
        void stop();
    • 重置播放器
      /**
         * 重置播放器
         */
        void reset();
    • 释放播放器资源
      /**
         * 释放播放器资源
         */
        void release();
    • 截图
      /**
         * 当前视频画面截图
         * @return 如果当前无画面则返回 null
         */
        Bitmap snapShot();
    • 截图到文件
      /**
           * 当前视频画面截图
           * @param jpegFile 保存截图jpeg的文件
           * @return true - 文件保存成功
           */
          boolean snapShotToFile(File jpegFile);
    • 开始录屏
      /**
         * 开始录制当前播放内容,生成MPEG-4格式转存到指定的文件中
         * 文件名后缀必须为mp4
         * 须在{@link PlayerState#STATE_READY}时调用有效
         * @param contentFile
         * @return 操作成功与否
         */
        boolean startRecordingContent(File contentFile) throws IOException;
    • 获取当前录制的视频时长
          /**
           * 获取当前录制的视频时长
           * @return 单位ms
           */
          long getCurrentRecordingContentDuration();
    • 结束录屏
      /**
         * 停止记录播放内容
         * @return 操作成功与否
         */
        boolean stopRecordingContent();
    • 设置播放器音量
      /**
         * 设置播放器音量
         * @param audioVolume 取值范围:0~1,0为静音
         */
        void setVolume(float audioVolume);
    • 设置音频流通道类型
      /**
         * 设置音频流通道类型,参见{@link android.media.AudioManager}
         * 如果音频正在播放,则会因为重新创建AudioTrack导致有短暂停顿
         * @param audioStreamType
         */
        void setAudioStreamType(int audioStreamType);
    • 设置画面缩放模式
      /**
         * 设置视频画面缩放模式,默认为{@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
         * @param videoScalingMode 参见:
         * {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}
         * {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
         */
        void setVideoScalingMode(int videoScalingMode);
    • 设置软硬解策略
          /**
           * 设置解码器策略,全局生效
           * 默认使用强制软解
           *
           * @param decoderStrategy 
           *        HARDWARE_FIRST - 硬解优先
           *        FORCE_SOFTWARE - 强制软解
           */
          void setDecoderStrategy(DecoderStrategy decoderStrategy)
    • 获取当前播放的软硬解类型
          /**
           * 获取当前流的解码器类型,软解或硬解
           *
           * @return 若当前未开流,则返回null
           *      HARDWARE - 硬解码
           *      SOFTWARE - 软解码
           */
          DecoderType getDecoderType()
    • 设置播放停止时画面绘制策略
      /**
           * 设置播放停止时画面绘制策略
           * @param playerStoppedDrawingMode
           * ALWAYS_KEEP_LAST_FRAME          播放停止时始终保留最后一帧画面
           * KEEP_LAST_FRAME_WITHOUT_ERROR   播放停止时只有未出现错误时才保留最后一帧画面(默认是此模式) 
           * ALWAYS_BLACK                    播放停止时始终显示黑色
           */
          void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)
    • 设置surfaceview
      /**
           * 设置SurfaceView,必须为GLSurfaceView,同一个Window中同时只允许一个播放器播放,若需要支持多播放实例,请使用TextureView
           * 注意GLSurfaceView必须在Activity的onResume和onPause回调方法中调用GLSurfaceView的onResume和onPause方法
           * GLSurfaceView及其容器不可设置背景色
           * @param surfaceview
           */
        void setSurfaceView(SurfaceView surfaceview);
    • 清除surfaceview
      /**
         * 清除surfaceview
         */
        void clearSurfaceView();
    • 设置textureview
      /**
           * 设置TextureView,同一个TextureView不可被多个播放器共享,提供ZoomableTextureView带手势放缩处理可做参照
           * @param textureview
           */
          void setTextureView(TextureView textureView);
    • 清除textureview
      /**
           * 清除textureview
           */
          void clearTextureView();
    • 设置是否由外部来完成YUV数据的渲染
          /**
           * 设置是否由外部来完成YUV数据的渲染
           * @param useExternalRender true为由外部渲染,false为由内部渲染
           */
          void setUseExternalRender(boolean useExternalRender);
    • 获取是否使用外部渲染
          /**
           * 获取是否使用外部渲染
           * @return true为由外部渲染,false为由内部渲染
           */
          boolean useExternalRender();
    • 设置外部渲染监听器
          /**
           * 设置外部渲染监听器
           * @param onExternalRenderListener
           */
          void setOnExternalRenderListener(OnExternalRenderListener onExternalRenderListener);public interface OnExternalRenderListener {
      
      public interface OnExternalRenderListener {
          /**
           * 通知已经有YUV数据帧需要被渲染
           * @param width 视频帧宽
           * @param height 视频帧高
           * @param timestamp 时间戳,单位为ms
           */
          void onVideoFrameUpdate(int width, int height ,long timestamp);
      }
    • 获取YUV帧数据用于渲染
          /**
           * 获取YUV帧数据用于渲染,只在外部渲染模式下有效
           * @return Yuv420p格式视频帧
           */
          Yuv420pFrame getYuvFrame();
    • 设置SEI信息监听器
          /**
           * 设置SEI信息监听器
           *
           * @param seiInfoBuffer  创建用于存储SEI帧数据的缓存,必须保证码流中的SEI信息长度不会超过缓存大小,超过的帧将会被丢弃
           * @param onSeiInfoListener
           */
          void setOnSeiInfoListener(SeiInfoBuffer seiInfoBuffer, OnSeiInfoListener onSeiInfoListener);
      
      interface OnSeiInfoListener {
          /**
           * 当SEI信息更新时回调
           * 请不要执行阻塞的操作,并在该回调中及时处理seiInfoBuffer数据
           * @param seiInfoBuffer
           */
          void onSeiInfoUpdate(SeiInfoBuffer seiInfoBuffer);
      }
                                  
    • 设置数据源准备就绪事件监听器
      /**
         * 设置数据源准备就绪事件监听器
         * @param listener
         */
        void setOnPreparedListener(OnPreparedListener listener);
      
      interface OnPreparedListener {
          /**
           * 数据源准备就绪回调
           */
          void onPrepared();
      }
    • 设置播放器错误事件监听器
      /**
         * 设置播放器错误事件监听器,错误类型参见:
         * {@link PlayerException.SOURCE_ERROR}
         * {@link PlayerException.RENDER_ERROR}
         * {@link PlayerException.UNEXPECTED_ERROR}
         * @param listener
         */
        void setOnErrorListener(OnErrorListener listener);
      
      interface OnErrorListener {
          /**
           * 播放器错误回调,参见
           * {@link PlayerException}
           * @param exception
           */
          void onError(PlayerException exception);
      }
    • 设置播放状态变更事件监听器
      /**
         * 设置播放状态变更事件监听器
         * @param listener
         */
        void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener);
      
      interface OnPlayerStateChangedListener {
          /**
           * 播放器状态变更回调
           *
           * @param playerState 参见
           *                    {@link PlayerState#STATE_IDLE}
           *                    {@link PlayerState#STATE_BUFFERING}
           *                    {@link PlayerState#STATE_READY}
           *                    {@link PlayerState#STATE_ENDED}
           */
          void onPlayerStateChange(int playerState);
      }
    • 设置首帧被渲染事件监听器
      /**
         * 设置首帧被渲染事件监听器
         * @param listener
         */
        void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener);
      
      interface OnRenderedFirstFrameListener {
          /**
           * 首帧被渲染回调
           */
          void onRenderedFirstFrame();
      }
    • 设置视频内容宽高变更回调
          /**
           * 设置视频内容宽高变更回调
           * @param listener
           */
          void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
      
      interface OnVideoSizeChangedListener {
      
          /**
           * 内容宽高改变时的回调
           *
           * @param width  视频内容宽,单位像素
           * @param height 视频内容高,单位像素
           */
          void onVideoSizeChanged(int width, int height);
      }
    • 设置播放到内容结束事件监听器
      /**
         * 设置播放到内容结束事件监听器
         * 收到该事件后,需要调用stop,播放器状态才会切到STATE_END
         * @param listener
         */
        void setOnCompletionListener(OnCompletionListener listener);
      
      interface OnCompletionListener {
          /**
           * 播放到文件末尾回调
           */
          void onCompletion();
      }
    • 获取当前播放进度
      /**
         * 获取当前播放进度,相对于开始位置的偏移量
         * 播放器状态为{@link PlayerState#STATE_READY}时调用有效
         * @return 单位ms
         */
        long getCurrentPosition();
    • 获取视频总时长
      /**
         * 获取视频总时长
         * 播放器状态为{@link #STATE_READY}时调用有效
         * @return 单位ms
         */
        long getDuration();
    • 设置回放速率
           /**
           * 设置播放速率,需要设备支持倍速功能
           * 须在{@link PlayerState#STATE_BUFFERING}及{@link PlayerState#STATE_READY}时调用有效
           * 非1倍速率下默认关闭声音
           * @param speed只支持1/16、1/8、1/4、1/2、1、2、4、8、16倍速
           */
          void setPlaybackSpeed(float speed)
    • 获取音量
      /**
         * 获取音量
         * @return 取值范围:0~1,0为静音
         */
        float getVolume();
    • 获取播放器状态
      /**
         * 获取播放状态
         * @return 状态枚举:
         * {@link PlayerState#STATE_IDLE} 播放器初始状态
         * {@link PlayerState#STATE_BUFFERING} 缓冲中状态
         * {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
         * {@link PlayerState#STATE_ENDED} 播放完成状态
         */
        int getPlayState();
    • 获取播放器当前流的连接类型
      /**
         * 获取播放器当前流的连接类型
         * 播放器状态为{@link PlayerState#STATE_READY}时调用有效
         * @return {@link StreamConnectType}
         */
        StreamConnectType getStreamConnectType();
    • 获取播放器当前的帧率/码率等信息
      /**
         * 获取播放器当前的帧率/码率等信息
         * 播放器状态为{@link PlayerState#STATE_BUFFERING}及{@link PlayerState#STATE_READY}时调用有效
         * @return 包含帧率/码率等信息的json string
         */
        PlayInfo getCurrentPlayInfo();
  • HlsPlayer
    • 构造方法
      /**
         * 构造方法
         * @param applicationContext ApplicationContext
         */    
        HlsPlayer(Context applicationContext);
    • 设置播放地址
      /**
         * 设置播放源
         * @param url HLS点播地址
         */
        void setDataSource(String url) throws IllegalArgumentException;
    • 设置播放地址为已接入生活物联网平台的IPC设备指定录像名的云端录像文件地址
      
          /**
           * 设置播放地址为已接入生活物联网平台的IPC设备指定录像名的云端录像文件地址
           *
           * @param iotId    设备iotId
           * @param fileName 录像文件名
           */
          void setDataSourceByIPCRecordFileName(String iotId, String fileName)
    • 设置播放地址为已接入生活物联网平台的IPC设备指定录像名的云端录像文件地址
          /**
           * 设置播放地址为已接入生活物联网平台的IPC设备指定录像名的云端录像文件地址
           *
           * @param iotId    设备iotId
           * @param fileName 录像文件名
           * @param seekToPositionInMs起始偏移量,单位ms
           */
          void setDataSourceByIPCRecordFileName(String iotId, String fileName, long seekToPositionInMs)
    • 校验和准备数据
      /**
         * 校验和准备数据
         */
        void prepare();
    • 开始或恢复播放视频
      /**
         * 开始播放或恢复播放视频
         */
        void start();
    • 暂停播放
      /**
         * 暂停播放,调用start()恢复播放
         */
        void pause();
    • seek到指定位置
      /**
         * seek到指定位置
         * @param position 毫秒
         */
        void seekTo(long positionInMs);
    • 逐帧播放
          /**
           * 逐帧播放,恢复请调用start()
           * @return 是否调用成功
           */
          boolean playFrameByFrame();
    • 停止播放
      /**
         * 停止播放
         */
        void stop();
    • 重置播放器
      /**
         * 重置播放器
         */
        void reset();
    • 释放播放器资源
      /**
         * 释放播放器资源
         */
        void release();
    • 截图
      /**
         * 当前视频画面截图
         * @return 如果当前无画面则返回null
         */
        Bitmap snapShot();
    • 截图到文件
      /**
           * 当前视频画面截图
           * @param jpegFile 保存截图jpeg的文件
           * @return true表示文件保存成功
           */
          boolean snapShotToFile(File jpegFile);
    • 开始录屏
      /**
         * 开始录制当前播放内容,生成MPEG-4格式转存到指定的文件中
         * 文件名后缀必须为mp4
         * 须在{@link PlayerState#STATE_READY}时调用有效
         * @param contentFile
         * @return 操作成功与否
         */
        boolean startRecordingContent(File contentFile) throws IOException;
    • 获取当前录制的视频时长
          /**
           * 获取当前录制的视频时长
           * @return 单位ms
           */
          long getCurrentRecordingContentDuration();
    • 结束录屏
      /**
         * 停止记录播放内容
         * @return 操作成功与否
         */
        boolean stopRecordingContent();
    • 设置回放速率
           /**
           * 设置播放速率
           * 须在{@link PlayerState#STATE_BUFFERING}及{@link PlayerState#STATE_READY}时调用有效
           * 非1倍速率下默认关闭声音
           * @param speed只支持1/16、1/8、1/4、1/2、1、2、4、8、16倍速
           */
          void setPlaybackSpeed(float speed)
    • 设置播放器音量
      /**
         * 设置播放器音量
         * @param audioVolume 取值范围:0~1,0为静音
         */
        void setVolume(float audioVolume);
    • 设置音频流通道类型
      /**
         * 设置音频流通道类型,参见{@link android.media.AudioManager}
         * 如果音频正在播放,则会因为重新创建AudioTrack导致有短暂停顿
         * @param audioStreamType
         */
        void setAudioStreamType(int audioStreamType);
    • 设置画面缩放模式
      /**
         * 设置视频画面缩放模式,默认为{@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
         * @param videoScalingMode 参见:
         * {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}
         * {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
         */
        void setVideoScalingMode(int videoScalingMode);
    • 设置软硬解策略
          /**
           * 设置解码器策略,全局生效
           * 默认使用强制软解
           *
           * @param decoderStrategy 
           *        HARDWARE_FIRST - 硬解优先
           *        FORCE_SOFTWARE - 强制软解
           */
          void setDecoderStrategy(DecoderStrategy decoderStrategy)
    • 获取当前播放的软硬解类型
          /**
           * 获取当前流的解码器类型,软解或硬解
           *
           * @return 若当前未开流,则返回null
           *      HARDWARE - 硬解码
           *      SOFTWARE - 软解码
           */
          DecoderType getDecoderType()
    • 设置播放停止时画面绘制策略
      /**
           * 设置播放停止时画面绘制策略
           * @param playerStoppedDrawingMode
           * ALWAYS_KEEP_LAST_FRAME          播放停止时始终保留最后一帧画面
           * KEEP_LAST_FRAME_WITHOUT_ERROR   播放停止时只有未出现错误时才保留最后一帧画面(默认是此模式) 
           * ALWAYS_BLACK                    播放停止时始终显示黑色
           */
          void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)
    • 设置surfaceview
      /**
           * 设置SurfaceView,必须为GLSurfaceView,同一个Window中同时只允许一个播放器播放,若需要支持多播放实例,请使用TextureView
           * 注意GLSurfaceView必须在Activity的onResume和onPause回调方法中调用GLSurfaceView的onResume和onPause方法
           * GLSurfaceView及其容器不可设置背景色
           * @param surfaceview
           */
        void setSurfaceView(SurfaceView surfaceview);
    • 清除surfaceview
      /**
         * 清除surfaceview
         */
        void clearSurfaceView();
    • 设置textureview
      /*
           * 设置TextureView,同一个TextureView不可被多个播放器共享,提供ZoomableTextureView带手势放缩处理可做参照
           * @param textureview
           */
          void setTextureView(TextureView textureView);
    • 清除textureview
      /**
           * 清除textureview
           */
          void clearTextureView();
    • 设置是否由外部来完成YUV数据的渲染
          /**
           * 设置是否由外部来完成YUV数据的渲染
           * @param useExternalRender true为由外部渲染,false为由内部渲染
           */
          void setUseExternalRender(boolean useExternalRender);
    • 获取是否使用外部渲染
          /**
           * 获取是否使用外部渲染
           * @return true为由外部渲染,false为由内部渲染
           */
          boolean useExternalRender();
    • 设置外部渲染监听器
          /**
           * 设置外部渲染监听器
           * @param onExternalRenderListener
           */
          void setOnExternalRenderListener(OnExternalRenderListener onExternalRenderListener);public interface OnExternalRenderListener {
      
      public interface OnExternalRenderListener {
          /**
           * 通知已经有YUV数据帧需要被渲染
           * @param width 视频帧宽
           * @param height 视频帧高
           * @param timestamp 时间戳,单位为ms
           */
          void onVideoFrameUpdate(int width, int height ,long timestamp);
      }
    • 获取YUV帧数据用于渲染
          /**
           * 获取YUV帧数据用于渲染,只在外部渲染模式下有效
           * @return Yuv420p格式视频帧
           */
          Yuv420pFrame getYuvFrame();
    • 设置SEI信息监听器
          /**
           * 设置SEI信息监听器
           *
           * @param seiInfoBuffer  创建用于存储SEI帧数据的缓存,必须保证码流中的SEI信息长度不会超过缓存大小,超过的帧将会被丢弃
           * @param onSeiInfoListener
           */
          void setOnSeiInfoListener(SeiInfoBuffer seiInfoBuffer, OnSeiInfoListener onSeiInfoListener);
      
      interface OnSeiInfoListener {
          /**
           * 当SEI信息更新时回调
           * 请不要执行阻塞的操作,并在该回调中及时处理seiInfoBuffer数据
           * @param seiInfoBuffer
           */
          void onSeiInfoUpdate(SeiInfoBuffer seiInfoBuffer);
      }
                                  
    • 设置数据源准备就绪事件监听器
      /**
         * 设置数据源准备就绪事件监听器
         * @param listener
         */
        void setOnPreparedListener(OnPreparedListener listener);
      
      interface OnPreparedListener {
          /**
           * 数据源准备就绪回调
           */
          void onPrepared();
      }
    • 设置播放器错误事件监听器
      /**
         * 设置播放器错误事件监听器,错误类型参见:
         * {@link PlayerException.SOURCE_ERROR}
         * {@link PlayerException.RENDER_ERROR}
         * {@link PlayerException.UNEXPECTED_ERROR}
         * @param listener
         */
        void setOnErrorListener(OnErrorListener listener);
      
      interface OnErrorListener {
          /**
           * 播放器错误回调,参见
           * {@link PlayerException}
           * @param exception
           */
          void onError(PlayerException exception);
      }
    • 设置播放状态变更事件监听器
      /**
         * 设置播放状态变更事件监听器
         * @param listener
         */
        void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener);
      
      interface OnPlayerStateChangedListener {
          /**
           * 播放器状态变更回调
           *
           * @param playerState 参见
           *                    {@link PlayerState#STATE_IDLE}
           *                    {@link PlayerState#STATE_BUFFERING}
           *                    {@link PlayerState#STATE_READY}
           *                    {@link PlayerState#STATE_ENDED}
           */
          void onPlayerStateChange(int playerState);
      }
    • 设置首帧被渲染事件监听器
      /**
         * 设置首帧被渲染事件监听器
         * @param listener
         */
        void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener);
      
      interface OnRenderedFirstFrameListener {
          /**
           * 首帧被渲染回调
           */
          void onRenderedFirstFrame();
      }
    • 设置视频内容宽高变更回调
          /**
           * 设置视频内容宽高变更回调
           * @param listener
           */
          void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
      
      interface OnVideoSizeChangedListener {
      
          /**
           * 内容宽高改变时的回调
           *
           * @param width  视频内容宽,单位像素
           * @param height 视频内容高,单位像素
           */
          void onVideoSizeChanged(int width, int height);
      }
    • 设置播放到内容结束事件监听器
      /**
         * 设置播放到内容结束事件监听器
         * 收到该事件后,需要调用stop,播放器状态才会切到STATE_END
         * @param listener
         */
        void setOnCompletionListener(OnCompletionListener listener);
      
      interface OnCompletionListener {
          /**
           * 播放到文件末尾回调
           */
          void onCompletion();
      }
    • 获取当前播放进度
      /**
         * 获取当前播放进度,相对于开始位置的偏移量
         * 播放器状态为{@link PlayerState#STATE_READY}时调用有效
         * @return 单位ms
         */
        long getCurrentPosition();
    • 获取视频总时长
      /**
         * 获取视频总时长
         * 播放器状态为{@link #STATE_READY}时调用有效
         * @return 单位ms
         */
        long getDuration();
    • 获取音量
      /**
         * 获取音量
         * @return 取值范围:0~1,0为静音
         */
        float getVolume();
    • 获取播放器状态
      /**
         * 获取播放状态
         * @return 状态枚举:
         * {@link PlayerState#STATE_IDLE} 播放器初始状态
         * {@link PlayerState#STATE_BUFFERING} 缓冲中状态
         * {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
         * {@link PlayerState#STATE_ENDED} 播放完成状态
         */
        int getPlayState();
    • 获取播放器当前流的连接类型
      /**
         * 获取播放器当前流的连接类型
         * 播放器状态为{@link PlayerState#STATE_READY}时调用有效
         * @return {@link StreamConnectType}
         */
        StreamConnectType getStreamConnectType();
    • 获取播放器当前的帧率/码率等信息
      /**
         * 获取播放器当前的帧率/码率等信息
         * 播放器状态为{@link PlayerState#STATE_BUFFERING}及{@link PlayerState#STATE_READY}时调用有效
         * @return 包含帧率/码率等信息的json string
         */
        PlayInfo getCurrentPlayInfo();
  • ExoHlsPlayer
    • 构造方法
      ExoHlsPlayer(Context context);
    • 设置m3u8播放地址
      /**
         * 设置播放源
         * @param url m3u8地址
         */
        void setDataSource(String url);
    • 设置播放地址为IPC云存录像(按文件名)
      /**
         * 设置播放地址为IPC云存录像(按文件名)
         * @param iotId    设备iotId
         * @param fileName 录像文件名
         */
         void setDataSourceByIPCRecordFileName(String iotId, String fileName);
    • 校验和准备数据
      /**
         * 校验和准备数据
         */
        void prepare();
    • 开始或恢复播放视频
      /**
         * 开始播放或恢复播放视频
         */
        void start();
    • 暂停播放
      /**
         * 暂停播放,调用start()恢复播放
         */
        void pause();
    • seek到指定位置
      /**
         * seek到指定位置
         * @param position 毫秒
         */
        void seekTo(long positionInMs);
    • 停止播放
      **
         * 停止播放
         */
        void stop();
    • 重置播放器
      /**
         * 重置播放器
         */
        void reset();
    • 释放播放器资源
      /**
         * 释放播放器资源
         */
        void release();
    • 设置是否循环播放
      /**
        * 设置是否循环播放
        * @param circlePlay true为循环播放
        */
        void setCirclePlay(boolean circlePlay);
    • 设置回放速率
      /**
        * 设置回放的播放速率
        * @param speed 速率因子,取值范围:(0,2],1为正常速率
        */
        void setPlaybackSpeed(float speed);
    • 设置播放器音量
      /**
         * 设置播放器音量
         * @param audioVolume 取值范围:0~1,0为静音
         */
        void setVolume(float audioVolume);
    • 设置音频流通道类型
      /**
         * 设置音频流通道类型,参见{@link android.media.AudioManager}
         * 如果音频正在播放,则会因为重新创建AudioTrack导致有短暂停顿
         * @param audioStreamType
         */
        void setAudioStreamType(int audioStreamType);
    • 设置画面缩放模式
      /**
         * 设置视频画面缩放模式,默认为{@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
         * @param videoScalingMode 参见:
         * {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT}
         * {@link android.media.MediaCodec#VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING}
         */
        void setVideoScalingMode(int videoScalingMode);
    • 设置surfaceview
      /**
         * 设置SurfaceView
         * @param surfaceview
         */
        void setSurfaceView(SurfaceView surfaceview);
    • 清除surfaceview
      /**
         * 清除surfaceview
         */
        void clearSurfaceView();
    • 设置textureview
      /**
           * 设置TextureView,同一个TextureView不可被多个播放器共享,提供ZoomableTextureView带手势放缩处理可做参照
           * @param textureview
           */
          void setTextureView(TextureView textureView);
    • 清除textureview
      /**
           * 清除textureview
           */
          void clearTextureView();
    • 设置数据源准备就绪事件监听器
      /**
         * 设置数据源准备就绪事件监听器
         * @param listener
         */
        void setOnPreparedListener(OnPreparedListener listener);
      
      interface OnPreparedListener {
          /**
           * 数据源准备就绪回调
           */
          void onPrepared();
      }
    • 设置播放器错误事件监听器
      /**
         * 设置播放器错误事件监听器,错误类型参见:
         * {@link PlayerException.SOURCE_ERROR}
         * {@link PlayerException.RENDER_ERROR}
         * {@link PlayerException.UNEXPECTED_ERROR}
         * @param listener
         */
        void setOnErrorListener(OnErrorListener listener);
      
      interface OnErrorListener {
          /**
           * 播放器错误回调,参见
           * {@link PlayerException}
           * @param exception
           */
          void onError(PlayerException exception);
      }
    • 设置播放状态变更事件监听器
      /**
         * 设置播放状态变更事件监听器
         * @param listener
         */
        void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener);
      
      interface OnPlayerStateChangedListener {
          /**
           * 播放器状态变更回调
           *
           * @param playerState 参见
           *                    {@link PlayerState#STATE_IDLE}
           *                    {@link PlayerState#STATE_BUFFERING}
           *                    {@link PlayerState#STATE_READY}
           *                    {@link PlayerState#STATE_ENDED}
           */
          void onPlayerStateChange(int playerState);
      }
    • 设置首帧被渲染事件监听器
      /**
         * 设置首帧被渲染事件监听器
         * @param listener
         */
        void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener);
      
       interface OnRenderedFirstFrameListener {
          /**
           * 首帧被渲染回调
           */
          void onRenderedFirstFrame();
      }
    • 设置视频内容宽高变更回调
          /**
           * 设置视频内容宽高变更回调
           * @param listener
           */
          void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener);
      
       interface OnVideoSizeChangedListener {
      
          /**
           * 内容宽高改变时的回调
           *
           * @param width  视频内容宽,单位像素
           * @param height 视频内容高,单位像素
           */
          void onVideoSizeChanged(int width, int height);
      }
    • 获取当前播放进度
      /**
         * 获取当前播放进度,相对于开始位置的偏移量
         * 播放器状态为{@link PlayerState#STATE_READY}时调用有效
         * @return 单位ms
         */
        long getCurrentPosition();
    • 获取视频总时长
      /**
         * 获取视频总时长
         * 播放器状态为{@link #STATE_READY}时调用有效
         * @return 单位ms
         */
        long getDuration();
    • 获取音量
      /**
         * 获取音量
         * @return 取值范围:0~1
         */
        float getVolume();
    • 获取播放器状态
      /**
         * 获取播放状态
         * @return 状态枚举:
         * {@link PlayerState#STATE_IDLE} 播放器初始状态
         * {@link PlayerState#STATE_BUFFERING} 缓冲中状态
         * {@link PlayerState#STATE_READY} 缓冲结束开始播放状态
         * {@link PlayerState#STATE_ENDED} 播放完成状态
         */
        int getPlayState();
  • ZoomableTextureView
    • 设置画面放大倍数上限
          /**
           * 设置画面放大倍数上限
           * 默认为4倍
           *
           * @param scale倍数
           */
          void setMaxScale(float scale);
    • 将画面缩放比重置为1
          /**
           * 缩放比重置为1
           *
           * @param smooth是否带有平滑变化效果
           */
          void zoomOut(boolean smooth);
    • 获取当前缩放比
          /**
           * 获取当前缩放比
           *
           * @return  未放缩时为1.0f
           */
          float getScale();
    • 设置监听器
          /* 设置监听器
           * @param listener
           */
          void setOnZoomableTextureListener(OnZoomableTextureListener listener);
      
          public interface OnZoomableTextureListener {
      
              /**
               * 当画面缩放比例发生变化时回调
               *
               * @param zoomableTextureView
               * @param scale               画面缩放比例
               */
              void onScaleChanged(ZoomableTextureView zoomableTextureView, float scale);
      
              /**
               * view双击事件回调
               *
               * @param zoomableTextureView
               * @param e                   MotionEvent
               * @return 事件是否被处理,如果返回false,则会启用内部缩放逻辑
               */
              boolean onDoubleTap(ZoomableTextureView zoomableTextureView, MotionEvent e);
      
              /**
               * view单击事件回调
               *
               * @param zoomableTextureView
               * @param e                   MotionEvent
               * @return 事件是否被处理
               */
              boolean onSingleTapConfirmed(ZoomableTextureView zoomableTextureView, MotionEvent e);
      
              /**
               * view长按事件回调
               *
               * @param zoomableTextureView
               * @param e                   MotionEvent
               */
              void onLongPress(ZoomableTextureView zoomableTextureView, MotionEvent e);
          }
    • 设置边缘监听器
      
           void setOnViewEdgeListener(OnViewEdgeListener listener)
      
           interface OnViewEdgeListener {
      
              /**
               * 当第一次拖动到view的边缘
               */
              void onViewEdgeFirstTouched();
      
              /**
               * 当拖动到view下边缘,持续拖动会持续回调
               *
               * @param zoomableTextureView
               * @param delta    持续处于边缘时触摸移动相对上次的差值
               */
              void onBottomEdge(ZoomableTextureView zoomableTextureView, float delta);
      
              /**
               * 当拖动到view上边缘,持续拖动会持续回调
               *
               * @param zoomableTextureView
               * @param delta               持续处于边缘时触摸移动相对上次的差值
               */
              void onTopEdge(ZoomableTextureView zoomableTextureView, float delta);
      
              /**
               * 当拖动到view右边缘,持续拖动会持续回调
               *
               * @param zoomableTextureView
               * @param delta               持续处于边缘时触摸移动相对上次的差值
               */
              void onRightEdge(ZoomableTextureView zoomableTextureView, float delta);
      
              /**
               * 当拖动到view左边缘,持续拖动会持续回调
               *
               * @param zoomableTextureView
               * @param delta               持续处于边缘时触摸移动相对上次的差值
               */
              void onLeftEdge(ZoomableTextureView zoomableTextureView, float delta);
          }

错误列表

错误主码 描述 子码 描述
SOURCE_ERROR 数据源相关错误 SUB_CODE_SOURCE_STREAM_CONNECT_ERROR(1005) 与数据源建立连接失败
SUB_CODE_SOURCE_INVALID_DECRYPTE_KEY(1006) 无效的解密密钥
SUB_CODE_SOURCE_INVALID_RTMP_URL(1007) 无效的播放地址
SUB_CODE_SOURCE_PARAMETER_ERROR(1008) 错误的数据源参数
SUB_CODE_SOURCE_QUERY_URL_FAILED(1009) 请求播放地址失败
RENDER_ERROR 渲染相关错误 SUB_CODE_RENDER_DECODE_ERROR(1000) 解码错误
UNEXPECTED_ERROR 不符合预期错误 SUB_CODE_UNEXPECTED_PULL_STREAM_ERROR(1100) 拉流失败,8S未拉取到流或连接被异常断开

语音对讲

提供App和IPC设备之间端到端的单/双向实时对讲能力。

  • 单讲:App端采集并发送音频数据到设备端进行播放,App端采集音频期间手机保持声音静默。
  • 双讲:App端和设备端都需要同时做采音和放音,设备端必须支持AEC,否则不建议使用该方案。

支持以下格式的音频。

类型 采样率 编码 解码
G711A 8Khz/16Khz
G711U 8Khz/16Khz

使用指南

语音对讲集成分为以下几个步骤。

  1. 创建语音对讲实例,并设置对讲模式和音频参数。
    // 创建语音对讲实例
    liveIntercomV2 = new LiveIntercomV2(context, iotId, LiveIntercomV2.LiveIntercomMode.DoubleTalk, AudioParams.AUDIOPARAM_MONO_8K_G711A);
  2. 注册监听器,并处理语音对讲回调。

    请在对应的事件回调中处理,包括对讲开始、录音开始和结束、录音数据回调(用于UI展示,如音量计算)。

    在语音通道建立和对讲过程中,可能发生的错误详见错误列表

    // 设置语音对讲错误回调 
    liveIntercomV2.setLiveIntercomV2Listener(new LiveIntercomV2Listener() {
                @Override
                public void onTalkReady() {
                    showToast("可以开始说话了");
                }
                @Override
                public void onError(LiveIntercomException error) {
                    showToast("code:" + error.getCode() + " msg:" + error.getMessage());
                }
    
                @Override
                public void onRecordStart() {
                    // 直播播放器设置为静音
                    player.setVolume(0f);
                    showToast("录音机已启动");
                }
    
                @Override
                public void onRecordEnd() {
                    // 直播播放器恢复音量
                    player.setVolume(1f);
                    showToast("录音机结束");
                }
    
                @Override
                public void onRecordBufferReceived(byte[] buffer, int offset, int size) {
                    // nothing
                    Log.d(TAG, "onBufferReceived:" + size);
                }
            });
  3. 设置增益水平。

    可以设置App端声音采集的增益值,提供“无、低、中、高、强”五种水平供选择(默认值为高),请根据设备效果来调整。

       liveIntercomV2.setGainLevel(LiveIntercomV2.GAIN_LEVEL_NONE);
  4. 开始与停止对讲。

    对讲开始后,会请求音频焦点,并设置到通话模式,同时将对端播放声音强制路由到扬声器(若已连接蓝牙耳机或者线控耳机则路由到耳机上);对讲结束后释放音频焦点,并设置到常规模式,同时取消强制音频播放路由到扬声器规则。对讲过程中默认开启手机回声消除。

    // 开始对讲
    liveIntercomV2.start();
    // 主动停止
    liveIntercomV2.stop();

接口说明

  • LiveIntercomV2
    • 构造方法
          /**
           * 创建对讲实例
           *
           * @param context          application context
           * @param iotId            iotId
           * @param liveIntercomMode 对讲模式,单讲SingleTalk、双讲DoubleTalk
           * @param audioParams      音频参数(采样率、通道数、采样位宽、编码格式)
           */
          LiveIntercomV2(Context context, final String iotId, final LiveIntercomMode liveIntercomMode, final AudioParams audioParams);
    • 开始语音对讲
      /**
         * 开始语音对讲
         */
        void start();
    • 关闭语音对讲
      /**
         * 关闭语音对讲,停止录音,关闭对讲通道,停止播放
         */
        void stop();
    • 释放对讲实例
          /**
           * 释放对讲实例
           */
          void release();
    • 设置静音
          /**
           * 设置静音
           *
           * @param mute true为静音,false为取消静音
           */
          void setMute(boolean mute)
    • 当前对讲是否静音
          /**
           * 当前对讲是否静音
           *
           * @return
           */
          boolean isMute()
    • 设置增益水平
          /**
           * 设置增益水平
           *
           * @param gainLevel
           */
          void setGainLevel(int gainLevel)
    • 设置是否开启对蓝牙耳机和线控耳机的支持
          /**
           * 设置是否开启对蓝牙和有线耳机外设的支持,开启后优先使用外设进行录放音,默认支持
           * @param supportExternalHeadset 是否支持
           */
          void setSupportExternalHeadset(boolean supportExternalHeadset);
    • 设置使用并实现三方变声算法
          /**
           * 设置变声外部实现,设置后{@link #setVoiceChangeType(LiveIntercomVoiceType)} 和{@link #getLiveIntercomVoiceType()}接口将失效.
           * @param voiceChangeImpl   外部实现变声接口
           */
          void setExternalVoiceChangeImpl(IVoiceChange voiceChangeImpl)
      
          interface IVoiceChange {
          /**
           * 对即将发给对端的音频做变声处理,该接口不允许阻塞
           * 音频采样率/位宽/通道数见{@link com.aliyun.iotx.linkvisual.media.audio.LiveIntercomV2#LiveIntercomV2(Context, String, LiveIntercomV2.LiveIntercomMode, AudioParams)}传入的一致
           * @param pcm           待变声的PCM数据,请直接修改内容,始终为PCM格式
           * @param offset        偏移量
           * @param length        数据长度
           * @return  处理成功返回true, 处理失败返回false
           */
          boolean onChangeVoice(byte[] pcm, int offset, int length);
      }
    • 设置对讲监听器
          /**
           * 设置对讲监听器
           *
           * @param listener
           */
         void setLiveIntercomV2Listener(LiveIntercomV2Listener listener);
      
      interface LiveIntercomV2Listener {
      
          /**
           * 语音对讲对端就绪
           */
          void onTalkReady();
      
          /**
           * 语音对讲发生错误
           * @param error
           */
          void onError(LiveIntercomException error);
      
          /**
           * 开始录音
           */
          void onRecordStart();
      
          /**
           * 结束录音
           */
          void onRecordEnd();
      
          /**
           * 接收录音数据
           * @param buffer
           * @param offset
           * @param size
           */
          void onRecordBufferReceived(byte[] buffer, int offset, int size);
      }

错误列表

错误枚举 描述
LiveIntercomException.INVALID_AUDIO_PARAMS 无效的语音对讲音频参数(对端上报的音频参数SDK不支持)
LiveIntercomException.START_LIVE_INTERCOM_REQUEST_FAILED 启动语音对讲失败
LiveIntercomException.CONNECTION_STREAM_FAILED 语音流建立失败(5S未建立成功会超时)
LiveIntercomException.SEND_STREAM_DATA_FAILED 发送语音流数据失败
LiveIntercomException.RECEIVE_STREAM_DATA_FAILED 接收语音流数据失败
LiveIntercomException.INIT_RECORD_FAILED 录音机初始化失败
LiveIntercomException.START_RECORD_FAILED 录音机启动错误
LiveIntercomException.READ_RECORD_BUFFER_FAILED 录音数据读取错误
LiveIntercomException.INIT_AUDIO_PLAYER_FAILED 音频播放器创建失败