帖子
帖子
用户
博客
课程
123下一页
返回列表 发新帖
显示全部楼层
20
帖子
0
勋章
6613
Y币

alivcLivePusher 模块使用分享

[复制链接]
发表于 2019-12-27 20:35:04
本帖最后由 yxWin 于 2020-2-7 08:40 编辑

概述
产品简介
阿里云推流SDK(ApsaraVideo for Live Streaming SDK)是基于阿里云强大内容分发网络和音视频实时通讯技术支持下的直播客户端推流开发工具,为用户提供简单易用的开放接口、网络自适应的流畅体验、多节点的低延迟优化、功能强大的实时美颜等音视频直播技术服务。SDK免费提供给所有开发者,让用户告别复杂的架构设计,降低维护成本,专注于自身业务逻辑实现和用户体验的提升。
使用流程
流程 : 用户APP向APPServer发起请求,获取推流URL -> AppServer根据规则拼接推流URL返回给APP -> APP赋值推流URL到推流SDK,使用推流SDK发起推流 -> 推流SDK将直播流推送到CDN
系统要求
  • ios:
    • SDK支持iPhone5s及以上版本,iOS8.0及以上版本
    • 硬件CPU支持ARMv7、ARMv7s、ARM64


  • Android:
    • SDK支持Android 4.3及以上版本
    • 硬件CPU支持ARM64、ARMV7

不能同时添加的模块:aliyunLive 等同样是封装阿里云SDK的模块。
注意
a、使用该模块时需要使用升级后的编译环境,请在云编译的时候勾选“使用升级环境编译”,并且在控制台 “高级设置” 中将固件版本设置为 4.3.1或以上
b、录屏时必须需关闭预览接口 ,如需预览请调用startCameraL()



