背景
对于一款Android设备,如果我想对该Android设备录屏,并经该录屏的数据经过h264编码推流到RTMP服务器,然后由另外一款设备从该服务器拉流,从而显示屏幕数据,实现同屏的效果;另外,如果想开发直播类应用,也可以参考该文,先使用腾讯云SDK进行demo的开发和验证。
腾讯云SDK介绍
腾讯云移动直播(Mobile Live Video Broadcasting,MLVB)SDK 是云直播服务在移动场景的延伸。相比于主要面向云对接的直播服务,移动直播既提供了基于 RTMP SDK 的“快速集成方案”,也提供了集标准直播(LVB)、快直播(LEB)、云点播(VOD)、即时通信(IM) 和对象存储(COS) 等多云端服务的“一体化解决方案”。具体详情,可参考官网的介绍:https://cloud.tencent.com/document/product/454/56592
搭建RTMP服务器
(1)下载 Nginx 源码
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar -zxvf nginx-1.21.1.tar.gz
(2)下载 Nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git
(3)安装依赖开发包
sudo apt-get install libpcre3-dev libssl-dev
配置、编译和安装
sudo ./configure --with-http_ssl_module --with-http_mp4_module --with-http_flv_module --add-module=../nginx-rtmp-module
sudo make
sudo make install
(4)配置Nginx
cd /home/penglin/data/others/rtmp/myrtmp/nginx-1.21.1/
vim bin/conf/nginx.conf
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
rtmp {
server {
#注意端口占用
listen 1935;
application myapp {
live on;
#丢弃闲置5s的连接
drop_idle_publisher 5s;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
#注意目录
root /home/penglin/data/others/rtmp/myrtmp/nginx-rtmp-module-master/;
}
location /control {
rtmp_control all;
}
location /rtmp-publisher {
#注意目录
root /home/penglin/data/others/rtmp/myrtmp/nginx-rtmp-module-master/test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
(5)启动或停止服务
cd /home/penglin/data/others/rtmp/myrtmp/nginx-1.21.1/
sudo bin/sbin/nginx -- 启动 Nginx 服务
sudo bin/sbin/nginx -s stop -- 停止 Nginx 服务
运行nginx:sudo bin/sbin/nginx
浏览器中可以查看:http://192.168.36.113/stat
如果各位不想操作上述步骤,也可以直接下载我已经调试好了的RTMP服务器压缩包,只需要解压该压缩包,运行nginx即可搭建成一个RTMP服务器。
详见:https://download.csdn.net/download/jidapenglin28/22034838
编写Android版本的视频推流程序
摄像头推流,请参考:https://cloud.tencent.com/document/product/454/56592
录屏推流,请参考:https://cloud.tencent.com/document/product/454/56595
腾讯云SDK的推流所使用的RTMP服务器可以使用腾讯云,也可以使用自己搭建的RTMP服务器,如果要使用腾讯云的RTMP(属于腾讯云直播模块),则需要按照腾讯云的相关要求进行若干申请,手续还挺麻烦的,如果您想使用,具体可以参考:https://console.cloud.tencent.com/live/livestat
本文则直接使用的上面的步骤搭建出来的RTMP服务器。
摄像头推流
步骤一:申请腾讯云License
https://console.cloud.tencent.com/live/license
然后在你的Android应用的onCreate或者Application中初始化:
public class MApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
String licenceURL = ""; // 获取到的 licence url
String licenceKey = ""; // 获取到的 licence key
TXLiveBase.getInstance().setLicence(this, licenceURL, licenceKey);
}
}
注:还需要在app的build.gradle中添加腾讯云SDK的依赖
implementation 'com.tencent.liteav:LiteAVSDK_Professional:latest.release'
步骤二:推流
V2TXLivePusher mLivePusher = new V2TXLivePusherImpl(this, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTMP); //指定对应的直播协议为 RTMP
//启动本地摄像头预览
TXCloudVideoView mPusherView = (TXCloudVideoView) findViewById(R.id.pusher_tx_cloud_view);
mLivePusher.setRenderView(mPusherView);
mLivePusher.startCamera(true);
//启动推流
String rtmpURL = "rtmp://192.168.36.113:1935/myapp/1"; //此处填写您的 rtmp 推流地址
int ret = mLivePusher.startPush(rtmpURL.trim());
if (ret == V2TXLIVE_ERROR_INVALID_LICENSE) {
Log.i(TAG, "startRTMPPush: license 校验失败");
}
可以在需要的位置结束推流:
//结束推流
mLivePusher.stopPush();
步骤三:在推流前,需要在RTMP服务器上开启RTMP服务,然后可以在浏览器中使用http://192.168.36.113/stat之类的链接实时查看到推流的过程,此时如果使用拉流的应用,即可实时播放(如可以在ubuntu服务器上使用命令:ffplay "rtmp://192.168.36.113:1935/myapp/1" 即可播放推送的视频流);
当然,也可使用腾讯云提供的“腾讯云视立方APP”拉流播放。
该apk的下载地址:https://download.csdn.net/download/jidapenglin28/22036087
屏幕推流
步骤一:申请腾讯云License
https://console.cloud.tencent.com/live/license
然后在你的Android应用的onCreate或者Application中初始化:
public class MApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
String licenceURL = ""; // 获取到的 licence url
String licenceKey = ""; // 获取到的 licence key
TXLiveBase.getInstance().setLicence(this, licenceURL, licenceKey);
}
}
注:还需要在app的build.gradle中添加腾讯云SDK的依赖
implementation 'com.tencent.liteav:LiteAVSDK_Professional:latest.release'
步骤二:推流
String rtmpUrl = "rtmp://192.168.36.113:1935/myapp/1";
mLivePusher.startMicrophone();
mLivePusher.startScreenCapture();
mLivePusher.startPush(rtmpUrl);
步骤三:拉流播放,同上面的摄像头推流步骤中的拉流验证方式。
总结
根据本文的操作,可以很快的搭建一个远程监控和同屏的Android应用,方便验证相关的功能和产品。