Android应用端接入

Android应用端SDK提供了音视频播放、语音对讲等功能。

获取SDK

前提条件

  • 视频设备已接入智能视频服务,详细操作,请参见设备接入

  • 开发前的环境要求如下表所示。

    类别

    说明

    系统版本

    支持Android 4.4及以上版本。

    Java版本

    支持Java 1.7及以上版本。

    API LEVEL

    支持Android SDK API LEVEL 18及以上版本。

    Android Studio版本

    支持Android Studio 2.3以上版本。

配置步骤

  1. 创建Android Studio工程。

  2. 配置依赖。

    1. 在您创建的Android Studio工程,根目录下的build.gradle文件中,添加Aliyun Maven仓库地址。

      maven {
                       url "http://maven.aliyun.com/nexus/content/repositories/releases"
                  }           
    2. app文件夹下的build.gradle文件中添加如下依赖。

      implementation('com.aliyun.iotx:linkvisual-media:1.2.16')
  3. 混淆配置。

    proguard-rules.pro文件中添加如下混淆配置。

    # 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播放器

播放器概述

播放器类型

RTMP播放协议支持以下两类播放器:

  • 直播播放器

    即LivePlayer播放器,用于播放RTMP协议的直播视频源。

  • 设备录像点播播放器

    即VodPlayer播放器,用于播放RTMP协议的设备端存储的视频文件。

示例代码

请参考如下示例代码,了解直播播放器和设备录像点播播放器的使用方法。

直播播放器

// 构造播放器实例
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://××.××.××.××:××/livetv/hunantv");
// 设置数据源就绪监听器
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();  

直播播放器接口说明

构造方法

/**
*构造方法
*@param applicationContext ApplicationContext
   */
  LivePlayer(Context applicationContext);

设置非加密播放源

/**
   * 设置播放源
   * @param URL RTMP地址
   */
  void setDataSource(String url) throws IllegalArgumentException;

设置加密播放源

/**
   * 设置加密播放源(请确保播放源已进行AES加密)
   * @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;

校验和准备数据

/**
   * 校验和准备数据
   */
  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 单位为毫秒
     */
    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 playerStoppedDrawingMode
*ALWAYS_KEEP_LAST_FRAME  播放停止时始终保留最后一帧画面
*KEEP_LAST_FRAME_WITHOUT_ERROR 只有播放停止后未出现错误时,才保留最后一帧画面(默认是此模式) 
*ALWAYS_BLACK 播放停止时始终显示黑色
*/
void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)

设置播放器固定缓存帧数

/**
   * 设置播放器固定缓存帧数
   * @param frameCount 播放器固定缓存帧数,范围为0~16帧,数值越大播放器延迟越大,流畅性越好,默认为5帧
   */
  void setBufferedFrameCount(int frameCount);

设置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时间戳,单位为毫秒
     */
    void onVideoFrameUpdate(int width, int height ,long timestamp);
}

获取YUV帧数据用于渲染

    /**
     * 获取YUV帧数据用于渲染,只在外部渲染模式下有效
     * @return YUV 420P格式视频帧
     */
    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},即缓冲结束,开始播放状态时调用有效
   *
   * @return {@link StreamConnectType}
   */
  StreamConnectType getStreamConnectType();

获取播放器当前的帧率或码率等信息

/**
   * 获取播放器当前的帧率或码率等信息
   * 播放器为如下状态时调用有效:
   * {@link PlayerState#STATE_BUFFERING}缓冲中状态
   * {@link PlayerState#STATE_READY}缓冲结束,开始播放状态
   * @return 包含帧率或码率等信息的JSON string
   */
  PlayInfo getCurrentPlayInfo();

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);
    }

设备录像点播播放器接口说明

构造方法

/**
   * 构造方法
   * @param applicationContext ApplicationContext
   */    
  VodPlayer(Context applicationContext);

设置非加密播放源

/**
   * 设置播放源
   * @param url RTMP地址
   */
  void setDataSource(String url) throws IllegalArgumentException;

设置加密播放源

/**
   * 设置加密播放源(请确保播放源做过AES加密)
   * @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;

校验和准备数据

/**
   * 校验和准备数据
   */
  void prepare();

开始或恢复播放视频

/**
   * 开始播放或恢复播放视频
   */
  void start();

暂停播放