主要代码
  1. <!DOCTYPE html>
  2. <html>

  3. <head>
  4.     <meta charset="utf-8">
  5.     <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0" />
  6.     <title>title</title>
  7.     <link rel="stylesheet" type="text/css" href="../css/api.css" />
  8.     <style>
  9.         body {}

  10.         footer {
  11.             position: absolute;
  12.             bottom: 0;
  13.             height: 200px;
  14.             width: 100%;
  15.         }

  16.         button {
  17.             margin: 5px;
  18.             padding: 5px;
  19.             background-color: green;
  20.             color: #fff;
  21.             border-radius: 5px;
  22.         }
  23.     </style>
  24. </head>

  25. <body>
  26.     <footer>
  27.         <button type="button" name="button" onclick="initPusherL()">initPusherL</button>
  28.         <button type="button" name="button" onclick="startPreviewL()">startPreviewL</button>
  29.         <button type="button" name="button" onclick="startPushL()">startPushL</button>
  30.         <button type="button" name="button" onclick="stopPushL()">stopPushL</button>
  31.         <button type="button" name="button" onclick="pauseL()">pauseL</button>
  32.         <button type="button" name="button" onclick="resumeL()">resumeL</button>
  33.         <button type="button" name="button" onclick="restartPushL()">restartPushL</button>
  34.         <button type="button" name="button" onclick="reconnectPushL()">reconnectPushL</button>
  35.         <button type="button" name="button" onclick="destroyL()">destroyL</button>
  36.         <button type="button" name="button" onclick="setMuteL()">setMuteL</button>
  37.         <button type="button" name="button" onclick="switchCameraL()">switchCameraL</button>
  38.         <button type="button" name="button" onclick="setFlashL()">setFlashL</button>
  39.         <button type="button" name="button" onclick="setPreviewMirrorL()">setPreviewMirrorL</button>
  40.         <button type="button" name="button" onclick="getFsPath()">getFsPath</button>
  41.         <button type="button" name="button" onclick="startScreenCaptureL()">startScreenCaptureL</button>
  42.         <button type="button" name="button" onclick="stopScreenCaptureL()">stopScreenCaptureL</button>
  43.         <button type="button" name="button" onclick="startCameraL()">startCameraL</button>


  44.     </footer>
  45. </body>
  46. <script type="text/javascript" src="../script/api.js"></script>
  47. <script type="text/javascript">
  48.     var alivcLivePusher = null;
  49.     var pushRUL = 'rtmp://***************************************26213-0-0-863767b7c94eda85bd7a4d1727566b38';
  50.     var fsPath = '';
  51.     apiready = function() {
  52.         alivcLivePusher = api.require('alivcLivePusher');
  53.     };
  54.     //初始化推流
  55.     function initPusherL() {
  56.         alivcLivePusher.initPusher({
  57.             resolution: 540,
  58.             initialVideoBitrate: 800,
  59.             targetVideoBitrate: 800,
  60.             minVideoBitrate: 400,
  61.             qualityMode: 'ResolutionFirst',
  62.             beautyMode: 'normal',
  63.             previewOrientation: 'PORTRAIT',
  64.             externMainStream: true,
  65.             fps: 20,
  66.             videoOnly: true,
  67.             cameraType: 'front' //back
  68.         }, function(ret) {
  69.             alert(JSON.stringify(ret) + '----->初始化成功');
  70.         })
  71.     }
  72.     //预览
  73.     function startPreviewL() {
  74.         alivcLivePusher.startPreview({
  75.             rect: {
  76.                 x: 0, //(可选项)数字类型;模块左上角的 x 坐标(相对于所属的 Window 或 Frame);默认值:0
  77.                 y: 0, //(可选项)数字类型;模块左上角的 y 坐标(相对于所属的 Window 或 Frame);默认值:0
  78.                 w: (api.frameHeight - 200) * (2/3), //(可选项)数字类型;模块宽度(相对于所属的 Window 或 Frame;默认300
  79.                 h: api.frameHeight - 200//(可选项)数字类型;模块高度(相对于所属的 Window 或 Frame;默认300
  80.             },
  81.             fixedOn: api.frameName,
  82.             fixed: false
  83.         }, function(ret) {
  84.             alert(JSON.stringify(ret));
  85.         })
  86.     }
  87.     //开始推流
  88.     function startPushL() {
  89.       alivcLivePusher.startPush({
  90.         url:pushRUL
  91.       },function(ret){
  92.           alert(JSON.stringify(ret));
  93.       })
  94.     }
  95.     //停止推流
  96.     function stopPushL() {
  97.       alivcLivePusher.stopPush();
  98.     }
  99.     //暂停推流
  100.     function pauseL() {
  101.       alivcLivePusher.pause();
  102.     }
  103.     //恢复推流
  104.     function resumeL() {
  105.       alivcLivePusher.resume();
  106.     }
  107.     //重新开始推流
  108.     function restartPushL() {
  109.       alivcLivePusher.restartPush();
  110.     }
  111.     //推流重连
  112.     function reconnectPushL() {
  113.       alivcLivePusher.reconnectPush();
  114.     }
  115.     //销毁推流
  116.     function destroyL() {
  117.       alivcLivePusher.destroy();
  118.     }
  119.     //设置静音
  120.     function setMuteL() {
  121.       alivcLivePusher.setMute({
  122.           isMute:true
  123.       });
  124.     }
  125.     //切换摄像头
  126.     function switchCameraL() {
  127.       alivcLivePusher.switchCamera();
  128.     }
  129.     //设置闪光灯
  130.     function setFlashL() {
  131.       alivcLivePusher.setFlash({
  132.           isFlash:true
  133.       });
  134.     }
  135.     //镜像预览
  136.     function setPreviewMirrorL() {
  137.       alivcLivePusher.setPreviewMirror({
  138.           isMirror:true
  139.       });
  140.     }
  141.     //打开美颜
  142.     function setBeautyOnL() {
  143.       alivcLivePusher.setBeautyOn({
  144.           isBeautyOn:true
  145.       });
  146.     }
  147.     //录屏
  148.     function startScreenCaptureL() {
  149.       alivcLivePusher.startScreenCapture({
  150.           url:pushRUL,
  151.           networkPoorImage:fsPath,
  152.           pausePushImage:fsPath
  153.       },function(ret){
  154.           alert(JSON.stringify(ret));
  155.           startCameraL();
  156.       });
  157.     }
  158.     function stopScreenCaptureL() {
  159.       alivcLivePusher.stopScreenCapture(function(ret){
  160.           alert(JSON.stringify(ret));
  161.       });
  162.     }
  163.     function startCameraL() {
  164.       alivcLivePusher.startCamera({
  165.           rect:{
  166.               x:0,
  167.               y:0,
  168.               w:200,
  169.               h:200
  170.           }
  171.       },function(ret){
  172.           alert(JSON.stringify(ret));
  173.       });
  174.     }
  175.     function getFsPath() {
  176.       api.getPicture({
  177.           sourceType: 'library',
  178.           encodingType: 'jpg',
  179.           mediaValue: 'pic',
  180.           destinationType: 'url',
  181.           allowEdit: true,
  182.           quality: 50,
  183.           targetWidth: 100,
  184.           targetHeight: 100,
  185.           saveToPhotoAlbum: false
  186.       }, function(ret, err){
  187.           if(ret){
  188.             fsPath = ret.data
  189.             console.log(fsPath);
  190.           }else{
  191.                alert(JSON.stringify(err));
  192.           }
  193.       });

  194.     }
  195. </script>

  196. </html>
