孤独的逆行者 發表於 2022-6-16 09:39:00

uni-app App 下集成 xgplayer

<p>uni-app APP 下集成 xgplayer</p>
<p>uniapp 使用 uni-upgrade-center</p>
<p>&nbsp;</p>
<h1 id="_label0">前言</h1>
<p>如果是 Web 下集成 xgplayer 是很方便的,直接按照官方文档就可以,这里就不做讨论。</p>
<p>之所以是讲 app 下,原因在于 uni-app app 下调用这类 JS 库涉及到操作 dom 的就需要特殊出来。</p>
<p>在最开始按照 web 方式集成进来一直报错,一点头绪没有,经过几天摸索加上咨询找到了一些方式。</p>
<p>&nbsp;</p>
<p>主要的解决方案有以下两张:</p>
<p>1、uni-app 的 renderjs 实现</p>
<p>2、webview 实现</p>
<p>&nbsp;</p>
<h1 id="_label1">一、webview</h1>
<p>web-view 作为一个 web 浏览器组件,可以用来承载网页的容器,会自动铺满整个页面。(官方文档)</p>
<p>从上面这句话的介绍可以看出:</p>
<p>  1、用来承载网页</p>
<p>  2、会自动铺满</p>
<p>基于这两个特点,要实现的话基本思路是:</p>
<p>  a、新建一个 html 页面,在这里使用 xgplayer</p>
<p>  b、新建一个vue或者nvue页面,用 web-view 加载这个 html 页面</p>
<p>按照这个思路主要代码如下:</p>
<p>xgplayer.html</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">charset</span><span style="color: rgba(0, 0, 255, 1)">="utf-8"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">=viewport </span><span style="color: rgba(255, 0, 0, 1)">content</span><span style="color: rgba(0, 0, 255, 1)">="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,minimal-ui"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="referrer"</span><span style="color: rgba(255, 0, 0, 1)"> content</span><span style="color: rgba(0, 0, 255, 1)">="no-referrer"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)"> &lt;script src="js/uni.webview.1.5.2.js" charset="utf-8"&gt;&lt;/script&gt;</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">style </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text/css"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(128, 0, 0, 1)">
      html, body </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">{</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">width</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">100%</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">height</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">100%</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">margin</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">auto</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">overflow</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> hidden</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">background-color</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> #000000</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">-webkit-user-select</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> none</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)"> user-select</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> none</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)"> uni 的 SDK,必须引用。 </span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text/javascript"</span><span style="color: rgba(255, 0, 0, 1)"> src</span><span style="color: rgba(0, 0, 255, 1)">="//js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.0.1.52.js"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="mse"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="//unpkg.byted-static.com/xgplayer@2.31.2/browser/index.js"</span><span style="color: rgba(255, 0, 0, 1)"> charset</span><span style="color: rgba(0, 0, 255, 1)">="utf-8"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 0, 1)">
            let url = getQueryVariable('src');

            let player = new Player({
               "id": "mse",
               "url": url,
               "playsinline": true,
               "width":"100%",
               "height":"181px",
               "autoplay": false,
               "whitelist": [''],
               // "danmu": {
               //   "comments": [
               //   {
               //       "duration": 15000,
               //       "id": '1',
               //       "start": 3000,
               //       "txt": '长弹幕长弹幕长弹幕长弹幕长弹幕',
               //       "style": {//弹幕自定义样式
               //         "color": '#ff9500',
               //         "fontSize": '17px',
               //         // "border": 'solid 1px #ff9500',
               //         "borderRadius": '50px',
               //         "padding": '5px 11px',
               //         "backgroundColor": 'rgba(255, 255, 255, 0.1)'
               //       }
               //   }
               //   ],
               //   "area": {
               //   "start": 0,
               //   "end": 1
               //   }
               // },
             });

             //获取url参数
             function getQueryVariable(variable)
             {
                var reg = new RegExp('(^|&amp;)' + variable + '=([^&amp;]*)(&amp;|$)', 'i');
                var r = window.location.search.substr(1).match(reg);
                if (r != null) {
                   return unescape(r);
                }
                return null;
             }

      </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>xgplayer.vue</p>
