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