使用javascript来检测MP4视频是否有音轨

Use javascript to detect if an MP4 video has a sound track

本文关键字:是否 音轨 视频 MP4 javascript 检测 使用      更新时间:2023-09-26

我正在为网页上的MP4视频创建一个自定义控制器。控制器包括一个音量滑块。有些要播放的视频没有音轨。最好禁用这些视频的音量滑块,这样用户就不会在改变音量滑块的位置没有效果时感到困惑。

是否有一个属性或一个技巧来检查一个MP4文件是否有音轨?(jQuery是一个选项)。

编辑:使用@dandavis的建议,我现在有这个解决方案Chrome(和。ogg在Opera):
var video = document.getElementById("video")
var volume = document.getElementById("volume-slider")
function initializeVolume() {
  var enableVolume = true
  var delay = 1
  if (video.webkitAudioDecodedByteCount !== undefined) {
    // On Chrome, we can check if there is audio. Disable the volume
    // control by default, and reenable it as soon as a non-zero value
    // for webkitAudioDecodedByteCount is detected.
    enableVolume = false
    startTimeout()
    function startTimeout () {
      if (!!video.webkitAudioDecodedByteCount) {
        enableVolume = true
        toggleVolumeEnabled(enableVolume)
      } else {
        // Keep trying for 2 seconds
        if (delay < 2048) {
          setTimeout(startTimeout, delay)
          delay = delay * 2
        }
      }
    }
  }
  toggleVolumeEnabled(enableVolume)
}

function toggleVolumeEnabled(enableVolume) {
  volume.disabled = !enableVolume
}

视频。webkitAudioDecodedByteCount初始值为0。在我的测试中,可能需要256ms来填充非零值,因此我包含了一个超时来保持检查(一段时间)。

可能有更好的方法来做到这一点,尽管对于启用webkitmozilla的浏览器使用常规javascript相当简单。webkit利用this.audioTracks, mozilla利用this.mozHasAudio:

document.getElementById("video").addEventListener("loadeddata", function() {
  if ('WebkitAppearance' in document.documentElement.style)
    var hasAudioTrack = this.audioTracks.length;
  else if (this.mozHasAudio)
    var hasAudioTrack = 1;
  if (hasAudioTrack > 0)
    alert("audio track detected");
  else
    alert("audio track not detected");
});
<video id="video" width="320" height="240" controls>
  <source src="http://media.w3.org/2010/05/video/movie_300.mp4" type="video/mp4">
</video>

还有一个函数this.webkitAudioDecodedByteCount,但是,我从来没有运气使它工作。

检查视频文件是否有音频有不同的方法,其中一种方法是使用视频的mozHasAudio, video.webkitAudioDecodedByteCountvideo.audioTracks?.length属性,干净简单…