<p>web-view 有两种方式,直接 web-view 组件或者 plus.webview.create,这里使用 plus.webview.create(对于使用 webview 组件,可以自行查找)</p>
<div class="cnblogs_code">
<pre>&lt;template&gt;
&lt;/template&gt;

&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">
   export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
         props:{
             src:{
               type:String,
               </span><span style="color: rgba(0, 0, 255, 1)">default</span>:''<span style="color: rgba(0, 0, 0, 1)">
             }
         },
            data()
            {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">{
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">视频地址</span>
                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> src:'http://vd2.bdstatic.com/mda-jmawcmkjagd8je0u/mda-jmawcmkjagd8je0u.mp4'   </span>
<span style="color: rgba(0, 0, 0, 1)">                }
            },
            onBackPress()
            {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">退出页销毁播放器</span>
<span style="color: rgba(0, 0, 0, 1)">                uni.$xgplayer.close()
            },
   
            mounted()
            {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.xgplayer()
            },
   
            methods: {
               xgplayer()   
               {
                     let styles </span>=<span style="color: rgba(0, 0, 0, 1)"> {
                        top: </span>'0px'<span style="color: rgba(0, 0, 0, 1)">,
                        bottom: </span>'540px'<span style="color: rgba(0, 0, 0, 1)">,
                        height: </span>'256px'<span style="color: rgba(0, 0, 0, 1)">,      
                        width: </span>'100%'<span style="color: rgba(0, 0, 0, 1)">,      
                        zindex:</span>0<span style="color: rgba(0, 0, 0, 1)">,
                        position: </span>'static'<span style="color: rgba(0, 0, 0, 1)">,
                        titleNView: {
                            autoBackButton: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
                            backgroundColor: </span>'#202028'<span style="color: rgba(0, 0, 0, 1)">,
                            titleColor: </span>'#ffffff'<span style="color: rgba(0, 0, 0, 1)">
                        } ,
                        </span>"statusbar"<span style="color: rgba(0, 0, 0, 1)">: {   
                            </span>"immersed": <span style="color: rgba(0, 0, 255, 1)">true</span> ,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">开启沉浸式状态栏    </span>
                            "background": '#202028'<span style="color: rgba(0, 0, 0, 1)">
                        },
   
                        </span>"hardwareAccelerated" : <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">开启硬件加速</span>
                        "allowsInlineMediaPlayback": <span style="color: rgba(0, 0, 255, 1)">true</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ios关闭原生控件</span>
<span style="color: rgba(0, 0, 0, 1)">   
                     };
                     const url </span>= `/hybrid/html/xgplayer.html?src=${this.src}`
                     <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> uni.$xgplayer = plus.webview.create('','xgplayer', styles, {}); //挂载到uni全局</span>
                     uni.$xgplayer = plus.webview.create(url,'xgplayer'); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">挂载到uni全局</span>
<span style="color: rgba(0, 0, 0, 1)">                     uni.$xgplayer.setStyle({
                        </span>'videoFullscreen':'landscape-primary',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">视频全屏时支持横屏 IOS 端无效</span>
<span style="color: rgba(0, 0, 0, 1)">                     });
   
                     </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> uni.$xgplayer.loadURL("/hybrid/html/xgplayer.html?src="+this.src)</span>
<span style="color: rgba(0, 0, 0, 1)">   
                     uni.$xgplayer.show();
               }
   
            },
      }
</span>&lt;/script&gt;

