Android端程序:https://github.com/Zweo/VideoChat
1. 用户A发起视频聊天,将控制信息发往调度服务器,同时将A视频流上传流媒体服务器;
2. 调度服务器通过控制信息找到对应的用户B,B做出响应,将B方视频流上传到流媒体服务器,返回响应信息,并拉取A方视频流。
3. A得到响应信息,拉取B方视频流,实现视频聊天。
本demo中,无调度服务器,只是一个简单的demo,就直接使用默认知道对方的地址进行播放。
如A的地址为 {服务器}/live/hello_1 ,B 为 {服务器}/live/hello_2
流媒体指以流方式在网络中传送音频、视频和多媒体文件的媒体形式。相对于下载后观看的网络播放形式而言,流媒体的典型特征是把连续的音频和视频信息压缩后放到网络服务器上,用户边下载边观看,而不必等待整个文件下载完毕。由于流媒体技术的优越性,该技术广泛应用于视频点播、视频会议、远程教育、远程医疗和在线直播系统中。
本系统采用red5-server作为流媒体服务器,具体部署可参考我另一文章red5,很简单就能配置好使用了。
注意事项:rtmp使用的1985端口可能被防火墙拦截
拉流方式
ijkplayer Android和ios都可用,还支持多种视频的硬解码。
Github网址:https://github.com/Bilibili/ijkplayer
使用方式:具体来讲很有些麻烦,暂时就不讲了,可以查看我的github上用直接封装好的,库文件也封装好了。布局文件中添加VideoView,设置拉流地址,即可播放。
mVideoView.setVideoPath(mVideoPath);
mVideoView.start();
在 ijkVideoView.java 中,设置如下,减小缓存区大小,实现减小延时的效果。
// 设置缓存区,减小延时
ijkMediaPlayer.setOption(1, "analyzemaxduration", 100L);
ijkMediaPlayer.setOption(1, "probesize", 10240L);
ijkMediaPlayer.setOption(1, "flush_packets", 1L);
ijkMediaPlayer.setOption(4, "packet-buffering", 0L);
ijkMediaPlayer.setOption(4, "framedrop", 1L);
推流方式
Github网址:https://github.com/runner365/android_rtmppush_sdk
使用方式:输入推流地址,即可推流。调用RtmpStartMessage函数即开始推流, _rtmpUrl为存储推流地址的变量,改变它即可改变推流地址。
Android 端,将两方的库结合起来,就可以实现一个简单的视频聊天程序了,一个用来推送,一个用于拉流。
我这里整合好的Android程序可以见: https://github.com/Zweo/VideoChat
推流拉流方式很多,这里就不详述了。 主要就是播放视频流地址,以及推送视频流即可。