腾讯视频直播02-推流

腾讯视频直播01-直播常见协议和集成sdk
腾讯视频直播03-直播

代码已经上传到github上,喜欢的star下谢谢。

什么叫推流?

上一篇文章已经说过,它是指将音视频数据采集编码之后,推送到您指定的视频云平台上。笼统一点就是,推流是直播的主播端,把主播端采集的音视频数据上传到视频云平台上(我们这里是腾讯云平台),然后粉丝通过我的房间号,进入我的直播间。

腾讯视频云sdk都为开发者想好了,只需要一个推流URL就能驱动。
因此我们第一步需要获取测试的URL,如下

代码对接

①添加界面元素
在xml 文件里添加如下代码,它会在您的UI上安插一个 TXCloudVideoView 控件,这是腾讯云用来显示摄像头影像的专用控件:

<com.tencent.rtmp.ui.TXCloudVideoView
    android:id="@+id/txcloutvideo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true" />

②创建 Pusher 对象
我们首先创建一个TXLivePusher 对象,主要用它来完成推流工作。不过在创建 TXLivePusher 对象之前,还需要您指定一个 LivePushConfig 对象,它的用途是决定 LivePush 推流时各个环节的配置参数,比如推流用多大的分辨率、每秒钟要多少帧画面等等。

TXLivePusher mLivePusher = new TXLivePusher(this);
TXLivePushConfig mLivePushConfig = new TXLivePushConfig();
mLivePusher.setConfig(mLivePushConfig);

③启动推流
经过上面2个步骤之后,用下面这段代码就可以启动推流了:

String rtmpUrl = "rtmp://24649.liveplay.myqcloud.com/live/24649_ef53d4eab4"; //我们从上面步骤得到的url
mLivePusher.startPusher(rtmpUrl); //告诉 SDK 音视频流要推到哪个推流URL上去

mLivePusher.startCameraPreview(mTxCloudVideoView);c

运行下效果如下:


效果图.gif

④设定清晰度
腾讯云sdk提供了setVideoQuality()方法来设定推流的画面清晰度,该方法有三个参数,参数的意义详情如下:

截图.png

⑤美颜滤镜

  • 美颜
    同样,腾讯云提供了setBeautyFilter()方法可以设置美颜风格、磨皮程度、美白级别和红润级别

    //style             磨皮风格:  0:光滑  1:自然  2:朦胧
    //beautyLevel       磨皮等级: 取值为 0-9.取值为 0 时代表关闭美颜效果.默认值: 0,即关闭美颜效果.
    //whiteningLevel    美白等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果.
    //ruddyLevel        红润等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果. 
    public boolean setBeautyFilter(int style, int beautyLevel, int whiteningLevel, int ruddyLevel);
    
  • 滤镜
    setFilter() 方法可以设置滤镜效果,滤镜本身是一张直方图文件。腾讯提供了八种素材,可供自己选择。
    setSpecialRatio () 方法则可以设置滤镜的程度,从 0 到 1,越大滤镜效果越明显,默认取值 0.5。

    Bitmap bitmap = BitmapUtils.decodeResource(getResources(), R.drawable.langman);
    if (mLivePusher != null) {
         mLivePusher.setFilter(bmp);
    }
    

⑥控制摄像头
腾讯云sdk默认是前置摄像头(可以通过修改 TXLivePushConfig 的配置函数 setFrontCamera() 来修改这个默认值),调用一次 switchCamera() 切换一次,注意切换摄像头前必须保证 TXLivePushConfig 和 TXLivePusher 对象都已经初始化。

mLivePushConfig.setFrontCamera(true); //默认前置摄像头

mLivePusher.switchCamera(); //切换摄像头

⑦设置 Logo 水印
腾讯视频云目前支持两种水印设置方式:一种是在推流 SDK 进行设置,原理是在 SDK 内部进行视频编码前就给画面打上水印。另一种方式是在云端打水印,也就是云端对视频进行解析并添加水印 Logo。
这里建议使用SDK 添加水印,因为在云端打水印会有问题。这里介绍下sdk添加水印:

//设置视频水印
mLivePushConfig.setWatermark(BitmapFactory.decodeResource(getResources(),R.drawable.watermark), 10, 10);
//后面两个参数分别是水印位置的 X 轴坐标和 Y 轴坐标
mLivePusher.setConfig(mLivePushConfig);

如果您需要对水印图片的位置做机型适配,那么您需要调用水印归一化接口。

//设置视频水印
mLivePushConfig.setWatermark(mBitmap, 0.02f, 0.05f, 0.2f);
//参数分别是水印图片的 Bitmap、水印位置的 X 轴坐标,水印位置的 Y 轴坐标,水印宽度。后面三个参数取值范围是[0, 1]
//后面两个参数分别是水印位置的X轴坐标和 Y 轴坐标
mLivePusher.setConfig(mLivePushConfig);