&lt;style&gt;
&lt;/style&gt;</pre>
</div>
<p>这样在 app 下就可以使用 xgplayer 播放视频了。</p>
<p>但是…… webview 是全屏的,如果你是在单独一个页面进行展示完全没有问题。</p>
<p>我的需求是在一个页面中嵌入视频播放,这就导致 webview 样式问题无法满足需求。</p>
<h1 id="_label2">二、renderjs</h1>
<p>上面一种方法行不通,那就使用新的方法——renderjs</p>
<p>renderjs 是一个运行在视图层的js。它比WXS更强大。它只支持app-vue和h5。(官方文档)</p>
<p>renderjs 的主要作用:</p>
<p>  a、大幅降低逻辑层和视图层的通讯损耗,提供高性能的视图交互能力</p>
<p>  b、在视图层操作dom,运行for web的js库</p>
<p>正好第二个作用是我的需求。最终结果也实现了。</p>
<p>基本使用是:</p>
<p>  1、创建一个 script 片段,设置 lang 为 renderjs,module 根据自己需求设置</p>
<p>  2、在视图层使用可以直接调用 renderjs 的操作</p>
<p>要注意的点:</p>
<p>  a、H5下,renderjs 可以访问逻辑层的数据,app 下不能访问</p>
<p>  b、逻辑层不能显示调用 renderjs 里面的函数,需要通过视图层间接调用,renderjs 可以通过&nbsp;ownerInstance 调用 逻辑层函数</p>
<p>基于以上的点,具体代码实现如下:</p>
<div class="cnblogs_code">
<pre>&lt;template&gt;<br>   // 视图层,通过监听绑定的值改变,调用 renderjs 的函数进行通信
    &lt;view class="media-box" :start="startPlayValue" :change:start="xgplayer.startPlay" &gt;
      &lt;view id="detail-video" :detail="detail" :change:detail="xgplayer.initJs"&gt;&lt;/view&gt;
    &lt;/view&gt;
&lt;/template&gt;

&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">
    export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
      data() {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
                detail:{},
                startPlayValue:</span>1<span style="color: rgba(0, 0, 0, 1)">
            }
      },
      onShow() {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getDetail()
      },
      methods: {
            getDetail(){
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 改变 detail,触发 xgPlayer.initJs(触发startPlay同理,改变 startPlayValue即可)</span>
<span style="color: rgba(0, 0, 0, 1)">            },
            onPlay(){
                console.log(</span>'开始播放'<span style="color: rgba(0, 0, 0, 1)">)
            }
      }
    }
</span>&lt;/script&gt;
&lt;script module="xgplayer" lang="renderjs"&gt;<span style="color: rgba(0, 0, 0, 1)">
    let xgPlayer
    export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">{
      mounted(){
      },
      methods:{
            initJs(newDetail,old,ownerInstance,instance){
                </span><span style="color: rgba(0, 0, 255, 1)">if</span>(newDetail &amp;&amp; newDetail.type === 1<span style="color: rgba(0, 0, 0, 1)">){
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">typeof</span> window.Player === 'function'<span style="color: rgba(0, 0, 0, 1)">) {
                        </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.initPlayer(newDetail,ownerInstance)
                  } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 动态引入较大类库避免影响页面展示</span>
                        const script = document.createElement('script'<span style="color: rgba(0, 0, 0, 1)">)
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> view 层的页面运行在根目录</span>
                        script.src = 'static/js/xgplayer.js'<span style="color: rgba(0, 0, 0, 1)">
                        script.onload </span>= <span style="color: rgba(0, 0, 255, 1)">this</span>.initPlayer.bind(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">,newDetail,ownerInstance)
                        document.head.appendChild(script)
                  }
                }
            },
            
            initPlayer(detail,ownerInstance){
                xgPlayer </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Player({
                  id: </span>'detail-video'<span style="color: rgba(0, 0, 0, 1)">,
                  url: detail.avUrl,
                  poster: detail.postUrl,
                  fluid: </span><span style="color: rgba(0, 0, 255, 1)">true</span>,    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 自适应父级容器</span>
                  playbackRate: <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">传入倍速可选数组</span>
<span style="color: rgba(0, 0, 0, 1)">                });
               
                                 </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 第一次播放,调用逻辑层 onPlay</span>
                xgPlayer.once('play',()=&gt;<span style="color: rgba(0, 0, 0, 1)">{
                  xgPlayer.pause()
                  console.log(</span>'首次播放'<span style="color: rgba(0, 0, 0, 1)">)
                  ownerInstance.callMethod(</span>'onPlay'<span style="color: rgba(0, 0, 0, 1)">)
                })
            },

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 逻辑层通过改变 startPlayValue 来触发 renderjs 函数</span>
<span style="color: rgba(0, 0, 0, 1)">            startPlay(){
                xgPlayer.play()
            }
      }
    }
</span>&lt;/script&gt;    </pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/zhurong/p/16380822.html
頁: [1]
查看完整版本: uni-app App 下集成 xgplayer