腾讯云直播再探

转自:http://blog.csdn.net/g_ying_jie/article/details/72819942

上一篇博客谈到了腾讯云直播功能的基本实现方案,本篇将重点谈及一些细的功能。

一、推流端细功能介绍

①设置推流清晰度

  1. <span style=“font-size:18px;”>//设置视频质量:高清</span>  
  2. <span style=”font-size:18px;”>mTXLivePusher.setVideoQuality(TXLiveConstants.VIDEO_QUALITY_HIGH_DEFINITION);</span>  
//设置视频质量:高清
mTXLivePusher.setVideoQuality(TXLiveConstants.VIDEO_QUALITY_HIGH_DEFINITION);
  1.   

注意:推流开始之后切换推流码率先停止推流,切换码率之后再重启推流,以防止花屏问题发生
  
  
  1. <span style="font-size:18px;">mTXLivePusher.stopPusher();  
  2. mTXLivePusher.setVideoQuality(TXLiveConstants.VIDEO_QUALITY_STANDARD_DEFINITION);  
  3. mTXLivePusher.startPusher(TCConstants.PUBLISH_URL);</span>  
mTXLivePusher.stopPusher();
mTXLivePusher.setVideoQuality(TXLiveConstants.VIDEO_QUALITY_STANDARD_DEFINITION);
mTXLivePusher.startPusher(TCConstants.PUBLISH_URL);
②设置美颜等级,setBeautyFilter 接口可以设置美颜和美白级别,两者的调整级别都是 0 至 9,0 表示不启用美颜
瘦脸,扩眼是升级版sdk的功能需要购买
   
   
  1. <span style="font-size:18px;">mTXLivePusher.setBeautyFilter(73);  
  2. mTXPushConfig.setFaceSlimLevel(5);  
  3. mTXPushConfig.setEyeScaleLevel(3);</span>  
mTXLivePusher.setBeautyFilter(7, 3);
mTXPushConfig.setFaceSlimLevel(5);
mTXPushConfig.setEyeScaleLevel(3);

③控制摄像头,默认是前置摄像头,调用一次前后调整一次
  
  
  1. <span style=“font-size:18px;”>mTXLivePusher.switchCamera();</span>  
mTXLivePusher.switchCamera();
  1. <span style=“font-size:18px;”>  
  2. //mFlashTurnOn为true表示闪光灯打开,否则表示关闭  
  3. if (!mLivePusher.turnOnFlashLight(mFlashTurnOn)) {  
  4.     Toast.makeText(getActivity().getApplicationContext(),  
  5.         ”打开闪光灯失败:绝大部分手机不支持前置闪光灯!”, Toast.LENGTH_SHORT).show();  
  6. }</span>  

//mFlashTurnOn为true表示闪光灯打开,否则表示关闭
if (!mLivePusher.turnOnFlashLight(mFlashTurnOn)) {
    Toast.makeText(getActivity().getApplicationContext(),
        "打开闪光灯失败:绝大部分手机不支持前置闪光灯!", Toast.LENGTH_SHORT).show();
}
大部分后置摄像头才支持对焦,SDK 支持两种对焦模式:手动对焦和自动对焦。自动对焦是系统提供的能力,但有些机型并不支持自动对焦。手动对焦和自动对焦是互斥的,开启自动对焦后,手动对焦将不生效。
SDK 默认配置是手动对焦,您可以通过 TXLivePushConfig 的配置函数 setTouchFocus 接口进行切换:
  
  
  1. <span style="font-size:18px;">mLivePushConfig.setTouchFocus(mTouchFocus);  
  2. mLivePusher.setConfig(mLivePushConfig);</span>  
mLivePushConfig.setTouchFocus(mTouchFocus);
mLivePusher.setConfig(mLivePushConfig);
 
 
 
 
④横竖屏推流问题,当前推流的Activity加入以下属性
<activity
    android:name="com.example.zachary.ui.PushActivity"
    android:configChanges="orientation|keyboardHidden|screenSize" />