⑧硬件编码
TXLivePushConfig 中的 setHardwareAcceleration()方法可以开启或关闭硬件编码。

if (mHWVideoEncode){
   if (mLivePushConfig != null) {
       if(Build.VERSION.SDK_INT < 18){
            Toast.makeText(getApplicationContext(), "硬件加速失败,当前手机 API 级别过低(最低 18)", 
            Toast.LENGTH_SHORT).show();
            mHWVideoEncode = false;
       }
   }
}

mLivePushConfig.setHardwareAcceleration(mHWVideoEncode ? 
TXLiveConstants.ENCODE_VIDEO_HARDWARE : TXLiveConstants.ENCODE_VIDEO_SOFTWARE);
mLivePusher.setConfig(mLivePushConfig);  
// 如果你不清楚要何时开启硬件加速, 建议设置为 ENCODE_VIDEO_AUTO
// 默认是启用软件编码, 但手机 CPU 使用率超过 80% 或者帧率 <= 10, SDK 内部会自动切换为硬件编码

⑨后台推流
常规模式下,App 一旦切到后台,摄像头的采集能力就被 Android 系统停掉了,这就意味着 SDK 不能再继续采集并编码出音视频数据。如果我们什么都不做,那么故事将按照如下的剧本发展下去:

  • 阶段一(切后台开始 -> 之后的 10 秒内)- CDN 因为没有数据所以无法向观众提供视频流,观众看到画面卡主。
  • 阶段二(10 秒 -> 70 秒内)- 观众端的播放器因为持续收不到直播流而直接退出,直播间已经人去楼空。
  • 阶段三(70 秒以后)- 推流的 RTMP 链路被服务器直接断掉,主播需要重新开启直播才能继续。
    主播可能只是短暂接个紧急电话而已,但各云商的安全保护措施会让主播的直播被迫提前结束。

1)设置setPauseFlag
在开始推流前,使用 TXLivePushConfig 的 setPauseImg 接口设置一张等待图片,图片含义推荐为“主播暂时离开一下下,稍后回来”。

mLivePushConfig.setPauseImg(300,5);
// 300 为后台播放暂停图片的最长持续时间,单位是秒
// 10 为后台播放暂停图片的帧率,最小值为 5,最大值为 20
Bitmap bitmap = decodeResource(getResources(), R.drawable.pause_publish);
mLivePushConfig.setPauseImg(bitmap);
// 设置推流暂停时,后台播放的暂停图片, 图片最大尺寸不能超过 1920*1920.
mLivePusher.setConfig(mLivePushConfig);

2)设置setPauseFlag
在开始推流前,使用 TXLivePushConfigsetPauseFlag()方法设置切后台 pause 推流时需要停止哪些采集,停止视频采集则会推送 pauseImg 设置的默认图,停止音频采集则会推送静音数据。

setPauseFlag(PAUSE_FLAG_PAUSE_VIDEO|PAUSE_FLAG_PAUSE_AUDIO);//表示同时停止视频和音频采集,并且推送填充用的音视频流;
setPauseFlag(PAUSE_FLAG_PAUSE_VIDEO);//表示停止摄像头采集视频画面,但保持麦克风继续采集声音,用于主播更衣等场景;

3)切后台处理
推流中,如果App被切了后台,调用 TXLivePusher 中的 pausePush 接口函数,之后,SDK 虽然采集不到摄像头的画面了,但可以用您刚才设置的 pauseImg 持续推流。

// activity 的 onStop 生命周期函数
@Override
public void onResume() {
    super.onResume();
    mCaptureView.onResume();     // mCaptureView 是摄像头的图像渲染view
    mLivePusher.resumePusher();  // 通知 SDK 重回前台推流
}

效果如下:


图片.jpg

4)后台推摄像头采集数据
如果希望主播在切后台或者跳转其他界面还能看到摄像头采集的画面, 按照以下配置即可。
1、1)和 2) 无需设置。
2、3) 中,注释 mLivePusher.pausePusher() 该方法。
3、4) 中,注释 mLivePusher.resumePusher() 该方法。

⑩网络质量提示
通过 TXLivePushListener 里的 onPlayEvent 可以捕获 PUSH_WARNING_NET_BUSY事件,它代表当前主播的网络已经非常糟糕,出现此事件即代表观众端会出现卡顿。

此时可以提示主播 “您当前的网络状况不佳,推荐您离 WiFi 近一点,尽量不要让 WiFi 穿墙”。

到这里腾讯推流基本讲解完成,下一篇说下直播篇。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343