七牛云直播-Android端播放卡顿问题处理

本文针对七牛云直播Android端遇到的播放卡顿问题进行分析,提出了解决思路。当播放器出现ERROR_CODE_IO_ERROR时,检查网络状态并查询服务端确认直播是否结束,如果未结束则进行重连操作。通过模拟推流、服务端状态查询和Android播放端的监听处理,实现了流畅的直播体验。
摘要由CSDN通过智能技术生成

背景:
七牛直播云主要涉及推流SDK、业务控制SDK、播放SDK、转发平台;而在播放端经常会遇到卡断不能播放的问题,此时可能有两种情况,第一,推流端停止推流,即主播下线;第二,播放端网络慢的原因;所以针对第二种情况就需要做一定的处理;

思路:
因为当申请的直播并没有在推流,或者直播过程中发生网络错误(比如:WiFi 断开),播放器在请求超时或者播放完当前缓冲区中的数据后,会触发onError回调,errorCode: ERROR_CODE_IO_ERROR;而这时需要做两个操作:

  1. 判断网络是否可用;
  2. 查询服务端,获知直播是否结束,如果没有结束,则可以尝试做重连;

    注:如果网络断开或者推流结束都Finish Activity,否则重新连接;

问题解决:
针对前面提出的问题及思路,模拟真实环境来做开发调试,而直播最基本需要三个方面:“推流端”、“服务端”、“播放端”;推流端我使用的是OBS推流软件,把流推到我的直播空间(Hub)中,服务端我写了一个Servlet,来获取当前直播流的状态信息,播放端使用的是Android手机来播放(注:模拟器没办法运行程序)

A.推流端,OBS 调用Camera推流,如下:
这里写图片描述

使用OBS还需要做一定的设置,如图:
这里写图片描述

B.服务端,使用Servlet来获取当前流的状态信息,返回给客户端,程序如下:

package com.qiniu.pili;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.pili.Hub;
import com.pili.PiliException;
import com.pili.Stream;
import com.pili.Stream.Status;
import com.qiniu.Credentials;

/**
 * Servlet implementation class PiliServerServlet
 */
@WebServlet("/PiliServerServlet")
public class PiliServerServlet extends HttpServlet {
   
    private static final long serialVersionUID = 1L;

    private static final String AK = "mfCLP7AlV77j42DZB697zUClBPGdjli_Av******";
    private static final String SK = "FeULzzI79z1EOsDZ0xsXhhXleNEqqN5qZP******";
    private static final String HUB_NAME = "pilistream";


    /**
     * Default constructor. 
     */
    public PiliServerServlet() {

    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Credentials credentials = new Credentials(AK, SK);
        Hub hub = new Hub(credentials, HUB_NAME);
        String streamId = "z1.pilistream.578c8a7efb16df6266052608";
        Stream stream = null;
        try {
            stream = hub.getStream(streamId);
            Status status = stream.status();
            System.out.println(status.toString());
                     response.getOutputStream().println(status.toString());
        } catch (PiliException e) {
            e.printStackTrace();
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);

    }

}

注:服务端在本地,应该是localhost:8080/PiliServlet来访问,但我使用了ngrok,来将服务映射到外网;关于ngrok在下一篇博客中会针对使用做详细的说明讲解。

C.Android播放端,首先实现一个PLMediaPlayer.OnErrorListener监听,当ERROR_CODE为PLMediaPlayer.ERROR_CODE_IO_ERROR时,做“思路”中提出的操作,如图所示:
这里写图片描述
方法实现:
这里写图片描述
当流信息获取后,可以对其进行判断,是否正常结束推流,然后通过Handler返回UI线程,做finish 或者 视频重新连接播放的操作,如图:
这里写图片描述
初始化Handler,如图:
这里写图片描述

android完整程序如下:

package com.qiniu.admin.pilistream;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值