该属性保证当前Activity在横竖屏切换时不重新走生命周期,直接回调onConfigurationChanged方法
   
   
  1. <span style="font-size:18px;">//横竖屏推流处理  
  2. @Override  
  3. public void onConfigurationChanged(Configuration newConfig) {  
  4.     // 自动旋转打开,Activity随手机方向旋转之后,只需要改变推流方向  
  5.     int mobileRotation = this.getWindowManager().getDefaultDisplay().getRotation();  
  6.     int pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_DOWN;  
  7.     //观众端图像处理  
  8.     switch (mobileRotation) {  
  9.         case Surface.ROTATION_0:  
  10.             pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_DOWN;  
  11.             break;  
  12.         case Surface.ROTATION_90:  
  13.             pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_RIGHT;  
  14.             break;  
  15.         case Surface.ROTATION_270:  
  16.             pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_LEFT;  
  17.             break;  
  18.         default:  
  19.             break;  
  20.     }  
  21.   
  22.     //通过设置config是设置生效,可以不用重新推流,腾讯云支持直播中热切换分辨率  
  23.     //主播端图像处理  
  24.     mTXLivePusher.setRenderRotation(0);  
  25.     mTXPushConfig.setHomeOrientation(pushRotation);  
  26.     mTXLivePusher.setConfig(mTXPushConfig);  
  27. }</span>  
//横竖屏推流处理
@Override
public void onConfigurationChanged(Configuration newConfig) {
    // 自动旋转打开,Activity随手机方向旋转之后,只需要改变推流方向
    int mobileRotation = this.getWindowManager().getDefaultDisplay().getRotation();
    int pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_DOWN;
    //观众端图像处理
    switch (mobileRotation) {
        case Surface.ROTATION_0:
            pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_DOWN;
            break;
        case Surface.ROTATION_90:
            pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_RIGHT;
            break;
        case Surface.ROTATION_270:
            pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_LEFT;
            break;
        default:
            break;
    }

    //通过设置config是设置生效,可以不用重新推流,腾讯云支持直播中热切换分辨率
    //主播端图像处理
    mTXLivePusher.setRenderRotation(0);
    mTXPushConfig.setHomeOrientation(pushRotation);
    mTXLivePusher.setConfig(mTXPushConfig);
}


⑤事件监听,实现TXLivePushListener 接口即可,相应响应码如下
  
  
  1. @Override  
  2. public void onPlayEvent(int event, Bundle param) {  
  3.     // 反馈播放端该流地址无视频  
  4.     if (event < 0) {  
  5.               
  6.     }  
  7.     //视频断流  
  8.     if (event == TXLiveConstants.PLAY_ERR_NET_DISCONNECT) {  
  9.               
  10.     }   
  11.     if (TXLiveConstants.PLAY_EVT_PLAY_BEGIN == event) {  
  12.               
  13.     }  
  14.     if (TXLiveConstants.PLAY_EVT_PLAY_LOADING == event) {  
  15.     }   
  16. }  
@Override
public void onPlayEvent(int event, Bundle param) {
    // 反馈播放端该流地址无视频
    if (event < 0) {

    }
    //视频断流
    if (event == TXLiveConstants.PLAY_ERR_NET_DISCONNECT) {

    } 
    if (TXLiveConstants.PLAY_EVT_PLAY_BEGIN == event) {

    }
    if (TXLiveConstants.PLAY_EVT_PLAY_LOADING == event) {
    } 
}



  
  
  1.   
  1.   
二、播放端细功能介绍
①播放端画面调整,可选择全屏填充或者按比例缩放
  
  
  1. <span style="font-size:18px;">livePlayer.setRenderMode(TXLiveConstants.RENDER_MODE_FULL_FILL_SCREEN);</span>  
livePlayer.setRenderMode(TXLiveConstants.RENDER_MODE_FULL_FILL_SCREEN);

// 设置播放端竖屏
  
  
  1. <span style="font-size:18px;">txvvPlayerView.setRenderRotation(TXLiveConstants.RENDER_ROTATION_PORTRAIT);</span>  
txvvPlayerView.setRenderRotation(TXLiveConstants.RENDER_ROTATION_PORTRAIT);

 
 
