human: 如何处理七牛云的实时音视频媒体播放器

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Android >媒体播放器

#  媒体播放器

最近更新时间: 2024-08-23 17:56:20

本文主要介绍媒体播放器的使用场景。

>   * v6.4.0 版本开始支持使用
> [QNMediaPlayer](https://developer.qiniu.com/rtc/api/12749/QNMediaPlayer)
> 媒体播放器
>   * 支持播放格式：mp4、flv、mov、mp3、wav、opus、flac、ogg、aac 等格式
>   * 支持将播放音视频流发布到房间内
>   * 解决房间内，因为硬件回音消除，导致媒体播放音量被抑制的问题
>

使用方式如下：

# 创建 QNMediaPlayer

SDK 可以通过
[QNRTC.createMediaPlayer](https://developer.qiniu.com/rtc/api/8732/QNRTC#createMediaPlayer)
来创建 [QNMediaPlayer](https://developer.qiniu.com/rtc/api/12749/QNMediaPlayer)
对象

    
    
    QNMediaPlayer mediaPlayer = QNRTC.createMediaPlayer();
    mMediaPlayer.setMediaPlayerListener(new QNMediaPlayerListener());
    

其中，[QNMediaPlayerListener](https://developer.qiniu.com/rtc/api/12750/QNMediaPlayerListener)
为媒体播放器回调监听类，回调方法定义如下：

    
    
    /**
     * 播放器状态改变时触发
     *
     * @param state 播放器状态
     */
     void onPlayerStateChanged(QNPlayerState state);
    
    /**
     * 播放器事件改变时触发
     *
     * @param event 播放器事件
     * @param info 事件信息，如错误码等
     */
    void onPlayerEvent(QNPlayerEvent event, QNPlayerEventInfo info);
    
    /**
     * 播放进度更新时触发
     *
     * @param position 当前的播放进度，单位 ms
     */
    void onPlayerPositionChanged(long position);
    

媒体播放器的错误码可参考[播放器相关错误码](https://developer.qiniu.com/rtc/development_guidelines/9904/rtc-
error-code-android#9)

# 开始播放

需要配置播放器的数据源

参考代码如下：

    
    
    QNMediaSource source = new QNMediaSource("xxx.mp4");
    int ret = mediaPlayer.play(source);
    if (ret != QNErrorCode.SUCCESS) {
        Log.e(TAG, "play error : " + ret);
    }
    

# 停止播放

参考代码如下：

    
    
    int ret = mediaPlayer.stop();
    if (ret != QNErrorCode.SUCCESS) {
        Log.e(TAG, "stop error : " + ret);
    }
    

# 暂停播放

参考代码如下：

    
    
    int ret = mediaPlayer.pause();
    if (ret != QNErrorCode.SUCCESS) {
        Log.e(TAG, "pause error : " + ret);
    }
    

# 恢复播放

参考代码如下：

    
    
    int ret = mediaPlayer.resume();
    if (ret != QNErrorCode.SUCCESS) {
        Log.e(TAG, "resume error : " + ret);
    }
    

# 改变播放位置

参考代码如下：

    
    
    int ret = mediaPlayer.seekTo(2000);
    if (ret != QNErrorCode.SUCCESS) {
        Log.e(TAG, "seekTo error : " + ret);
    }
    

# 设置循环播放次数

可通过
[QNMediaPlayer.setLoopCount](https://developer.qiniu.com/rtc/api/12749/QNMediaPlayer#setLoopCount)
接口进行循环次数的设置，未设置的情况下，默认播放一次，若设置了指定循环次数，则将在默认播放一次的基础上，再循环播放指定次数。

参考代码如下：

    
    
    mediaPlayer.setLoopCount(2); // 一共将会播放三次
    

# 设置视频渲染视图

可通过
[QNMediaPlayer.setView](https://developer.qiniu.com/rtc/api/12749/QNMediaPlayer#setView)
接口进行视频画面渲染视图的设置，设置后，若存在有效的视频数据，画面将会在视图上进行显示。

参考代码如下：

    
    
    mediaPlayer.setView(new QNSurfaceView());
    

# 获取媒体时长

参考代码如下：

    
    
    // 获取点播文件总时间
    int duration = mediaPlayer.getDuration();
    

# 获取媒体音频 Track

若想要将媒体发布到房间内，可通过
[QNMediaPlayer.getMediaPlayerAudioTrack](https://developer.qiniu.com/rtc/api/12749/QNMediaPlayer#getMediaPlayerAudioTrack)
方法获取到对应的媒体音频 Track，再通过
[QNRTCClient.publish](https://developer.qiniu.com/rtc/api/8684/QNRTCClient#publish%5B1/4%5D)
等接口实现最终的发布。

参考代码如下：

    
    
    // 获取 audioTrack 
    QNCustomAudioTrack audioTrack = mediaPlayer.getMediaPlayerAudioTrack();
    // 发布到房间内
    rtcClient.publish(audioTrack);
    

# 获取媒体视频 Track

若想要将媒体发布到房间内，可通过
[QNMediaPlayer.getMediaPlayerVideoTrack](https://developer.qiniu.com/rtc/api/12749/QNMediaPlayer#getMediaPlayerVideoTrack)
方法获取到对应的媒体视频 Track，再通过
[QNRTCClient.publish](https://developer.qiniu.com/rtc/api/8684/QNRTCClient#publish%5B1/4%5D)
等接口实现最终的发布。

参考代码如下：

    
    
    // 获取 videoTrack 
    QNCustomVideoTrack videoTrack = mediaPlayer.getMediaPlayerVideoTrack();
    // 发布到房间内
    rtcClient.publish(videoTrack);
    

# 获取当前播放状态

可通过
[QNMediaPlayer.getCurrentPlayerState](https://developer.qiniu.com/rtc/api/12749/QNMediaPlayer#getCurrentPlayerState)
接口获取当前的播放状态。

示例代码如下：

    
    
    QNPlayerState state = mediaPlayer.getCurrentPlayerState();
    

# 获取当前的播放位置

可通过
[QNMediaPlayer.getCurrentPosition](https://developer.qiniu.com/rtc/api/12749/QNMediaPlayer#getCurrentPosition)
接口获取当前的播放位置，返回位置单位为 ms。

示例代码如下：

    
    
    int currentPos = mediaPlayer.getCurrentPosition();
    

# 错误码

API 返回的错误码和通过
[QNMediaPlayerListener](https://developer.qiniu.com/rtc/api/12750/QNMediaPlayerListener)
的 `onPlayerEvent`
[QNPlayerEventInfo](https://developer.qiniu.com/rtc/api/12754/QNPlayerEventInfo)
回调拿到异步处理过程中的错误码，可查看具体错误码含义

    
    
    /**
     * 播放器打开媒体文件失败
     */
    public static final int ERROR_PLAYER_OPEN_FILE_FAILED = 50001;
    
    /**
     * 媒体播放器解码失败
     */
    public static final int ERROR_PLAYER_DECODER_FAILED = 50002;
    
    /**
     * 媒体播放器 seek 失败
     */
    public static final int ERROR_PLAYER_SEEK_FAILED = 50003;
    
    /**
     * 非法媒体播放器状态
     */
    public static final int ERROR_PLAYER_INVALID_STATE = 50004;
    

以上内容是否对您有帮助？