代码已经上传到github上,喜欢的star下谢谢。
什么叫推流?
上一篇文章已经说过,它是指将音视频数据采集编码之后,推送到您指定的视频云平台上。笼统一点就是,推流是直播的主播端,把主播端采集的音视频数据上传到视频云平台上(我们这里是腾讯云平台),然后粉丝通过我的房间号,进入我的直播间。
腾讯视频云sdk都为开发者想好了,只需要一个推流URL就能驱动。
因此我们第一步需要获取测试的URL,如下
-
获取测试 URL
开通直播服务后,可以使用 直播控制台>>直播码接入>>推流生成器 生成推流地址,详细信息可以参考获得推流播放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
运行下效果如下:
④设定清晰度
腾讯云sdk提供了setVideoQuality()方法来设定推流的画面清晰度,该方法有三个参数,参数的意义详情如下:
⑤美颜滤镜
-
美颜
同样,腾讯云提供了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
在开始推流前,使用 TXLivePushConfig 的setPauseFlag()方法设置切后台 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 重回前台推流
}
效果如下:
4)后台推摄像头采集数据
如果希望主播在切后台或者跳转其他界面还能看到摄像头采集的画面, 按照以下配置即可。
1、1)和 2) 无需设置。
2、3) 中,注释 mLivePusher.pausePusher() 该方法。
3、4) 中,注释 mLivePusher.resumePusher() 该方法。
⑩网络质量提示
通过 TXLivePushListener 里的 onPlayEvent 可以捕获 PUSH_WARNING_NET_BUSY事件,它代表当前主播的网络已经非常糟糕,出现此事件即代表观众端会出现卡顿。
此时可以提示主播 “您当前的网络状况不佳,推荐您离 WiFi 近一点,尽量不要让 WiFi 穿墙”。
到这里腾讯推流基本讲解完成,下一篇说下直播篇。