注意:播放端的视频展示有时候按业务需求需要监听推流端是横屏推流还是竖屏推流,以下将提供一种解决思路
  
  
  1. @Override  
  2. public void onNetStatus(Bundle bundle) {  
  3.     int width = Integer.parseInt(bundle.get(TXLiveConstants.NET_STATUS_VIDEO_WIDTH).toString());  
  4.     int height = Integer.parseInt(bundle.get(TXLiveConstants.NET_STATUS_VIDEO_HEIGHT).toString());  
  5.     if (width != 0 && height != 0) {  
  6.         if (width > height) {  
  7.             // 横屏推流  
  8.             isPortraitPusher = false;  
  9.             if (fullScreen) {  
  10.                 mTxlpPlayer.pause();  
  11.                 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  12.                 mTxlpPlayer.resume();  
  13.             }  
  14.         } else {  
  15.             // 竖屏推流  
  16.             isPortraitPusher = true;  
  17.             if (fullScreen) {  
  18.                 mTxlpPlayer.pause();  
  19.                 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  20.                 mTxlpPlayer.resume();  
  21.             }  
  22.         }  
  23.     }  
  24.   
  25. }  
 @Override
    public void onNetStatus(Bundle bundle) {
        int width = Integer.parseInt(bundle.get(TXLiveConstants.NET_STATUS_VIDEO_WIDTH).toString());
        int height = Integer.parseInt(bundle.get(TXLiveConstants.NET_STATUS_VIDEO_HEIGHT).toString());
        if (width != 0 && height != 0) {
            if (width > height) {
                // 横屏推流
                isPortraitPusher = false;
                if (fullScreen) {
                    mTxlpPlayer.pause();
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    mTxlpPlayer.resume();
                }
            } else {
                // 竖屏推流
                isPortraitPusher = true;
                if (fullScreen) {
                    mTxlpPlayer.pause();
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    mTxlpPlayer.resume();
                }
            }
        }

    }

onNetStatus是播放端TXLivePlayListener监听事件重写的方法,该方法通过比较推流视频的横纵大小判断是16:9或者9:16的视频推送,onNetStatus每秒钟会监听响应一次结果,前两次的回调结果无论宽高都是0不具有可比性所以判断中将其过滤掉了。
②暂停播放功能,在直播过程中调用pause,效果等同于暂时停止拉流,播放器不会被销毁,但会显示最后一帧画面。
// 暂停
mLivePlayer.pause();
// 继续
mLivePlayer.resume();

③卡顿与延时
文档推荐:https://www.qcloud.com/document/product/454/7946#5.-.E6.92.AD.E6.94.BE.E7.AB.AF.E7.9A.84.E4.BC.98.E5.8C.969
   
   
  • 三种模式的对接代码
  1. TXLivePlayConfig mPlayConfig = new TXLivePlayConfig();  
  2.   
  3. //自动模式  
  4. mPlayConfig.setAutoAdjustCacheTime(true);  
  5. mPlayConfig.setMinAutoAdjustCacheTime(1);  
  6. mPlayConfig.setMaxAutoAdjustCacheTime(5);  
  7.   
  8. //极速模式  
  9. mPlayConfig.setAutoAdjustCacheTime(true);  
  10. mPlayConfig.setMinAutoAdjustCacheTime(1);  
  11. mPlayConfig.setMaxAutoAdjustCacheTime(1);  
  12.   
  13. //流畅模式  
  14. mPlayConfig.setAutoAdjustCacheTime(false);  
  15. mPlayConfig.setCacheTime(5);  
  16.   
  17. mLivePlayer.setConfig(mPlayConfig);  
  18. //设置完成之后再启动播放  
TXLivePlayConfig mPlayConfig = new TXLivePlayConfig();

//自动模式
mPlayConfig.setAutoAdjustCacheTime(true);
mPlayConfig.setMinAutoAdjustCacheTime(1);
mPlayConfig.setMaxAutoAdjustCacheTime(5);

//极速模式
mPlayConfig.setAutoAdjustCacheTime(true);
mPlayConfig.setMinAutoAdjustCacheTime(1);
mPlayConfig.setMaxAutoAdjustCacheTime(1);

//流畅模式
mPlayConfig.setAutoAdjustCacheTime(false);
mPlayConfig.setCacheTime(5);

mLivePlayer.setConfig(mPlayConfig);
//设置完成之后再启动播放


至此我在项目中用到的腾讯云直播功能基本都已经介绍了,虽然腾讯云官方文档很详细但是做项目总会有一些坑得你
自己爬,如果你在项目集成时遇到了类似的坑欢迎评论区留言交流。后面两到三篇会介绍IM SDK在直播聊天室的运用
以及dfm弹幕库的使用,敬请期待。

直播小DEMO点击打开链接

 
 
 
 
 
  
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值