七牛---借助第三方平台实现移动直播
七牛关于回调流程
直播工作流模型
Client (iOS/Android/PC/Camera) 向 Server (业务逻辑服务器) 请求推流授权
Server 颁发带授权信息的 Stream 给 Client
Client 通过 RTMP 推流 给 Pili Streaming Cloud
Client 向 Server 请求播放授权
Server 向 Client 颁发播放地址
Client 调用 播放器 SDK 打开播放地址进行播放
- 三方交互的业务逻辑可以借鉴如下示意图进行理解:
服务端 SDK 功能介绍
目前提供的服务端 SDK 有:Go, NodeJS, Ruby, Python, PHP, Java
https://github.com/pili-engineering/pili-sdk-go
https://github.com/pili-engineering/pili-sdk-nodejs
https://github.com/pili-engineering/pili-sdk-ruby
https://github.com/pili-engineering/pili-sdk-python
https://github.com/pili-engineering/pili-sdk-php
https://github.com/pili-engineering/pili-sdk-java
服务端 SDK 用于对直播流(Live Streaming)进行增删查改等管理,以及颁发带授权凭证的 RTMP 推流地址,RTMP/HTTP-FLV/HLS 的播放地址给客户端。服务端 SDK 功能包括但不限于:
- hub.create_stream()
- #创建流- hub.get_stream()
- #查询流- hub.list_streams()
- #流列表- stream.update()
- #更新流- stream.delete()
- #删除流- stream.disable()
- #禁止流(禁推、禁播)- stream.enable()
- #激活流- stream.rtmp_publish_url()
- #生成带授权凭证的 RTMP 推流地址- stream.rtmp_live_urls()
- #生成 RTMP 直播播放地址- stream.hls_live_urls()
- #生成 HLS 直播播放地址- stream.http_flv_live_urls()
- #生成 HTTP-FLV 直播播放地址- stream.hls_playback_urls()
- #生成 HLS 回看在线点播地址- stream.status()
- #查询主播推流实时状态信息- stream.segments()
- #查询直播推流和断流的详细记录- stream.snapshot()
- #直播抽帧截图- stream.save_as()
- #直播录制转码(例如转存mp4)- stream.to_json()
- #将 Stream 对象转成 JSON 下发给客户端 SDK
服务端 SDK 使用样例
拿 PHP SDK 举例,接入步骤如下:
第 1 步,集成 SDK
第 2 步,获取 Stream
// 首次,新建流$title = '流名'; // 一般对应主播房间号$publishKey = NULL; // 流密钥,用于生成推流鉴权凭证$publishSecurity = NULL; // 推流鉴权策略, 一般为"static", 针对安全要求较高的UGC推流建议用"dynamic"$stream = $hub->createStream($title, $publishKey, $publishSecurity);// 之后,可以从已创建的流里边复用$stream = $hub->getStream($stream["id"]);
第 3 步,获取 rtmp 推流地址
// 生成 rtmp 推流地址$publishUrl = $stream->rtmpPublishUrl();echo $publishUrl;// => rtmp://publish.example.com/hubName/流名// 手机直播,可将 Stream 对象转成 JSON 下发给客户端推流 SDK$streamJson = $stream->toJSONString();
第 4 步,生成直播播放地址
// 生成 rtmp 直播播放地址$urls = $stream->rtmpLiveUrls();var_export($urls);/*array ( 'ORIGIN' => 'rtmp://live-rtmp.example.com/hubName/流名', '720p' => 'rtmp://live-rtmp.example.com/hubName/流名@720p', '480p' => 'rtmp://live-rtmp.example.com/hubName/流名@480p')*/// 生成 http-flv 直播播放地址$urls = $stream->hlsLiveUrls();var_export($urls);/*array ( 'ORIGIN' => 'http://live-hdl.example.com/hubName/流名.flv', '720p' => 'http://live-hdl.example.com/hubName/流名@720p.flv', '480p' => 'http://live-hdl.example.com/hubName/流名@480p.flv')*/// 生成 hls 直播播放地址$urls = $stream->hlsLiveUrls();var_export($urls);/*array ( 'ORIGIN' => 'http://live-hls.example.com/hubName/流名.m3u8', '720p' => 'http://live-hls.example.com/hubName/流名@720p.m3u8', '480p' => 'http://live-hls.example.com/hubName/流名@480p.m3u8')*/
这样边推流就可以边播放。如果是使用 OBS 桌面直播推流软件推流,假设生成的
static
推流 URL 如下:rtmp://{domain}/{hub_name}/{stream_title}?key={publishKey}
OBS 串流地址请按如下格式填写:
URL:
rtmp://{domain}/{hub_name}
Stream:
{stream_title}?key={publishKey}
第 5 步, 主播管理
// 查询主播实时Qos状态$result = $stream->status();var_export($result);/*array ( 'addr' => '222.73.202.226:2572', 'status' => 'connected', 'bytesPerSecond' => 16870.200000000001, 'framesPerSecond' => array ( 'audio' => 42.200000000000003, 'video' => 14.733333333333333, 'data' => 0.066666666666666666, ),)*/// 禁推,禁播$stream = $stream->disable();// 重新激活$stream = $stream->enable();
第 6 步,在线回放点播
// 获取主播推流断流记录,用于查询可用的回看区间值// $result = $stream->segments();// $start = $result["segments"][0]["start"]; // 第一个分段的 start// $end = $result["segments"][-1]["end"]; // 最后一个分段的 end// 生成 hls 回看点播地址$start = 1440196065; // required, in second, unix timestamp$end = 1440196105; // required, in second, unix timestamp$urls = $stream->hlsPlaybackUrls($start, $end);var_export($urls);/*array ( 'ORIGIN' => 'http://playback.example.com/hubName/流名.m3u8?start=1440196065&end=1440196105', '720p' => 'http://playback.example.com/hubName/流名@720p.m3u8?start=1440196065&end=1440196105', '480p' => 'http://playback.example.com/hubName/流名@480p.m3u8?start=1440196065&end=1440196105')*/
第 7 步,
// 直播点播抽帧截图$name = 'imageName.jpg'; // required$format = 'jpg'; // required$time = 1440196100; // optional, in second, unix timestamp$notifyUrl = NULL; // optional, callback server endpoint$result = $stream->snapshot($name, $format, $time, $notifyUrl); # => Arrayvar_export($result);/*array ( 'targetUrl' => 'http://static.example.com/snapshots/z1.hubName.55d7a219e3ba5723280000b5/imageName.jpg', 'persistentId' => 'z1.55d7a6e77823de5a49a8899a',)*/
第 8 步,转存直播录像为音视频文件进行下载
$name = 'videoName.mp4'; // required$format = 'mp4'; // required$start = 1440196065; // required, in second, unix timestamp$end = 1440196105; // required, in second, unix timestamp$notifyUrl = NULL; // optional$result = $stream->saveAs($name, $format, $start, $end, $notifyUrl); var_export($result);/*array ( 'url' => 'http://vod.example.com/recordings/z1.hubName.55d7a219e3ba5723280000b5/videoName.m3u8', 'targetUrl' => 'http://vod.example.com/recordings/z1.hubName.55d7a219e3ba5723280000b5/videoName.mp4', 'persistentId' => 'z1.55d7a6e77823de5a49a8899b',)*/
可以请求
curl -D GET http://api.qiniu.com/status/get/prefop?id={PersistentId}
查询转存进度。参考:http://developer.qiniu.com/docs/v6/api/overview/fop/persistent-fop.html#pfop-status客户端 SDK
只需要在 Podfile 中添加
pod 'PLCameraStreamingKit'
然后
$ pod install
或者
$ pod update
就集成完毕了。
之后具体的调用可以参见 PLCameraStreamingKit 的 README 文档
其中核心的类是
PLCameraStreamingSession
,整个直播推流过程中基本都是对这个类的实例做的操作。One more thing,
PLCameraStreamingKit
提供了一种切换推流质量的方法,也就是说,在网络环境变更或者其他任何你认为需要提高或者降低推流质量的情况下,你都可以直接操作做切换,并且会有方法回调告知发送队列的状态。 客户端:
手机直播,拿 iOS 举例,您可以非常方便地集成手机直播 SDK 来赋予 APP 直播功能。App 端除了 UI 的定制外,主要是集成 PLCameraStreamingKit 来直接对接 Pili 直播云。
[iOS] 播放器 SDK
https://github.com/pili-engineering/PLPlayerKit
简介
PLPlayerKit 是一个适用于 iOS 的音视频播放器 SDK,可高度定制化和二次开发,特色是支持 RTMP 和 HLS 直播流媒体播放,并且支持常见音视频文件例如 MP4/M4A 的播放。
功能特性
RTMP 直播流播放
HLS 播放
常见音视频文件播放
高可定制
渲染逐行扫描支持
缓存时长可定制
支持本地及线上音视频文件直接播放
[iOS] RTMP 直播推流 SDK
https://github.com/pili-engineering/PLCameraStreamingKit
简介
PLCameraStreamingKit 是一个适用于 iOS 的 RTMP 直播推流 SDK,可高度定制化和二次开发。特色是支持 iOS Camera 画面捕获并进行 H.264 硬编码,以及支持 iOS 麦克风音频采样并进行 AAC 硬编码;同时,还根据移动网络环境的多变性,实现了一套可供开发者灵活选择的编码参数集合。借助 PLCameraStreamingKit,开发者可以快速构建一款类似 Meerkat 或 Periscope 的 iOS 直播应用。
功能特性
硬件编解码
多码率可选
H.264 视频编码
AAC 音频编码
支持前后摄像头
自动对焦支持
手动调整对焦点支持
闪光灯开关
多分辨率编码支持
HeaderDoc 文档支持
内置生成安全的 RTMP 推流地址
ARM64 支持
支持 RTMP 协议直播推流
上图中的stream的作用以及用法:- // streamJSON 是从服务端拿回的
- ////从服务端拿回的 streamJSON 结构如下:
- // @{@"id": @"stream_id",
- @"title": @"stream_title",
- @"hub": @"hub_name",
- @"publishKey": @"publish_key",
- @"publishSecurity": @"dynamic", //or static//
- @"disabled": @(NO),//
- @"profiles": @[@"480p", @"720p"], // or empty Array []
- @"hosts": @{
- @"publish": @{ @"rtmp": @"rtmp_publish_host"// },//
- @"play": @{ @"rtmp": @"rtmp_play_host",//
- @"hls": @"hls_play_host"
- }
- }
- }
- NSDicationary *streamJSON;
- PLStream *stream = [PLStream streamWithJSON:streamJSON];
- // 授权后执行
- void (^permissionBlock)(void) = ^{
- PLVideoStreamingConfiguration *videoConfiguration = [[PLVideoStreamingConfiguration defaultConfiguration]; PLAudioStreamingConfiguration *audioConfiguration = [PLAudioStreamingConfiguration defaultConfiguration];
- self.session = [[PLCameraStreamingSession alloc] initWithVideoConfiguration:videoConfiguration audioConfiguration:audioConfiguration stream:stream videoOrientation:AVCaptureVideoOrientationPortrait];
- self.session.delegate = self; self.session.previewView = self.view;
- };
- void (^noPermissionBlock)(void) = ^{ // 处理未授权情况 };
- // 检查摄像头是否有授权
- PLAuthorizationStatus status = [PLCameraStreamingSession cameraAuthorizationStatus];
- if (PLAuthorizationStatusNotDetermined == status) {
- [PLCameraStreamingSession requestCameraAccessWithCompletionHandler:^(BOOL granted) {
- // 回调确保在主线程,可以安全对 UI 做操作 granted ? permissionBlock() : noPermissionBlock();
- }];
- } else if (PLAuthorizationStatusAuthorized == status) {
- permissionBlock();
- } else {
- noPermissionBlock();
- }
推流操作
// 开始推流,无论 security policy 是 static 还是 dynamic,都无需再单独计算推流地址销毁推流 session
[self.session destroy];
- [self.session startWithCompleted:^(BOOL success) {
- // 这里的代码在主线程运行,所以可以放心对 UI 控件做操作
- if (success) {
- // 连接成功后的处理 // 成功后,在这里才可以读取 self.session.pushURL,start 失败和之前不能确保读取到正确的 URL
- } else { // 连接失败后的处理
- }
- }];
- // 停止推流
- [self.session stop];
详情:http://cocoadocs.org/docsets/PLCameraStreamingKit/1.2.8/index.html
七牛---借助第三方平台实现移动直播相关推荐
- 七牛大数据平台的演进与大数据分析实践--转
原文地址:http://www.infoq.com/cn/articles/qiniu-big-data-platform-evolution-and-analysis?utm_source=info ...
- 七牛海量数据处理平台自研容器调度框架实践
大家晚上好,我是七牛云的布道师陈爱珍,主要负责容器技术的落地研究和布道,很高兴今晚可以在这里跟大家分享七牛云容器技术实践的经验. 今晚分享的是七牛云基于容器技术的海量数据处理平台实践.分享的内容包括三 ...
- 七牛非Cocoapods 手动集成霹雳直播SDK(通用版)
引言 一直想写一个通用版的教程,霹雳直播SDK更新太快,每一版的更新,都要重新更新一下之前写的单独的教程.我是个懒人,想要一下解决所有的问题,授人以鱼不如授人以渔,这个博客重点会讲需要用非Cocoap ...
- 企业如何借助第三方平台订立电子劳动合同?
在上一篇<如何订立合规的电子劳动合同--关于人社部发布<电子劳动合同订立指引>的解读(一)>,我们详尽解读了人社部<指引>.其中,<指引>要求" ...
- 阿里云、腾讯云、七牛、网易云CDN简单对比
阿里云.腾讯云.七牛.网易云简单对比如下, 仅做参考: 1.产品功能 产品功能 阿里云视频 腾讯云视频 七牛直播云 网易云视频 服务 直播 点播 转码 互动直播 直播 点播 转码 互动直播 直播 点播 ...
- 七牛云大数据平台建设实践
2017 年 1 月 14.15日,为期 2 天的 ECUG Con 十周年大会在深圳圆满结束,会上七牛云 CEO 许式伟做了题为<七牛大数据平台建设实践>的演讲,首次披露七牛云在大数据方 ...
- 使用 Pandora 平台玩转直播实时质量监控
背景 去年( 2016 年)被称为直播元年,各类移动直播平台如雨后春笋冒出,不断满足人们对强交互.高实时性的新媒体载体的要求.直播过程中所涉及的环节众多,诸如推流.网络传输.节点调度.流处理和播放等, ...
- 直播APP的应用(使用七牛直播平台SDK和环信IM低仿映客)
简介 这是一款低仿映客直播的Android直播聊天应用,本项目通过使用七牛的直播平台提供的sdk进行推流和拉流,使用环信IM来作为用户系统的管理直播聊天室中消息收发.发送礼物.弹幕.私信等功能.本项目 ...
- 何李石:七牛直播云技术详解
导读: 6月30日,七牛在原有云存储,云加速以及数据处理服务的基础上,正式推出七牛直播云服务.这次发布,除了推出实时流网络(LiveNet)作为全面支撑直播实时互动场景的传输网络通道,同时也推出多平台 ...
最新文章
- HDLBits 系列(21)LFSR(线性反馈移位寄存器)
- 听研二师兄师姐报告收获
- AI需求强劲 AI芯片市场规模有望达到405亿
- matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...
- Java基础知识(数据类型和集合)
- 互联网晚报 | 8月11日 星期三 | 苏炳添成为小米品牌代言人;联想企业购正式上线;中国电信A股IPO战略配售结果出炉...
- Go 语言基础(七) 之 并发和网络
- Objective-C:NSArray的常见操作
- (JS-PHP)使用RSA算法进行加密通讯
- 重磅!原清华副校长任职南科大校长:他考研三次,读博七年,想做科研人偶像...
- Google AdSense实战宝典
- 联想服务器怎么安装虚拟机,Windows 8里的虚拟机Hyper-V的安装及使用
- 交换机VLAN工作模式介绍
- Mysql环境变量的配置(详细图解)
- Linux常用软件包安装工具及配置方法(apt-get, pip, dpkg)
- 17. 3D移动 transform:translateX(100px);transform:translateY(100px);transform:translateZ(100px);
- 使用Glide加载圆角矩形图片、圆形图片
- 【c语言】进阶篇学习笔记
- html手机陀螺仪,手机中的陀螺仪竟然也不值得信任
- php函数库快速记忆法_史上最全的php函数大全