七牛---借助第三方平台实现移动直播
 

七牛关于回调流程

直播工作流模型

  1. 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

    // SDK 下载地址:https://github.com/pili-engineering/pili-sdk-phprequire_once ;'/path/to/pili-sdk-php/lib/Pili.php';// 配置企业开发者密钥// 密钥使用七牛账号登录 https://portal.qiniu.com/setting/key ;获取define('ACCESS_KEY', 'Your_Qiniu_AccessKey');define('SECRET_KEY', 'Your_Qiniu_SecretKey');// 已创建好的直播应用名字,账号必须先开通直播权限才可使用// 如未开通,发送邮件至 pili@qiniu.com 告知您的七牛账号和直播场景和业务需求define('HUB', 'Your_Pili_Hub_Name');// 初始化证书授权$credentials = new \Qiniu\Credentials(ACCESS_KEY, SECRET_KEY);$hub = new \Pili\Hub($credentials, HUB);

    第 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 的播放。

    功能特性

    1. RTMP 直播流播放

    2. HLS 播放

    3. 常见音视频文件播放

    4. 高可定制

    5. 渲染逐行扫描支持

    6. 缓存时长可定制

    7. 支持本地及线上音视频文件直接播放

    8. [iOS] RTMP 直播推流 SDK

      • https://github.com/pili-engineering/PLCameraStreamingKit

      简介

      PLCameraStreamingKit 是一个适用于 iOS 的 RTMP 直播推流 SDK,可高度定制化和二次开发。特色是支持 iOS Camera 画面捕获并进行 H.264 硬编码,以及支持 iOS 麦克风音频采样并进行 AAC 硬编码;同时,还根据移动网络环境的多变性,实现了一套可供开发者灵活选择的编码参数集合。借助 PLCameraStreamingKit,开发者可以快速构建一款类似 Meerkat 或 Periscope 的 iOS 直播应用。

      功能特性

      1. 硬件编解码

      2. 多码率可选

      3. H.264 视频编码

      4. AAC 音频编码

      5. 支持前后摄像头

      6. 自动对焦支持

      7. 手动调整对焦点支持

      8. 闪光灯开关

      9. 多分辨率编码支持

      10. HeaderDoc 文档支持

      11. 内置生成安全的 RTMP 推流地址

      12. ARM64 支持

      13. 支持 RTMP 协议直播推流

      上图中的stream的作用以及用法:
      1. // streamJSON 是从服务端拿回的
      2. ////从服务端拿回的 streamJSON 结构如下:
      3. // @{@"id": @"stream_id",
      4.        @"title": @"stream_title",
      5.        @"hub": @"hub_name",
      6.        @"publishKey": @"publish_key",
      7.        @"publishSecurity": @"dynamic",  //or static//
      8.        @"disabled": @(NO),//
      9.        @"profiles": @[@"480p", @"720p"], // or empty Array []
      10.        @"hosts": @{
      11.                             @"publish": @{ @"rtmp": @"rtmp_publish_host"// },//
      12.                             @"play": @{ @"rtmp": @"rtmp_play_host",//
      13.                                                 @"hls": @"hls_play_host"
      14.                                                }
      15.                             }
      16.      }
      17. NSDicationary *streamJSON;
      18. PLStream *stream = [PLStream streamWithJSON:streamJSON];
      19. // 授权后执行
      20. void (^permissionBlock)(void) = ^{
      21.                  PLVideoStreamingConfiguration *videoConfiguration = [[PLVideoStreamingConfiguration defaultConfiguration];                                      PLAudioStreamingConfiguration *audioConfiguration = [PLAudioStreamingConfiguration defaultConfiguration];
      22.                  self.session = [[PLCameraStreamingSession alloc] initWithVideoConfiguration:videoConfiguration audioConfiguration:audioConfiguration stream:stream videoOrientation:AVCaptureVideoOrientationPortrait]; 
      23.                 self.session.delegate = self; self.session.previewView = self.view;
      24. };
      25. void (^noPermissionBlock)(void) = ^{ // 处理未授权情况 };
      26. // 检查摄像头是否有授权
      27. PLAuthorizationStatus status = [PLCameraStreamingSession cameraAuthorizationStatus];
      28. if (PLAuthorizationStatusNotDetermined == status) {
      29.                  [PLCameraStreamingSession requestCameraAccessWithCompletionHandler:^(BOOL granted) {
      30.                           // 回调确保在主线程,可以安全对 UI 做操作 granted ? permissionBlock() : noPermissionBlock();
      31.                   }];
      32. } else if (PLAuthorizationStatusAuthorized == status) { 
      33.                  permissionBlock();
      34. } else {
      35.                noPermissionBlock();
      36. }
      37. 推流操作

        // 开始推流,无论 security policy 是 static 还是 dynamic,都无需再单独计算推流地址

        销毁推流 session

      38. [self.session destroy];

      39. [self.session startWithCompleted:^(BOOL success) {
      40.   // 这里的代码在主线程运行,所以可以放心对 UI 控件做操作 
      41.       if (success) {
      42.   // 连接成功后的处理 // 成功后,在这里才可以读取 self.session.pushURL,start 失败和之前不能确保读取到正确的 URL
      43.       } else { // 连接失败后的处理 
      44.       }
      45. }];
      46. // 停止推流
      47. [self.session stop];
      详情:http://cocoadocs.org/docsets/PLCameraStreamingKit/1.2.8/index.html

七牛---借助第三方平台实现移动直播相关推荐

  1. 七牛大数据平台的演进与大数据分析实践--转

    原文地址:http://www.infoq.com/cn/articles/qiniu-big-data-platform-evolution-and-analysis?utm_source=info ...

  2. 七牛海量数据处理平台自研容器调度框架实践

    大家晚上好,我是七牛云的布道师陈爱珍,主要负责容器技术的落地研究和布道,很高兴今晚可以在这里跟大家分享七牛云容器技术实践的经验. 今晚分享的是七牛云基于容器技术的海量数据处理平台实践.分享的内容包括三 ...

  3. 七牛非Cocoapods 手动集成霹雳直播SDK(通用版)

    引言 一直想写一个通用版的教程,霹雳直播SDK更新太快,每一版的更新,都要重新更新一下之前写的单独的教程.我是个懒人,想要一下解决所有的问题,授人以鱼不如授人以渔,这个博客重点会讲需要用非Cocoap ...

  4. 企业如何借助第三方平台订立电子劳动合同?

    在上一篇<如何订立合规的电子劳动合同--关于人社部发布<电子劳动合同订立指引>的解读(一)>,我们详尽解读了人社部<指引>.其中,<指引>要求" ...

  5. 阿里云、腾讯云、七牛、网易云CDN简单对比

    阿里云.腾讯云.七牛.网易云简单对比如下, 仅做参考: 1.产品功能 产品功能 阿里云视频 腾讯云视频 七牛直播云 网易云视频 服务 直播 点播 转码 互动直播 直播 点播 转码 互动直播 直播 点播 ...

  6. 七牛云大数据平台建设实践

    2017 年 1 月 14.15日,为期 2 天的 ECUG Con 十周年大会在深圳圆满结束,会上七牛云 CEO 许式伟做了题为<七牛大数据平台建设实践>的演讲,首次披露七牛云在大数据方 ...

  7. 使用 Pandora 平台玩转直播实时质量监控

    背景 去年( 2016 年)被称为直播元年,各类移动直播平台如雨后春笋冒出,不断满足人们对强交互.高实时性的新媒体载体的要求.直播过程中所涉及的环节众多,诸如推流.网络传输.节点调度.流处理和播放等, ...

  8. 直播APP的应用(使用七牛直播平台SDK和环信IM低仿映客)

    简介 这是一款低仿映客直播的Android直播聊天应用,本项目通过使用七牛的直播平台提供的sdk进行推流和拉流,使用环信IM来作为用户系统的管理直播聊天室中消息收发.发送礼物.弹幕.私信等功能.本项目 ...

  9. 何李石:七牛直播云技术详解

    导读: 6月30日,七牛在原有云存储,云加速以及数据处理服务的基础上,正式推出七牛直播云服务.这次发布,除了推出实时流网络(LiveNet)作为全面支撑直播实时互动场景的传输网络通道,同时也推出多平台 ...

最新文章

  1. HDLBits 系列(21)LFSR(线性反馈移位寄存器)
  2. 听研二师兄师姐报告收获
  3. AI需求强劲 AI芯片市场规模有望达到405亿
  4. matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...
  5. Java基础知识(数据类型和集合)
  6. 互联网晚报 | 8月11日 星期三 | 苏炳添成为小米品牌代言人;联想企业购正式上线;中国电信A股IPO战略配售结果出炉...
  7. Go 语言基础(七) 之 并发和网络
  8. Objective-C:NSArray的常见操作
  9. (JS-PHP)使用RSA算法进行加密通讯
  10. 重磅!原清华副校长任职南科大校长:他考研三次,读博七年,想做科研人偶像...
  11. Google AdSense实战宝典
  12. 联想服务器怎么安装虚拟机,Windows 8里的虚拟机Hyper-V的安装及使用
  13. 交换机VLAN工作模式介绍
  14. Mysql环境变量的配置(详细图解)
  15. Linux常用软件包安装工具及配置方法(apt-get, pip, dpkg)
  16. 17. 3D移动 transform:translateX(100px);transform:translateY(100px);transform:translateZ(100px);
  17. 使用Glide加载圆角矩形图片、圆形图片
  18. 【c语言】进阶篇学习笔记
  19. html手机陀螺仪,手机中的陀螺仪竟然也不值得信任
  20. php函数库快速记忆法_史上最全的php函数大全

热门文章

  1. 基于PHP的视频社交管理系统
  2. 深入浅出医学注册配准
  3. C++ 图片完整性校验
  4. 教你如何在腾讯云阿里云薅羊毛
  5. 图像处理(数字图像处理)
  6. 消息中间件系列 - RabbitMQ
  7. vue-These relative modules were not found
  8. Vue3 + Echarts 5 绘制带有立体感流线中国地图
  9. 2009中国翻译服务产业论坛志愿者招募公告
  10. 39. 什么是spring通知(Advice)?