zoukankan      html  css  js  c++  java
  • APICloud开发者进阶之路 | qiniuLive模块 解决拉流端模糊问题

    qiniuLive模块推流成功后拉流端湖可能会出现画面 模糊等问题。

    这说明你的配置不是最佳的。
    分享一个比较清晰流畅的案例   

    在 Android 端推流与拉流的开始都需要在监听里执行监听状态码
    文档连接 :

    https://docs.apicloud.com/Client-API/Open-SDK/qiniuLive
    注意:测试时或运行时 打开推流关闭后要销毁,自定义loader调试重启页面也要先销毁一下再测试,否则内存溢出会闪退。
    推流端 代码的实现

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0" />
        <title>title</title>
        <link rel="stylesheet" type="text/css" href="../css/api.css" />
        <style>
            body {}
              footer{
                 100%;
                padding: 30px;
                position: absolute;
                bottom: 0px;
                text-align: center;
              }
              button{
                padding: 8px;
                margin: 5px;
                border-radius: 5px;
                background-color: green;
                color: #fff;
              }
        </style>
    </head>
    <body>
    <footer>
      <button type="button" name="button" onclick="Profile()">预览</button>
      <button type="button" name="button" onclick="changeCamera()">切换摄像头</button>
      <button type="button" name="button" onclick="stopStreamQ()">关闭推流</button>
      <button type="button" name="button" onclick="destroy()">销毁</button>
    </footer>
    </body>
    <script type="text/javascript" src="../script/api.js"></script>
    <script type="text/javascript">
        var qiniuLive = null;
        apiready = function() {
            qiniuLive = api.require('qiniuLive');
            setTimeout(function () {
              initQi();
            }, 2000);
        };
        function initQi() {
            qiniuLive.initStreamingEnv(function(ret) {
                console.log('初始化成功-----》' + JSON.stringify(ret));
                addEventListen();
            });
        }
        function Profile() {
          var quikeid = '*******************************************hOF49rIM5av8MfJJ326noohMJE=';
            qiniuLive.setStreamingProfile({
                rect: {
                    x: 0,
                    y: 0,
                    w: api.frameWidth,
                    h: api.frameWidth * (4/3)
                },
                remoteWindowRect: [{
                    x: api.frameWidth - 120,
                    y: api.frameWidth * (4/3) - 160,
                    w: 120,
                    h: 160
                }],
                pushUrl: quikeid,
                videoCapture: {
                    videoFrameRate: 20,
                    sessionPreset: '1280*720',
                    previewMirrorFrontFacing: true,
                    previewMirrorRearFacing: false,
                    streamMirrorFrontFacing: false,
                    streamMirrorRearFacing: false,
                    videoOrientation: 'portrait',
                    cameraPosition: 'front'
                },
                previewSetting: {
                    previewSizeLevel: 'small', // 字符类型;相机预览大小等级
                    // 取值范围:small, medium, large
                    previewSizeRatio: 'ratio_4_3' // 字符类型;相机预览大小比例 //这个会改变本地的比例大小吗?
                        // 取值范围:ratio_4_3, ratio_16_9
                },
                videoEncodeHeight: '1080',
                videoStream: {
                    videoSize: {
                         368,
                        height: 640
                    },
                    videoQuality: 'medium3'
                },
                audioQuality:'high',
                localWinPosition: {
                    x: 0,
                    y: 0,
                    w: 480,
                    h: 640
                },
                encodeOritation: "protrait",
                face: {
                    beautify: false,
                    setBeautify: 0,
                    setWhiten: 0,
                    setRedden: 0
                },
                continuousFocus: false,
                fixedOn: api.frameName,
                fixed: true
            }, function(ret) {
                if (ret.status) {
                    console.log('setStreamingProfile成功' + JSON.stringify(ret));
                }
            });
        }
        function addEventListen() {
          qiniuLive.addEventListener({
               name: 'streamStatus'
          },function(ret) {
               if (ret.streamStatus == 17) {
                 console.log('准备就绪可以推流--------->' + JSON.stringify(ret));
                 qiniuLive.startStream(function(ret){
                      console.log('推流成功-------->' + JSON.stringify(ret));
                  });
               }
          });
        }
        function destroy() {
          qiniuLive.destroyStream();
        }
        function changeCamera() {
          qiniuLive.toggleCamera();
        }
        function stopStreamQ() {
          qiniuLive.stopStream(function(ret){
              console.log('推流结束------->' + JSON.stringify(ret));
          });
        }
    </script>
    </html>
    复制代码
    

     拉流端 代码的实现

    <!DOCTYPE html>
      <html>
      <head>
          <meta charset="utf-8">
          <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>
          <title>title</title>
          <link rel="stylesheet" type="text/css" href="../css/api.css"/>
          <style>
              body{
              }
              footer{
                position: absolute;
                bottom: 0;
                 100%;
                height: 50px;
                text-align: center;
              }
          </style>
      </head>
      <body>
    <footer>
      <h1>拉流端</h1>
    </footer>
      </body>
      <script type="text/javascript" src="../script/api.js"></script>
      <script type="text/javascript">
          apiready = function(){
            // api.addEventListener({
            //     name:'swipedown'
            // }, function(ret, err){
            //    alert('向下轻扫');
            // });
            setTimeout(function () {
              fninitPMediaPlayer();
            }, 3000);
          };
          function fninitPMediaPlayer() {
            var qiniuLive = api.require("qiniuLive");
            qiniuLive.addEventListener({
                 name: 'status'
            },function(ret) {
                 if (ret.status == 2 ) {
                   qiniuLive.start(function(ret) {
                       alert(JSON.stringify(ret));
                    });
                 }
            });
            qiniuLive.initPMediaPlayer({
              rect: {
                 x: 0,
                 y: 0,
                 w: api.frameWidth,
                 h: api.frameWidth * (4/3)
              },
              dataUrl: 'http://pili***************************************615891.m3u8',
              codec: 0,
              prepareTimeout: 10000,
              readTimeout: 10000,
              isLiveStream: false,
              isDelayOptimization: false,
              cacheBufferDuration: 2000,
              maxCacheBufferDuration: 4000,
              fixedOn: api.frameName,
              fixed: true
              },function(ret) {
              });
          }
      </script>
      </html>
    复制代码
    

      运行截图

     

  • 相关阅读:
    [erlang 002]gen_server中何时会跑到terminate函数
    设计模式:桥接模式
    设计模式:组合模式
    Harbor:镜像上传和下载
    Harbor:简介和安装
    Docker:compose
    ThinkPHP的静态化页面方法
    php使用memcached详解
    大话PHP设计模式
    PHP魔术方法使用
  • 原文地址:https://www.cnblogs.com/APICloud/p/12401098.html
Copyright © 2011-2022 走看看