/**
   * 暂停播放,调用start()恢复播放
   */
  void pause();

跳转到指定位置

/**
   * 跳转到指定位置
   * @param position 单位为毫秒
   */
  void seekTo(long positionInMs);

停止播放

/**
   * 停止播放
   */
  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 单位为毫秒
     */
    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 playerStoppedDrawingMode
*ALWAYS_KEEP_LAST_FRAME  播放停止时始终保留最后一帧画面
*KEEP_LAST_FRAME_WITHOUT_ERROR  (默认是此模式)只有播放停止后未出现错误时,才保留最后一帧画面
*ALWAYS_BLACK   播放停止时始终显示黑色
*/
void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)

设置SurfaceVview

/**
*设置SurfaceView,必须为GLSurfaceView,同一个Window中同时只允许一个播放器播放,若需要支持多播放实例,请使用TextureView
*注意GLSurfaceView必须在Activity的onResume和onPause回调方法中调用GLSurfaceView的onResume和onPause方法
*GLSurfaceView及其容器不可设置背景色
*@param SurfaceVview
*/
  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 时间戳,单位为毫秒
     */
    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();

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);
    }

HLS播放器

播放器概述

播放器类型

HLS播放协议的播放器,支持MPEG-TS和fMP4容器,AES-128加密方式,包括以下两类播放器:

  • 自研HLS播放器

  • ExoPlayer HLS播放器

推荐您使用自研HLS播放器。

示例代码

请参考如下示例代码,了解自研HLS播放器和ExoPlayer HLS播放器的使用方法。

自研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();   
...

ExoPlayer HLS播放器

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();  

自研HLS播放器接口说明

构造方法

/**
*构造方法
*@param applicationContext ApplicationContext
   */    
  HlsPlayer(Context applicationContext);

设置播放地址

/**
   * 设置播放源
   * @param url HLS播放地址
   */
  void setDataSource(String url) throws IllegalArgumentException;

校验和准备数据

/**
   * 校验和准备数据
   */
  void prepare();

开始或恢复播放视频

/**
   * 开始播放或恢复播放视频
   */
  void start();

暂停播放

/**
   * 暂停播放,调用start()恢复播放
   */
  void pause();

跳转到指定位置

/**
   * 跳转到指定位置
   * @param position 单位为毫秒
   */
  void seekTo(long positionInMs);

停止播放

/**
   * 停止播放
   */
  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 单位为毫秒
     */
    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 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 时间戳,单位为毫秒
     */
    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 单位为毫秒
   */
  long getCurrentPosition();

获取视频总时长

/**
   * 获取视频总时长
   * 播放器状态为{@link #STATE_READY},即缓冲结束开始播放状态时调用有效
   * @return 单位为毫秒
   */
  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();

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);
    }

ExoPlayer HLS播放器接口说明

构造方法

ExoHlsPlayer(Context context);

设置M3U8播放地址

/**
   * 设置播放源
   * @param url M3U8地址
   */
  void setDataSource(String url);

按云存储录像的文件名设置视频数据源

/**
   * 按云存储录像的文件名设置视频数据源
   * @param iotId    设备iotId
   * @param fileName 录像文件名
   */
   void setDataSourceByIPCRecordFileName(String iotId, String fileName);

校验和准备数据

/**
   * 校验和准备数据
   */
  void prepare();

开始或恢复播放视频

/**
   * 开始播放或恢复播放视频
   */
  void start();

暂停播放

/**
   * 暂停播放, 调用start()恢复播放
   */
  void pause();

跳转到指定位置

