WebRTC + 直播 + 连麦 = AnyRTC ?

WebRTC + 直播 + 连麦 = AnyRTC ?

看到这个题目,您似乎瞬间就懵逼了,小编是在梦游中写作文吗?这四个词有什么联系?WebRTC是Google的,
直播是现在最火的,连麦是直播中略吊的,但是AnyRTC是什么鬼,这不瞎扯么╮(╯_╰)╭
您先别着急,听我慢慢给你扯~~~确实,四句话您都说对了,听我一一给你道来。
高手可以直接关闭本页面。不喜勿喷,出门左转

WebRTC
WebRTC是Google的开源项目,目前在其自家浏览器Chrome中自带。百度或Google都可以找到相关介绍,从事相关行业的人都知道WebRTC的鼎鼎大名,如果您还不熟悉,请自行搜索。
WebRTC的编译对于熟悉ninja的人来说小菜一碟,但对于不熟悉的人,要想编译完成没有个三四天是下不来的,更有人下载代码都下不全,小编还是之前移植浏览器时打下的基础^)(^。
以下是小编目前使用的ios和android版本的peerconnection的库的脚本,命令打包而已,其实是编译官方AppRTCDemo的命令,顺带编译出了peerconnection,如果您不想要AppRTCDemo, 可以将AppRTCDemo替换为相应系统的libjingle_peerconnection版本。具体命令都可以在WebRTC Development中找到。
如果你是第一次下载代码,一定要保证网络可以到Google,并且gclient sync到没有新的更新为止,保证代码下完整。

Ios

#!/bin/bash

##
## Dync-AnyRTC
## Hello webrtc
##

if [ x$1 == x ]
then
  echo "==============================="
  echo "$0 arm64|armv7 build_all"
  echo "==============================="
  exit 1;
fi

function build_armv7()
{
    echo "start building armv7..."
    rm -rf out_ios_armv7
    mkdir -p out_ios_armv7/Release-iphoneos
    export GYP_GENERATORS="ninja"
    export GYP_DEFINES="enable_protobuf=0 build_protobuf=0 build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=ios target_arch=arm arm_version=7 use_objc_h264=1"
    export GYP_GENERATOR_FLAGS="output_dir=out_ios_armv7"
    export GYP_CROSSCOMPILE=1
    gclient runhooks
##ninja -C out_ios_armv7/Debug-iphoneos AppRTCDemo
  ninja -C out_ios_armv7/Release-iphoneos AppRTCDemo
    echo "finish building armv7..."
}

function build_arm64()
{
    echo "start building arm64..."
    rm -rf out_ios_arm64
    mkdir -p out_ios_arm64/Release-iphoneos
    export GYP_GENERATORS="ninja"
    export GYP_DEFINES="enable_protobuf=0 build_protobuf=0 build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=ios target_arch=arm64 use_objc_h264=1"
    export GYP_GENERATOR_FLAGS="output_dir=out_ios_arm64"
    export GYP_CROSSCOMPILE=1
    gclient runhooks
##ninja -C out_ios_arm64/Debug-iphoneos AppRTCDemo
  ninja -C out_ios_arm64/Release-iphoneos AppRTCDemo
    echo "finish building arm64..."
}

function build_all()
{
    build_arm64
    build_armv7
}

$@

在src目录下执行./build_all即可

Android

#!/bin/bash

##
## Dync-AnyRTC
## Hello webrtc
##

if [ x$1 == x ]
then
  echo "==============================="
  echo "$0 android64|androidarmv7 debug|release "
  echo "==============================="
  exit 1;
fi

if [ x$2 == x ]
then
  echo "==============================="
  echo "$0 android64|androidarmv7 debug|release "
  echo "==============================="
  exit 1;
fi

if [ $1 == "android64" ]
then
  echo "start building android arm64..."
    export GYP_GENERATORS="ninja"
    export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=android target_arch=arm64"
    export GYP_GENERATOR_FLAGS="output_dir=out_android_arm64"
    export GYP_CROSSCOMPILE=1
    gclient runhooks --force
    if [ $2 == "debug" ]
    then
    ninja -C out_android_arm64/Debug AppRTCDemo
    else
    ninja -C out_android_arm64/Release AppRTCDemo
    fi
    echo "finish building android arm64..."
elif [ $1 == "androidarmv7" ]
then
  echo "start building android armv7..."
    export GYP_GENERATORS="ninja"
    export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1 OS=android target_arch=arm arm_version=7"
    export GYP_GENERATOR_FLAGS="output_dir=out_android_armv7"
    export GYP_CROSSCOMPILE=1
    gclient runhooks --force
    if [ $2 == "debug" ]
    then
    ninja -C out_android_armv7/Debug AppRTCDemo
    else
    ninja -C out_android_armv7/Release AppRTCDemo
    fi
    echo "finish building android armv7..."
else
    echo "==============================="
    echo "$0 android64|androidarmv7 debug|release "
    echo "==============================="
fi
在src目录下执行./run_build.sh android64 release 即可
gclient runhooks会生成相关的工程代码,--force不一定非要带,gclient runhooks失败时,可以尝试加上--force。

您可能有疑问为什么是peerconnection的库呢?
第一,peerconnection是webrtc对外的提供的比较全的接口的类
第二,peerconnection在框架的高层,与应用层最近,需要的改动最少
第三,peerconnection最容易编译和集成
第四,如果你想要两个人简单的直播连麦,peerconnection就足够了

直播
直播可以说是今年最火的两个字了,各大平台相继推出自己的直播,网上随便一搜,文章,APP一大吨,就是吨,据说几个月前都快200家。文章也有每天都有新鲜的
举个例子: 如何搭建一个完整的视频直播系统?,
站在风口,移动直播+营销将何去何从?,随便哪个平台关键字搜索直播都数不完~~
简单来说就是一个人发布自己的直播供别人观看,可以有一点延迟,重点在服务器的稳定和流量带宽,CDN的分发。而目前直播技术最简单成熟的就是基于RTMP的推流拉流,在此我推荐SRS(http://www.chnvideo.com/blog-classic-srs.html),原因很简单,就是简单高效稳定开源,文章可参考http://www.cnblogs.com/meetrice/p/5428985.html

连麦
连麦是现在直播中比较高大上的一个功能,可以和主播直接互动,市面上的映客,ME直播可以,一般都是两个人或三个人之间互动,可以说是为直播锦上添花,拉近了主播和和粉丝的距离,增加了人气等等等。
而基于WebRTC的P2P的连麦是比较简单的,最简单的思路,主播和粉丝P2P通了之后,主播将两路视频或者合成一路直接推送到SRS服务器上,供粉丝观看即可,连麦者获取主播视频本地观看。多人连麦可需要稍微复杂的服务架构设计和实现,有较大的难度,保证实时和稳定以及质量。
简单P2P两人连麦图:
WebRTC + 直播 + 连麦 = AnyRTC ?_第1张图片
另外连麦模型还可以参考http://www.cnblogs.com/oldmanlv/p/5625923.html

AnyRTC
该介绍AnyRTC了,^_^。上面讲了那么多,当然是为AnyRTC打基础的,因为AnyRTC涉及到了以上三个模块。
简单说AnyRTC自己开发了基于WebRTC的支持4人连麦直播的SDK。而且集成简单,服务稳定。

举例来说,以下是从七牛官网获取的接口,以Ios为例,Android的类似。
Ios接口调用
主播端:
在进行了一系列设置和检查后:

// 开始推流,无论 security policy 是 static 还是 dynamic,都无需再单独计算推流地址
[self.session startWithCompleted:^(BOOL success) {
    // 这里的代码在主线程运行,所以可以放心对 UI 控件做操作
    if (success) {
        // 连接成功后的处理
        // 成功后,在这里才可以读取 self.session.pushURL,start 失败和之前不能确保读取到正确的 URL
    } else {
        // 连接失败后的处理
    }
}];

客户端:

PLPlayerOption *option = [PLPlayerOption defaultOption];
[option setOptionValue:@15 forKey:PLPlayerOptionKeyTimeoutIntervalForMediaPackets];
NSURL *url = [NSURL URLWithString:@"直播的 rtmp 地址"];
self.player = [PLPlayer playerWithURL:self.URL option:option];
self.player.delegate = self;
[self.view addSubview:self.player.playerView];
[self.player play]

如果您使用AnyRTC的sdk实现直播连麦,简单示例接口使用如下:
Ios直播接口调用:
主播端:

[self.hosterKit StartPushRtmpStream:self.liveItem.live_rtmp_push_url];

开始推流
客户端:

[self.guestKit StartRtmpPlay:self.liveItem.live_rtmp_pull_url andRender:self.mainView];

开始观看

Android直播接口调用:
主播端

mHosterKit.StartPushRtmpStream(mLiveInfoBean.getLive_rtmp_push_url());

客户端:

mGuestKit.StartRtmpPlay(joinHostInfo.live_rtmp_pull_url, render.GetRenderPointer());

开始观看
当然也需要一些设置和在回调中做相应的处理。

如果您需要连麦功能,
需要先进行开启该功能:

[self.guestKit JoinRTCLine:self.liveItem.g_anyrtcid andCustomID:user.userid andUserData:[userInfo mj_JSONString]];

mGuestKit.JoinRTCLine(joinHostInfo.g_anyrtcid, mUserModel.getUserInfo().getUserid(), getApplyBean());

然后调用申请连麦的接口既可以实现连麦:

[self.guestKit ApplyRTCLine:[applyConnectInfo mj_JSONString]];

mGuestKit.ApplyRTCLine(applyBean);

目前支持四人连麦。Ios和Android一套接口,接口简单,方便集成快速升级。
如有不对,欢迎指出。如有问题,欢迎咨询。

最后奉上超级大资源:https://github.com/DyncLang/DevLiveBook
保证你看上几天几夜都看不完^_^

欢迎加群讨论:580477436

你可能感兴趣的:(直播连麦,AnyRTC)