【问题标题】:Optimizing multiple video player objects in page via using JS to display video thumbnails+play buttons instead通过使用JS显示视频缩略图+播放按钮来优化页面中的多个视频播放器对象
【发布时间】:2016-08-27 07:35:03
【问题描述】:

背景: 我正在为我的 Django Web 应用程序开发视频点播功能。我的大多数用户都是在 Android 设备上使用网络的用户(以防万一)。目前,我正在使用 azure 媒体播放器来显示我的视频(通过自适应比特率流)。视频以排序列表的形式提供 - 每页最多显示 10 个视频。模板代码很简单:

{% for vid in object_list %}
<video id="vid{{ forloop.counter }}" class="azuremediaplayer amp-default-skin amp-big-play-centered" controls width="640" height="400" poster="{{ vid.low_res_thumb }}" data-setup='{"logo": { "enabled": false },"language":"ur","nativeControlsForTouch": false}'>
<source src="{{ vid.video_manifest }}" type="application/vnd.ms-sstr+xml" />
</video>
{% endfor %}

像这样直接渲染视频播放器很重。更好的方法是显示视频缩略图,并在其上放置一个播放图标(使其看起来像一个视频播放器),如下所示:

    <div style="width:640px; height:400px;background-image:url({{ vid.low_res_thumb }});background-repeat: no-repeat;background-size: auto 100%;background-position: center;text-align:center;overflow:hidden;">
        <img src="{{ STATIC_URL }}img/play_btn.png" style="display:inline-block;margin-top:20%;">
    </div>

在这种方法中,一旦点击播放按钮,视频缩略图就会被替换为带有autoplay 的 azure 媒体播放器,以便视频立即播放。

问题: 我需要编写一个 JS 函数来扫描页面中的视频,添加相应的缩略图+play_btns 和一个 onclick 事件侦听器,在自动播放模式下将图像替换为实际的 azure 媒体播放器。作为一个 JS 初学者,我正在努力做到这一点并且需要帮助。

会不会是这样的:

<script>
(function() {
    var v = document.getElementsById("vid{{ forloop.counter }}");
    for (var n = 0; n < v.length; n++) {
        var p = document.createElement("div");
        p.innerHTML = showThumb(v[n].dataset.id);
        p.onclick = ???
        v[n].appendChild(p);
    }
})();

function showThumb(id) {
    return '<div style="width:640px; height:400px;background-image:url({{ vid.low_res_thumb }});background-repeat: no-repeat;background-size: auto 100%;background-position: center;text-align:center;overflow:hidden;">
        <img src="{{ STATIC_URL }}img/play_btn.png" style="display:inline-block;margin-top:20%;">
    </div>';
}
</script>

需要帮助来改进这一点。具体来说:(i)我是否正确引用了getElementsById,(ii)我是否正确地制定了p.innerHTML,以及(iii)我如何处理p.onclick?提前致谢!

【问题讨论】:

    标签: javascript django azure-media-services


    【解决方案1】:

    以下是与任何特定框架无关的示例,但我在问题中使用了您的符号。

    请注意,我将 dom 元素本身和清单 uri 传递给 javascript 函数。 javascript 函数通过更改 innerHtml 并将 id 属性从索引变量分配给视频标签来初始化 amp 播放器。当您单击和播放视频元素时,此变量会增加。您可以修改此逻辑以具有一些其他逻辑。

    单击带有图像的 div 标记后,我将删除 onclick 处理程序,以允许玩家拦截单击事件。

    {% for vid in object_list %}
    <div onclick="myFunction(this, {{ vid.video_manifest }})" >
         <img src="{{ STATIC_URL }}" witdh="640" height="400">
    </div>
    {% endfor %}
    
    <script>
    var index = 0;
    
    function myFunction(element, manifestUri){
    index++;
    element.innerHTML ="<video id=\"azuremediaplayer" + index + "\" class=\"azuremediaplayer amp-default-skin amp-big-play-centered\" tabindex=\"0\"> </video>";
    var myOptions = {
                autoplay: true,
                controls: true,
                width: "640",
                height: "400",
                poster: ""
            };
            var myPlayer = amp("azuremediaplayer"+index, myOptions);
            myPlayer.src([{ src: manifestUri , type: "application/vnd.ms-sstr+xml" }, ]);
             element.removeAttribute("onclick");
    }        
        </script>
    

    请注意,移动设备不支持自动播放 - 请参阅 https://amp.azure.net/libs/amp/latest/docs/known_issues.htm。 上面的脚本将作为桌面客户端的优化。 您可以检测移动用户并在循环中为每个元素完整呈现视频 html 标签,并为每个视频 dom 元素初始化 azure 媒体播放器,如下所示:

    <script>
    
    function myFunction(id, manifestUri){
    
    var myOptions = {
                autoplay: true,
                controls: true,
                width: "640",
                height: "400",
                poster: ""
            };
            var myPlayer = amp("azuremediaplayer"+id, myOptions);
            myPlayer.src([{ src: manifestUri , type: "application/vnd.ms-sstr+xml" }, ]);
    
    
    }        
        </script>
    
    {% for vid in object_list %}
    
    <script>myfunction('{{ vid.video_id }}','{{ vid.video_manifest }}');</script>
    
    {% endfor %}
    

    【讨论】:

    • 你可以在这里找到静态 html 的例子jsfiddle.net/gtrifonov/g1q9ojxo/3
    • 在桌面上,如果您在 jsfiddler 中尝试过解决方案,用户只需单击一次,当自动播放选项设置为 true(在 chrome、edge、ie11 中测试)。正如您提到的移动用户,您可以检测它是否是移动用户并且基本上跳过优化。在您的 for 循环中,为每个视频正确渲染视频 html 标记和 Azure 媒体播放器的 js 初始化。如果您有某种分页并一次生成 10-30 个项目,它应该不会对性能产生太大影响。
    • 供参考:amp.azure.net/libs/amp/latest/docs/known_issues.html描述的手机自动播放限制
    • 我的大部分用户都使用移动设备,并且使用慢速网络 - 即不完整的 3G 和大部分阻塞的带宽。现在需要从 Internet 加载 azure 媒体播放器,所以我想如果我只是调用每个浏览器的本机 html5 视频播放器并使用 progressive download 编码,那将是一种更快的体验从 AMS 提供的视频(而不是自适应)。然后,我写的 JS 将只是为那些无法流式传输 .mp4 文件的女士们和先生们提供下载按钮。
    • 这也可以。您还可以形成适当的 HLS 清单链接,以在支持 HLS 的设备上播放渐进式播放。请参阅github.com/Azure/azure-sdk-for-media-services-extensions/blob/… 如何为适当的 hls 版本形成链接。 IOS会原生播放渐进式编码视频。
    猜你喜欢
    • 2012-03-17
    • 2015-10-04
    • 1970-01-01
    • 2021-09-14
    • 2011-08-26
    • 2017-07-19
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多