复制代码

如有问题欢迎指出
22
帖子
1
勋章
1万+
Y币
支持 支持
48
帖子
1
勋章
452
Y币
优秀
25
帖子
0
勋章
1277
Y币
厉害厉害,向大佬学习
0
帖子
0
勋章
17
Y币
您好,我在做直播测试的过程中遇到了问题,想向您咨询下:推流成功了,但是监听到的状态是不停地重连,而且有时候会黑屏,想问问这是什么原因导致的呢?
20
帖子
0
勋章
6613
Y币
浠水 发表于 2020-3-12 14:30
您好,我在做直播测试的过程中遇到了问题,想向您咨询下:推流成功了,但是监听到的状态是不停地重连,而且 ...

网络状态检查一下  切换一下试试
0
帖子
0
勋章
17
Y币
切换网络试过了,但是重复几次结束  录制-开始录制-结束录制-开始录制...  中间还是会有手机黑屏的现象发生
0
帖子
0
勋章
17
Y币
您帮忙看看我的代码是否有问题呢?
  // 初始化
    function fnInitPusher() {
        var isBeautyEnable = false; //是否美颜
        var beautyMode = 'normal'; //美颜模式
        if (systemType == 'android') {
            isBeautyEnable = true;
            beautyMode = 'professional';
        }
        alivcLivePusher.initPusher({
            resolution: 540,
            initialVideoBitrate: 800,
            targetVideoBitrate: 800,
            minVideoBitrate: 400,
            qualityMode: 'FluencyFirst',
            beautyEnable: isBeautyEnable,
            beautyMode: beautyMode,
            previewOrientation: 'PORTRAIT',
            externMainStream: false,
            fps: 20,
            videoOnly: false,
            audioOnly: false,
            cameraType: 'back' //front
        }, function(ret) {
            if (ret.status == true) {
                console.log('初始化成功' + JSON.stringify(ret));
                fnStartPreview();
            } else {
                alert('初始化失败');
            }
        })
    }

    // 开始预览
    function fnStartPreview() {
        alivcLivePusher.startPreview({
            rect: {
                x: 0,
                y: 0,
                w: api.frameWidth,
                h: api.frameHeight
            },
            fixedOn: api.frameName
        }, function(ret) {
            if (ret.status == true) {
                console.log('预览成功' + JSON.stringify(ret));

                fnStartPush();

                fnOpenFooter();

                if(systemType == 'android'){
                    fnSetBeautyOn();//美颜
                }

            } else {
                alert('预览失败');
            }
        })
    }

    //开始推流
    function fnStartPush() {
        alivcLivePusher.startPush({
            url: pushUrl
        }, function(ret) {
            if(ret.status == true){
                console.log('推流成功' + JSON.stringify(ret));
            }else{
              console.warn('推流失败' + JSON.stringify(ret));
            }
        })
    }

    // 是否打开美颜 : 必须在预览或者推流成功后才能调用
    function fnSetBeautyOn(){
      alivcLivePusher.setBeautyOn({
          isBeautyOn:true
      });
      fnSetBeautyValues();
    }

    // 设置美颜参数
    function fnSetBeautyValues(){
      alivcLivePusher.setBeautyValues({
          beautyWhite:80,        //美白  1-100
          beautyBuffing:80,      //磨皮  1-100
          beautyRuddy:80,        //红润  1-100
          beautyCheekPink:80,    //瘦脸  1-100
          beautyThinFace:80,     //收下巴  1-100
          beautyShortenFace:80,  //腮红  1-100
          beautyBigEye:80        //大眼  1-100
      });
    }


    // 结束测试
    function fnStop(){
      alivcLivePusher.stopPush(function(ret) {
          if (ret.status == true) {
              console.log('停止推流成功' + JSON.stringify(ret));
          } else {
              console.warn('停止停推流失败');
          }
      });
    }
27
帖子
0
勋章
224
Y币
开始推流后,获取推流状态getLiveStatus一直是4推流连接中,其实这个时候已经推流成功了,并且播放端也能看到画面
20
帖子
0
勋章
6613
Y币
过一会 重新获取一下可能有点延迟
123下一页
您需要登录后才可以回帖 登录

本版积分规则