• 移动云获取推拉流地址


    一:帮助文档:

    移动云帮助中心icon-default.png?t=N7T8https://ecloud.10086.cn/op-help-center/doc/category/753

    二:准备工作:

    1:进入移动云首页,点击【产品】>【视频服务】>【视频服务】>【视频直播】

            点击【立即订购】,会跳转到视频直播购买页面进行购买

    2:根据选择订购服务的区域,确认对应的API接入地址。

    3:进入控制台,选择视频点播,点击API认证消息,获取uid、secretId、secretKey备用。

    三:流程说明:

    1:想要获取移动云的直播推拉流地址,首先需要有一个直播频道。

    这个直播频道是调用API接口 /l2/live/createChannel创建时返回的channel_Id。

    使用该频道id作为参数,再去请求推流和播流的API地址,就能获得对应的推拉流地址。

    参考文档:移动云帮助中心icon-default.png?t=N7T8https://ecloud.10086.cn/op-help-center/doc/article/40529

     2:无论是创建直播频道还是获取推拉流地址,都需要携带token验证字符串,API接口在收到请求时,会验证token是否有效。

    所以,生成token是所有请求的必经之路。

    3:官方文档推荐使用v2.0版本进行鉴权,那么,接下来我们就讲解v2.0版本的鉴权token如何生成。参考文档:

    移动云帮助中心icon-default.png?t=N7T8https://ecloud.10086.cn/op-help-center/doc/article/40526

    请注意:生成鉴权token时,需要根据每个业务接口文档的GET和POST请求方式不同而给签名body赋予不同的值。下面是官方文档中需要注意事项,特别之处已经标注出来。

    四:代码实现:

    1. /**
    2. * 生成移动云鉴权token
    3. * $business_arr 业务参数列表
    4. * $request_type 请求方式 get/post 默认get
    5. */
    6. function getEcloudToken($business_arr,$request_type='get'){
    7. $rs=[];
    8. $uid=;
    9. $secretId=;
    10. $secretKey=;
    11. $apiId=200001;
    12. $currentTimeStamp=getMillisecond();
    13. $expired=$currentTimeStamp+12*60*60*1000;
    14. $grant_type='v2.0';
    15. $random=sprintf("%08d",rand(0,99999999));
    16. $arr=[
    17. 'apiId'=>$apiId,
    18. 'body'=>'%5B%5D',
    19. 'currentTimeStamp'=>$currentTimeStamp,
    20. 'expired'=>$expired,
    21. 'grant_type'=>$grant_type,
    22. 'random'=>$random,
    23. 'secretId'=>$secretId,
    24. 'uid'=>$uid
    25. ];
    26. if($request_type=='post'){
    27. $body_str = rawurlencode(json_encode($business_arr));
    28. $arr['body']=$body_str;
    29. }else{
    30. $arr=array_merge($arr,$business_arr);
    31. }
    32. //var_dump($request_type."参与token生成的参数");
    33. //var_dump($arr);
    34. //var_dump("业务参数");
    35. //var_dump($business_arr);
    36. ksort($arr);//按照字典排序参数数组
    37. //var_dump("字典排序后的参数");
    38. //var_dump($arr);
    39. $sign = "";
    40. foreach ($arr as $k => $v) {
    41. $sign .= $k."=".$v."&";
    42. }
    43. $new_sign = mb_substr($sign, 0,mb_strlen($sign)-1);
    44. //var_dump("拼接的字符串");
    45. //var_dump($new_sign);
    46. $token = hash_hmac('sha256', $new_sign, $secretKey);
    47. //var_dump("生成的token");
    48. //var_dump($token);
    49. $rs=[];
    50. unset($arr['body']);
    51. $arr['token']=$token;
    52. //拼接基础参数字符串
    53. ksort($arr);//按照字典排序参数数组
    54. $raw_sign = "";
    55. foreach ($arr as $k => $v) {
    56. $raw_sign .= $k."=".$v."&";
    57. }
    58. $new_raw_sign = mb_substr($raw_sign, 0,mb_strlen($raw_sign)-1);
    59. $rs['raw_sign']=$new_raw_sign;
    60. return $rs;
    61. }
    1. //生成毫秒级时间戳
    2. function getMillisecond() {
    3. list($s1, $s2) = explode(' ', microtime());
    4. return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
    5. }
    1. //字符串中的中文转unicode
    2. function chnToUnicode($str){
    3. $unicode = '';
    4. for ($i = 0; $i < mb_strlen($str); $i++){
    5. $char = mb_substr($str, $i, 1);
    6. if($char >=19968 && $char <=171941){
    7. $unicode .= '\\u' . str_pad(bin2hex(iconv('UTF-8', 'UCS-2', $char)), 4, '0', STR_PAD_LEFT);
    8. }else{
    9. $unicode .= $char;
    10. }
    11. }
    12. return $unicode;
    13. }
    1. //post提交
    2. function curl_post($url,$params){
    3. $rs=['code'=>0,'msg'=>'','info'=>[]];
    4. $ch = curl_init(); // 启动一个CURL会话
    5. curl_setopt($ch, CURLOPT_URL, $url); // 要访问的地址
    6. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查 // https请求 不验证证书和hosts
    7. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
    8. //curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
    9. //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    10. //curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    11. curl_setopt($ch, CURLOPT_POST, true); // 发送一个常规的Post请求
    12. curl_setopt($ch, CURLOPT_POSTFIELDS, $params); // Post提交的数据包
    13. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 设置超时限制防止死循环
    14. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    15. $header=['Content-Type: application/json'];
    16. curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // 设置请求头部信息
    17. //curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    18. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取的信息以文件流的形式返回
    19. $result = curl_exec($ch);
    20. //var_dump("POST请求的返回结果");
    21. //var_dump($result);
    22. if(curl_errno($ch)){
    23. $rs['code']=1001;
    24. $rs['msg']='请求失败';
    25. return $rs;
    26. }
    27. if(!isJsonString($result)){
    28. $rs['code']=1002;
    29. $rs['msg']=$result;
    30. return $rs;
    31. }
    32. $result_arr = json_decode($result,true);
    33. if($result_arr['ret']==0 && $result_arr['msg']=='success'){
    34. $rs['info'][0]=$result_arr['result'];
    35. return $rs;
    36. }else{
    37. $rs['code']=1003;
    38. $rs['msg']=$result;
    39. return $rs;
    40. }
    41. curl_close($ch);
    42. }
    43. //get提交
    44. function curl_get($url){
    45. $rs=['code'=>0,'msg'=>'','info'=>[]];
    46. $header = array(
    47. 'Content-Type: application/json',
    48. );
    49. $curl = curl_init();
    50. //设置抓取的url
    51. curl_setopt($curl, CURLOPT_URL, $url);
    52. //设置头文件的信息作为数据流输出
    53. curl_setopt($curl, CURLOPT_HEADER, 0);
    54. // 超时设置,以秒为单位
    55. curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    56. // 超时设置,以毫秒为单位
    57. // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
    58. // 设置请求头
    59. curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    60. //设置获取的信息以文件流的形式返回,而不是直接输出。
    61. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    62. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    63. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    64. //执行命令
    65. $result = curl_exec($curl);
    66. // 显示错误信息
    67. if (curl_error($curl)) {
    68. $rs['code']=1001;
    69. $rs['msg']='请求失败';
    70. return $rs;
    71. }
    72. //var_dump("GET请求的返回结果");
    73. //var_dump($result);
    74. if(!isJsonString($result)){
    75. $rs['code']=1002;
    76. $rs['msg']=$result;
    77. return $rs;
    78. }
    79. $result_arr = json_decode($result,true);
    80. if($result_arr['ret']==0 && $result_arr['msg']=='success'){
    81. $rs['info'][0]=$result_arr['result'];
    82. return $rs;
    83. }else{
    84. $rs['code']=1003;
    85. $rs['msg']=$result;
    86. return $rs;
    87. }
    88. curl_close($curl);
    89. }
    90. /**
    91. * 校验json字符串
    92. * @param string $stringData
    93. * @return bool
    94. */
    95. function isJsonString($stringData){
    96. if (empty($stringData)) return false;
    97. try{
    98. //校验json格式
    99. json_decode($stringData, true);
    100. return JSON_ERROR_NONE === json_last_error();
    101. }
    102. catch (\Exception $e)
    103. {
    104. return false;
    105. }
    106. }
    1. /**
    2. * @desc 移动云推拉流地址
    3. * @param string $stream 流名
    4. * @param int $type 类型,0表示播流,1表示推流
    5. */
    6. function PrivateKey_ecloud($stream,$type){
    7. $api_url='https://api.migucloud.com'; //根据自己应用所在区域进行更换
    8. $stream_arr = explode('_',$stream);
    9. $liveuid=$stream_arr[0];
    10. $starttime=$stream_arr[1];
    11. //推流
    12. if($type==1){
    13. //1:创建直播
    14. $param=[
    15. 'title'=>'用户'.$liveuid,
    16. 'startTime'=>date('Y-m-d H:i:s',$starttime),
    17. 'endTime'=>date('Y-m-d H:i:s',$starttime+30*24*60*60),
    18. 'subject'=>'用户'.$liveuid.'直播',
    19. 'record'=>0,
    20. 'playMode'=>0,
    21. 'cdnType'=>0,
    22. ];
    23. //获取签名token
    24. $result_arr = getEcloudToken($param,'post');
    25. //var_dump("请求签名后返回的参数");
    26. //var_dump($result_arr);
    27. $createroom_method='/l2/live/createChannel';
    28. //带基础参数
    29. $request_url=$api_url.$createroom_method.'?'.$result_arr['raw_sign'];
    30. //var_dump("请求创建直播接口的地址");
    31. //var_dump($request_url);
    32. $param['title']=chnToUnicode($param['title']);
    33. $param['subject']=chnToUnicode($param['subject']);
    34. //var_dump("进行POST请求时,传递的业务参数:");
    35. //var_dump($param);
    36. $result = curl_post($request_url,json_encode($param));
    37. if($result['code'] !=0){
    38. $url='';
    39. return $url;
    40. }
    41. $channelId=$result['info'][0]['channelId'];
    42. //var_dump("直播频道id");
    43. //var_dump($channelId);
    44. //2:获取推流地址
    45. $param=[
    46. 'channel_id'=>$channelId
    47. ];
    48. //获取签名token
    49. $result_arr = getEcloudToken($param,'get');
    50. $getpushurl_method='/l2/addr/getPushUrl';
    51. //带基础参数
    52. $request_url=$api_url.$getpushurl_method.'?'.$result_arr['raw_sign'];
    53. //var_dump("请求获取推流接口的地址");
    54. //var_dump($request_url);
    55. $result = curl_get($request_url);
    56. if($result['code'] !=0){
    57. $url='';
    58. return $url;
    59. }
    60. $push_url=$result['info'][0]['cameraList'][0]['url'];
    61. //var_dump("推流地址");
    62. //var_dump($push_url);
    63. return ['channel_id'=>$channelId,'push_url'=>$push_url];
    64. //播流
    65. }else{
    66. $channel_id=''; //创建直播接口返回的channelId
    67. $param=[
    68. 'channel_id'=>$channel_id
    69. ];
    70. //获取签名token
    71. $result_arr = getEcloudToken($param,'get');
    72. //var_dump("请求签名后返回的参数");
    73. //var_dump($result_arr);
    74. $getpullurl_method='/l2/addr/getPullUrl';
    75. //带基础参数
    76. $request_url=$api_url.$getpullurl_method.'?'.$result_arr['raw_sign'];
    77. //var_dump("请求获取播流接口的地址");
    78. //var_dump($request_url);
    79. $result = curl_get($request_url);
    80. if($result['code'] !=0){
    81. $url='';
    82. return $url;
    83. }
    84. $pull_url=$result['info'][0]['cameraList'][0]['transcodeList'][0]['urlRtmp'];
    85. //var_dump("播流地址");
    86. //var_dump($pull_url);
    87. return $pull_url;
    88. }
    89. }
    1. //删除直播
    2. function removeChannel($channel_id){
    3. $param=['id'=>$channel_id];
    4. $result_arr = getEcloudToken($param,'post');
    5. $removechannel_method='/l2/live/removeChannel';
    6. $api_url='https://api.migucloud.com'; //根据自己应用所在地区替换
    7. $request_url=$api_url.$removechannel_method.'?'.$result_arr['raw_sign'];
    8. $result = curl_post($request_url,json_encode($param));
    9. }

    调用方法:

    获取推流地址:

    $stream='1001_1698291555';
    PrivateKey_ecloud($stream,1);

    返回创建开播参数截图:

    截图中请求创建开播的API地址:【敏感信息已做处理】


    https://api.migucloud.com/l2/live/createChannel?apiId=200001¤tTimeStamp=1698460266645&expired=1698503466645&grant_type=v2.0&random=53415941&secretId=69a7c3a1fd52**********b8173&token=752556e89b8af7b572da0d7************df523a1b192a37bd608fd460b014&uid=80000***4

    返回获取推流地址截图:

    截图中请求获取推流的API地址:【敏感信息已做处理】

    https://api.migucloud.com/l2/addr/getPushUrl?apiId=200001&channel_id=20231028103106_BND****U¤tTimeStamp=1698460266888&expired=1698503466888&grant_type=v2.0&random=08691557&secretId=69a7c3a1fd5************18b8173&token=6d9ddbab6dbc3d3d35afd0512***********7c4c9bb6b3cabad9&uid=80000***4

    获取播流地址:

    $stream='1001_1698291555';
    PrivateKey_ecloud($stream,0);

    返回获取播流地址截图:

    截图中请求获取播流的API地址:

    https://api.migucloud.com/l2/addr/getPullUrl?apiId=200001&channel_id=20231028103106_BNDEKC9U¤tTimeStamp=1698463713230&expired=1698506913230&grant_type=v2.0&random=62397059&secretId=69a7c3a1f****************8b8173&token=b4b4a6a30621bfdc6f7f6c66a******************1e430b9d21605b2c75e&uid=80000***4

    截图中返回的结果:【敏感信息已做**处理】

    {"ret":"0","msg":"success","result":{"uid":"800000234","channelId":"20231028103106_BND****U","imgUrl":"","cdnType":0,"viewerNum":0,"urlTimeshift":null,"cameraList":[{"camIndex":"C0","transcodeList":[{"transType":"0","urlRtmp":"rtmp://devlivepull.migucloud.com/live/BND****U_C0","urlHls":"http://wshls.live.migucloud.com/live/BND****U_C0/playlist.m3u8","urlFlv":"http://devlivepull.migucloud.com/live/BND****U_C0.flv","transCode":"Wating","transDesc":"等待中"}]}]}}

  • 相关阅读:
    Java集合详解
    15个经典的Spring面试常见问题
    Qt QSS 属性 vs QObject属性
    ESP32网络开发实例-将数据保存到InfluxDB时序数据库
    #php将时间戳 转化为天小时分秒#
    java中HashMap的设计精妙在哪?
    Linux第4课 Linux的基本操作
    unity使用vs进行c#代码提示,查看F12unity元代码
    数据挖掘题目:根据规则模板和信息表找出R中的所有强关联规则,基于信息增益、利用判定树进行归纳分类,计算信息熵的代码
    分享几个方便好用的网盘搜索引擎
  • 原文地址:https://blog.csdn.net/salestina/article/details/134087354