/**
   * 跳转到指定位置
   * @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)

请求播放地址失败。

请根据错误信息中msg字段的描述,确定问题并修复。

RENDER_ERROR

该错误主码表示渲染相关错误。

子码

描述

解决方法

SUB_CODE_RENDER_DECODE_ERROR(1000)

解码错误。

若在持续一段时间内,解码均发生失败,您可转存码流数据,然后分析数据。转存的操作步骤如下:

  1. 运行命令adb shell setprop debug.lv.dump.enable true

  2. 重启应用然后播放视频。

  3. 运行命令adb pull /sdcard/LinkVisual_dump/

UNEXPECTED_ERROR

该错误主码表示不符合预期错误。

子码

描述

解决方法

SUB_CODE_UNEXPECTED_PULL_STREAM_ERROR(1100)

超过8秒未拉取到流或连接被异常断开。

请检查以下项目然后重试:

  • 检查设备是否未推流。

  • 检查应用端和设备端的网络是否异常。

语音对讲

对讲类型

语音对讲的类型及其注意事项如下:

类型

说明

注意事项

单向对讲

应用端采集并发送音频数据到设备端进行播放。

App端采集音频期间手机保持静音。

双向对讲

应用端和设备端同时采集音频和播放音频。

设备端必须支持声学回声消除AEC(Acoustic Echo Cancellation),否则不建议使用该功能。

音频类型

语音对讲支持G711a、G711u以及AAC_LC编码方式,三种音频类型详细信息为:

说明

选择编码方式前,请确认您的设备端IPC设备是否支持。

  • 采样率:8 kHz或16 kHz。

  • 支持编码。

  • 支持解码。

操作步骤

  1. 创建语音对讲实例,并设置对讲模式和音频参数。

    liveIntercomV2 = new LiveIntercomV2(context, "", 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) {
                    //音频数据,可用于计算和绘制波形图
                    Log.d(TAG, "onBufferReceived:" + size);
                }
            });
  3. 设置声音采集的增益值。

    增益值包括无、低、中、高、强五种水平,默认值为高,请您根据设备效果来调整。

    liveIntercomV2.setGainLevel(LiveIntercomV2.GAIN_LEVEL_NONE); //设置增益值为无
  4. 开始对讲与停止对讲。

    1. 开始对讲:请求音频焦点,并设置为通话模式,同时将对端播放声音强制路由至扬声器,若已连接蓝牙耳机或者线控耳机则路由至耳机上。

    2. 停止对讲:释放音频焦点,并设置为常规模式,同时取消强制音频播放路由至扬声器或耳机。对讲过程中默认开启手机回声消除。

      //开始对讲请求,请求参数由QueryVoiceIntercom接口返回
      LiveIntercomRequest liveIntercomRequest = new LiveIntercomRequest();
      liveIntercomRequest.setIv(android.util.Base64.decode(obj.getJSONObject("Data").getJSONObject("CryptoKey").getString("Iv"), NO_PADDING));
      liveIntercomRequest.setKey(android.util.Base64.decode(obj.getJSONObject("Data").getJSONObject("CryptoKey").getString("Key"), NO_PADDING));
      liveIntercomRequest.setUrl(obj.getJSONObject("Data").getString("Url"));
      liveIntercomV2.startWithExternalRequest(liveIntercomRequest);
      
      //主动停止
      liveIntercomV2.stop();
      说明

      QueryVoiceIntercom接口详细信息,请参考QueryVoiceIntercom

构造方法

/**
     * 创建对讲实例
     *
     * @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);

开始语音对讲

/**
   * 开始对讲,建立对讲通道,开启录音和播放
   * @param liveIntercomRequest 包括URL,Key和Iv信息,该信息由QueryVoiceIntercom接口获取
   */
  void startWithExternalRequest(LiveIntercomRequest liveIntercomRequest);
说明

QueryVoiceIntercom接口详细信息,请参考QueryVoiceIntercom

关闭语音对讲

/**
   * 关闭语音对讲,停止录音,关闭对讲通道,停止播放
   */
  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);

设置对讲监听器

/**
     * 设置对讲监听器
     *
     * @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

无效的语音对讲音频参数,即语音对讲功能接收端上报的音频参数,Android应用端SDK不支持。

请确保设备端和Android应用端支持如下音频格式并重试:

  • 支持G711A、G711U或AAC_LC编码类型。

  • 支持单通道。

  • 频率为8 kHz或16 kHz。

LiveIntercomException.START_LIVE_INTERCOM_REQUEST_FAILED

启动语音对讲失败。

检查并修复以下异常,然后重试:

  • 检查网络是否故障。

  • 检查设备是否离线。

  • 检查服务端是否出现异常。

  • 检查是否因5秒内设备未及时响应导致上报超时。

LiveIntercomException.CONNECTION_STREAM_FAILED

建立语音流失败。

检查并修复以下异常,然后重试:

  • 检查是否未连接对讲流

  • 检查是否因5秒内设备未及时响应导致上报超时。

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

创建音频播放器失败。

录音机异常,需重启应用端设备,例如重启手机。