【问题标题】:Embedding Windows Media Player for all browsers为所有浏览器嵌入 Windows Media Player
【发布时间】:2020-12-12 00:39:28
【问题描述】:

编辑:这个问题写于 2008 年,就像 3 年前的互联网时代。如果这个问题仍然与您的环境相关,请接受我的哀悼。其他所有人都应转换为supported by your browsers 格式(如果需要 Internet Explorer,那将是 H.264,如果不需要,则可能是 AV1、VP8/VP9)并使用<video> element


我们在内部网站上使用WMV 视频,并将它们嵌入到网站中。这在 Internet Explorer 上运行良好,但在 Firefox 上却不行。我找到了让它在 Firefox 中运行的方法,但是在 Internet Explorer 中它停止运行。

我们暂时还不想使用 Silverlight,尤其是因为我们无法确定所有客户端都将运行安装了 Windows Media Player 的 Windows XP。

是否有某种通用代码将 WMP 嵌入到 Internet Explorer 和 Firefox 中,或者我们是否需要实现一些用户代理检测并为不同的浏览器提供不同的 HTML?

【问题讨论】:

    标签: windows embed media


    【解决方案1】:

    以下内容适用于 Firefox 和 Internet Explorer:

    <object id="mediaplayer" classid="clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#version=5,1,52,701" standby="loading microsoft windows media player components..." type="application/x-oleobject" width="320" height="310">
    <param name="filename" value="./test.wmv">
         <param name="animationatstart" value="true">
         <param name="transparentatstart" value="true">
         <param name="autostart" value="true">
         <param name="showcontrols" value="true">
         <param name="ShowStatusBar" value="true">
         <param name="windowlessvideo" value="true">
         <embed src="./test.wmv" autostart="true" showcontrols="true" showstatusbar="1" bgcolor="white" width="320" height="310">
    </object>
    

    【讨论】:

    • 当我使用这种方法时,我无法通过 JavaScript 控制播放器。例如, mediaplayer.controls 未定义。是否有跨浏览器的方式也允许这样做?
    • 那是因为objectidembed 元素正在运行。你最好给这两个元素一个“唯一”类,同时选择两个元素,然后过滤掉一个活跃的元素。
    • 请注意,从 7.0 版开始,类 ID 已更改为 6BF52A52-394A-11d3-B153-00C04F79FAA6。参见例如here.
    • 我强烈推荐来自 Elizabeth Castro 的 link,因为代码更精简并且不需要 classid。还有,我下面那位居然先推荐了这篇文章。
    【解决方案2】:

    我可以推荐jQuery Media Plugin吗?为所有类型的视频提供嵌入代码,而不仅仅是 WMV 并进行浏览器检测,将所有混乱的 switch/case 语句排除在模板之外。

    【讨论】:

      【解决方案3】:

      使用以下内容。它适用于 Firefox 和 Internet Explorer。

              <object id="MediaPlayer1" width="690" height="500" classid="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95"
                  codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"
                  standby="Loading Microsoft® Windows® Media Player components..." type="application/x-oleobject"
                  >
                  <param name="FileName" value='<%= GetSource() %>' />
                  <param name="AutoStart" value="True" />
                  <param name="DefaultFrame" value="mainFrame" />
                  <param name="ShowStatusBar" value="0" />
                  <param name="ShowPositionControls" value="0" />
                  <param name="showcontrols" value="0" />
                  <param name="ShowAudioControls" value="0" />
                  <param name="ShowTracker" value="0" />
                  <param name="EnablePositionControls" value="0" />
      
      
                  <!-- BEGIN PLUG-IN HTML FOR FIREFOX-->
                  <embed  type="application/x-mplayer2" pluginspage="http://www.microsoft.com/Windows/MediaPlayer/"
                      src='<%= GetSource() %>' align="middle" width="600" height="500" defaultframe="rightFrame"
                       id="MediaPlayer2" />
      

      在 JavaScript 中,

          function playVideo() {
              try{
                      if(-1 != navigator.userAgent.indexOf("MSIE"))
                      {
                              var obj = document.getElementById("MediaPlayer1");
                                  obj.Play();
      
                      }
                      else
                      {
                                  var player = document.getElementById("MediaPlayer2");
                                  player.controls.play();
      
                      }
                   }  
              catch(error) {
                  alert(error)
              } 
      
      
              }
      

      【讨论】:

        【解决方案4】:

        伊丽莎白卡斯特罗有一篇关于这个问题的有趣文章:Bye Bye Embed。值得一读她如何解决这个问题,以及处理 QuickTime 内容。

        【讨论】:

          【解决方案5】:

          您可以使用条件 cmets 让 IE 和 Firefox 做不同的事情

          <![if !IE]>
          <p> Firefox only code</p>
          <![endif]>
          
          <!--[if IE]>
          <p>Internet Explorer only code</p>
          <![endif]-->
          

          浏览器本身会忽略不适合它们阅读的代码。

          【讨论】:

            【解决方案6】:

            在网络上部署视频的最佳方式是使用 Flash——它更容易干净地嵌入到网页中,并且可以在或多或少的任何浏览器和平台组合上播放。使用 Windows Media Player 的唯一原因是,如果您正在流式传输内容并且需要非常强大的数字版权管理,即使如此,供应商现在也开始使用 Flash 来处理这些内容。请参阅 BBC 的 iPlayer 以获得极好的示例。

            我建议您切换到 Flash,即使是内部使用。您永远不知道将来谁需要访问它,这将为您提供最佳的未来兼容性。

            编辑 - 2013 年 3 月 20 日。 有趣的是,这些老问题是如何不时出现的!今天的世界多么不同,这一切看起来多么过时。我今天无论如何都不推荐仅使用 Flash 的路线 - 这些天的最佳实践可能是使用 HTML 5 嵌入 H264 编码的视频,并使用 Flash 后备,如下所述:http://diveintohtml5.info/video.html

            【讨论】:

            • id 说这是一个幼稚的评论 iPlayer 很容易与其他产品兼容,主要是因为它们的“DRM”只是通过 GeoIP 确定某人在哪里的一个案例。 Flash 很幸运,它没有与它的三流编程语言竞争,而且运行时有缺陷 -1 太主观了,问题是如何在所有浏览器中嵌入 WMP……flash 与这有什么关系???跨度>
            • 这是一种替代方法 - 建议替代方法有什么幼稚之处?
            • 现在可能不再适用了,因为我们有了 HTML5。
            • 正如原始评论指出正在考虑使用 Silverlight,此评论作为来自单一来源的意见绝对有效。
            【解决方案7】:

            使用 ffmpeg 对 flash 视频进行编码实际上非常简单。您可以使用一个命令从几乎任何视频格式进行转换,ffmpeg 足够聪明,可以解决剩下的问题,并且它将使用您机器上的每个处理器。调用它很简单:

            ffmpeg -i input.avi output.flv
            

            ffmpeg 会猜测你想要的比特率,但如果你想指定一个,你可以使用 -b 选项,例如-b 500000 是 500kbps。当然有很多选择,但我通常不用太多修改就能得到很好的结果。如果您正在寻找更多选择,这是一个很好的起点:video options

            您不需要特殊的网络服务器来显示 Flash 视频。我只需将 .flv 文件推送到标准 Web 服务器,并使用良好的 swf 播放器(如 flowplayer)链接到它们,就可以做得很好。

            如果您可以确定所有用户将始终仅使用 [最新的、最新版本的] Windows,WMV 就很好,但即便如此,Flash 通常更适合网络。该播放器甚至非常可换肤,并且可以使用 javascript 进行控制。

            【讨论】:

              【解决方案8】:

              我在 MSDN 上找到了一篇关于 using the WMP with Firefox 的好文章。

              根据 MSDN 的文章,经过反复试验,我发现使用 JavaScript 比使用条件 cmets 或嵌套的“EMBED/OBJECT”标签要好。

              我做了一个 JS 函数,它根据给定的参数生成 WMP 对象:

              <script type="text/javascript">
                  function generateWindowsMediaPlayer(
                      holderId,   // String
                      height,     // Number
                      width,      // Number
                      videoUrl    // String
                      // you can declare more arguments for more flexibility
                      ) {
                      var holder = document.getElementById(holderId);
              
                      var player = '<object ';
                      player += 'height="' + height.toString() + '" ';
                      player += 'width="' + width.toString() + '" ';
              
                      videoUrl = encodeURI(videoUrl); // Encode for special characters
              
                      if (navigator.userAgent.indexOf("MSIE") < 0) {
                          // Chrome, Firefox, Opera, Safari
                          //player += 'type="application/x-ms-wmp" '; //Old Edition
                          player += 'type="video/x-ms-wmp" '; //New Edition, suggested by MNRSullivan (Read Comments)
                          player += 'data="' + videoUrl + '" >';
                      }
                      else {
                          // Internet Explorer
                          player += 'classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" >';
                          player += '<param name="url" value="' + videoUrl + '" />';
                      }
              
                      player += '<param name="autoStart" value="false" />';
                      player += '<param name="playCount" value="1" />';
                      player += '</object>';
              
                      holder.innerHTML = player;
                  }
              </script>
              

              然后我通过编写一些标记和内联 JS 来使用该功能:

              <div id='wmpHolder'></div>
              
              <script type="text/javascript">        
                  window.addEventListener('load', generateWindowsMediaPlayer('wmpHolder', 240, 320, 'http://mysite.com/path/video.ext'));
              </script>
              

              您可以使用 jQuery.ready 代替 window load event 来使代码更加向后兼容和跨浏览器。

              我在 Windows 7/8 上测试了 IE 9-10、Chrome 27、Firefox 21、Opera 12 和 Safari 5 上的代码。

              【讨论】:

              • 这行得通,但在 Firefox 中,整个视频在开始播放之前会被下载。显然,这会创建一个相当长的加载屏幕。有没有办法让这个视频流在 Firefox 中?
              • 不幸的是,我没有找到防止这个问题的方法。显然,这是 Firefox 上 WMP 对象的本质。出于这个原因,我使用窗口的加载事件,因为这是页面标记(资源)解释的最新点(时刻)。在加载页面后设置 data 属性,可能会减少加载时间(显然不是 100%!)。祝你好运。
              • 我找到了解决方案。将 firefox 播放器的类型更改为 video/x-ms-wmv。我还注意到 Firefox 和 chrome 无法播放标题中有空格的视频。我通过用 '%20' 替换 videoUrl 字符串中的所有空格来解决这个问题,然后它工作正常
              • 干得好!我更改了我的代码:Line 15: videoUrl = encodeURI(videoUrl);Line 19: //player += 'type="application/x-ms-wmp" '; Line 20: player += 'type="video/x-ms-wmp" ';
              【解决方案9】:

              我在 Elizabeth Castro 的网站上发现了一些在 FireFox 和 IE 中都有效的东西(感谢该网站上的链接)——我在这里尝试了所有其他版本,但无法让它们在两种浏览器中都有效

              <object classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" 
                id="player" width="320" height="260">
                <param name="url" 
                  value="http://www.sarahsnotecards.com/catalunyalive/fishstore.wmv" />
                <param name="src" 
                  value="http://www.sarahsnotecards.com/catalunyalive/fishstore.wmv" />
                <param name="showcontrols" value="true" />
                <param name="autostart" value="true" />
                <!--[if !IE]>-->
                <object type="video/x-ms-wmv" 
                  data="http://www.sarahsnotecards.com/catalunyalive/fishstore.wmv" 
                  width="320" height="260">
                  <param name="src" 
                    value="http://www.sarahsnotecards.com/catalunyalive/fishstore.wmv" />
                  <param name="autostart" value="true" />
                  <param name="controller" value="true" />
                </object>
                <!--<![endif]-->
              </object>
              

              查看她的网站:http://www.alistapart.com/articles/byebyeembed/ 以及初始对象标签中带有 classid 的版本

              【讨论】:

                【解决方案10】:

                2020 年 12 月:

                回答问题:

                我认为这个问题应该结束了。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-06-05
                  相关资源
                  最近更新 更多