【问题标题】:Why does mediaelement.js not play .m4a files when using Flash fallback?为什么使用 Flash 回退时 mediaelement.js 不播放 .m4a 文件?
【发布时间】:2024-05-17 17:40:01
【问题描述】:

在原生不支持 AAC 编解码器的浏览器上播放扩展名为 .m4a 的文件时,我遇到了 mediaelement.js 的问题。

播放器 chrome 加载,第一分钟左右的音频被缓冲,但文件从不播放。

发生了什么事?

【问题讨论】:

    标签: flash mediaelement.js aac


    【解决方案1】:

    这是带有 mediaelement.js 的 known issue。这与使用 NetStream 类而不是 Sound 类播放的 Flash 插件 requiring AAC 文件有关。

    但是有一种解决方法:您可以告诉媒体元素将文件视为视频,然后一切正常。初始化播放器时设置pluginVars: 'isvideo=true'。例如

    $('#player').mediaelementplayer({
                pluginVars: 'isvideo=true',
            });
    

    您可能还需要告诉 mediaelement Flash 插件能够处理 mime 类型的音频/mp4(由于某种原因,它目前仅处理音频/m4a)。在 mediaelement-and-player.js 中找到 mejs.plugins.flash 并添加“audio/m4a”。

    请注意,这将使本机处理 AAC 文件的浏览器完全不受影响;只有在需要 Flash 后备时才会发挥作用。

    另一个注意事项:我最近发现,如果不加选择地应用此解决方法,MP3 文件可能无法播放。因此,您需要检测文件何时为 MP4/M4A,然后才应用它。

    【讨论】:

    • 我尝试添加 pluginVars = 'isvideo=true',强制进入 shim 模式并在 flash 可以处理的类型列表中添加音频/mp4(音频/m4a 已经存在)。但是 m4a 文件仍然可以工作。我应该使用
    【解决方案2】:

    为了扩展@samuel-jack 的答案,以下是我如何解决 Firefox 无法使用 mediaelement.js 在 .m4a 包装器中播放 AAC 音频的问题,这种方式也允许播放 mp3。

    1. 编辑 mediaelement-and-player.jsmediaelement-and-player.min.js 并将 "audio/m4a" 添加到 mejs.plugins.flash.types 数组中。
    2. 确保使用正确的 mime 类型提供 .mp4 文件;将此添加到您的 apache 配置中:

      AddType audio/mp4 m4a
      
    3. 使用类似于以下内容的 HTML。我使用的$mime_type 变量包含用于AAC mp4 音频文件的audio/mp4,以及用于普通mp3 文件的audio/mpeg

      <audio controls preload="metadata">
          <source src="file.m4a" type="<?php echo $mime_type; ?>">
          <object width="100%" height="30" type="application/x-shockwave-flash" data="flashmediaelement.swf">
              <param name="movie" value="flashmediaelement.swf" />
              <param name="flashvars" value="controls=true&amp;file=file.m4a" />
          </object>
      </audio>
      
    4. 加载 mediaelement 脚本,然后在每个文件的基础上运行它。当音频源类型属性包含audio/mp4时,我们需要选择性地包含isvideo=true hack。

      $('audio,video').each(function(i) {
          // Need to add the 'isvideo' hack for 'audio/mp4' media types.
          var plugin_vars = ($(this).children('source').attr('type').search('audio/mp4') > -1) ? 'isvideo=true' : '';
          $(this).mediaelementplayer({
              audioWidth: '100%',
              videoWidth: '100%',
              startVolume: 1.0,
              pluginVars: plugin_vars
          });
      });
      

    这适用于 Firefox 25 和 31、Chrome 36 和 OS X 上的 Safari 7 以及 Windows 7 上的 Firefox 31 中的 .m4a 和 .mp3 文件。

    【讨论】: