Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript检测MP4视频是否有音轨_Javascript_Video - Fatal编程技术网

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

使用javascript检测MP4视频是否有音轨,javascript,video,Javascript,Video,我正在为网页上的MP4视频创建自定义控制器。控制器包括音量滑块。一些要播放的视频没有音轨。最好禁用这些视频的音量滑块,这样用户在更改音量滑块的位置无效时不会感到困惑 是否有一个属性或技巧来检查MP4文件是否有音轨?(jQuery是一个选项) 编辑:根据@dandavis的建议,我现在有了Chrome(和Opera上的.ogg)的解决方案: var video=document.getElementById(“视频”) var volume=document.getElementById(“卷滑块

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

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

编辑:根据@dandavis的建议,我现在有了Chrome(和Opera上的.ogg)的解决方案:

var video=document.getElementById(“视频”)
var volume=document.getElementById(“卷滑块”)
函数初始化Evolume(){
var enableVolume=true
var延迟=1
if(video.webkitAudioDecodedByteCount!==未定义){
//在Chrome上,我们可以检查是否有音频。禁用音量
//控件,并在非零值出现时立即重新启用它
//对于webkitAudioDecodedByteCount,检测到。
enableVolume=false
startTimeout()
函数startTimeout(){
if(!!video.webkitAudioDecodedByteCount){
enableVolume=true
toggleVolumeEnabled(启用卷)
}否则{
//继续尝试2秒钟
如果(延迟<2048){
设置超时(开始超时、延迟)
延迟=延迟*2
}
}
}
}
toggleVolumeEnabled(启用卷)
}
功能切换VolumeEnabled(启用卷){
volume.disabled=!enableVolume
}

video.webkitAudioDecodedByteCount值最初为0。在我的测试中,可能需要256ms才能填充非零值,因此我已经包含了一个超时来继续检查(一段时间)。

可能有更好的方法来执行此操作,尽管对于启用
webkit
mozilla
的浏览器使用常规
javascript
相当简单
webkit
使用
this。audioTracks
mozilla
分别使用
this.MozasAudio

document.getElementById(“视频”).addEventListener(“loadeddata”,函数(){
if('document.documentElement.style中的“WebkitAppearance”)
var hasAudioTrack=this.audioTracks.length;
else if(this.mozHasAudio)
var hasAudioTrack=1;
如果(hasAudioTrack>0)
警报(“检测到音轨”);
其他的
警报(“未检测到音轨”);
});


这取决于使用Web Audio API的解决方案是否可行,据我所知,Web Audio API仅在较新的浏览器中受支持,在IE中完全不受支持。在支持它的浏览器(不是IE)中,您可以将视频用作音频源,并使用
OfflineAudioContext检查声音。不过,我对API的细节了解不够,无法制定解决方案。对许多用户来说,这似乎是一个解决方案,是的。
!!video.webkitAudioDecodedByteCount
对于一个浏览器…使用此代码时,我只得到“无法读取未定义的属性'length'”@Jaketr00:我刚刚尝试了此代码,它似乎工作正常(检测到音频):。。。了解您使用的浏览器可能会有所帮助。我正在Mac OSX 10.11上运行Chrome v50.0.2661.94,即使使用您的JSFIDLE,我仍然会遇到相同的错误。@Jaketr00:我使用Firefox进行了尝试,因此可能与Chrome不兼容;谢谢你的提醒。
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
}