[英]HTML5 video, how to detect when there is no audio track?
我正在制作一個 chrome 應用程序,我想對視頻播放進行自定義控制,但我在使用靜音按鈕時遇到了一些困難。 大多數將在應用程序中播放的視頻都是靜音的,所以我希望能夠在沒有音軌時禁用按鈕,就像 chrome 使用默認控件一樣。
嘗試使用音量值,但即使沒有音軌,它也會返回“1”。 檢查視頻是否靜音也不起作用。
這是一個片段。
有什么建議么?
基於upuoth的答案的更短的功能並擴展到支持IE10+
function hasAudio (video) {
return video.mozHasAudio ||
Boolean(video.webkitAudioDecodedByteCount) ||
Boolean(video.audioTracks && video.audioTracks.length);
}
用法:
var video = document.querySelector('video');
if(hasAudio(video)) {
console.log("video has audio");
} else{
console.log("video doesn't have audio");
}
在某些時候,瀏覽器可能會開始實現audioTracks 屬性。 現在,你可以使用webkitAudioDecodedByteCount
的WebKit的,和mozHasAudio
為Firefox。
document.getElementById("video").addEventListener("loadeddata", function() {
if (typeof this.webkitAudioDecodedByteCount !== "undefined") {
// non-zero if video has audio track
if (this.webkitAudioDecodedByteCount > 0)
console.log("video has audio");
else
console.log("video doesn't have audio");
}
else if (typeof this.mozHasAudio !== "undefined") {
// true if video has audio track
if (this.mozHasAudio)
console.log("video has audio");
else
console.log("video doesn't have audio");
}
else
console.log("can't tell if video has audio");
});
出於某種原因, @fregante 的hasAudio
函數在某個時候停止在 Chrome 中工作 - 即使在等待“loadeddata”和“loadedmetadata”事件,甚至“canplaythrough”事件之后。 它可能與我使用的視頻格式(webm)有關。 無論如何,我通過短時間播放視頻來解決它:
// after waiting for the "canplaythrough" event:
hasAudio(video); // false
video.play();
await new Promise(r => setTimeout(r, 1000));
video.pause();
hasAudio(video); // true
有多種方法可以檢查視頻文件是否有音頻,其中一種方法是使用視頻的mozHasAudio
、 video.webkitAudioDecodedByteCount
和video.audioTracks?.length
屬性
const video = component.node.querySelector("video");
video.onloadeddata = function() {
if (video.mozHasAudio || Boolean(video.webkitAudioDecodedByteCount) || Boolean(video.audioTracks?.length)) {
console.log("This video has audio tracks.");
} else {
console.log("This video has no audio tracks.");
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.