2015-06-02 10 views
6

Sto creando un controller personalizzato per video MP4 su una pagina web. Il controller include un cursore del volume. Alcuni dei video che devono essere riprodotti non hanno traccia audio. Sarebbe bene disabilitare il cursore del volume per questi video, in modo che l'utente non sia confuso quando la modifica della posizione del cursore del volume non ha alcun effetto.Usa javascript per rilevare se un video MP4 ha una colonna sonora

Esiste una proprietà o un trucco per verificare se un file MP4 ha una traccia audio? (jQuery è un'opzione).

Edit: utilizzando @ suggerimento di dandavis, ora ho questa soluzione per Chrome (e .ogg su 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 
} 

Il valore video.webkitAudioDecodedByteCount è inizialmente 0. Nel mio test, potrebbero essere necessari fino a 256 ms per essere popolato con un valore diverso da zero, quindi ho incluso un timeout per continuare a controllare (per un po ').

+0

Dipende, una soluzione che utilizza l'API Web Audio funziona, che è supportata solo nei browser più recenti e, per quanto ne so, non funziona affatto in IE. – adeneo

+0

Nei browser che lo supportano (non IE), è possibile utilizzare il video come fonte per [API audio Web] (https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) e controlla l'audio con un 'OfflineAudioContext'. Tuttavia, non conosco abbastanza i dettagli dell'API per creare una soluzione. – apsillers

+0

[Web Audio API] (https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) suona come una soluzione per molti utenti, sì. –

risposta

0

Potrebbe esserci un modo migliore per farlo, anche se è abbastanza semplice usare solo i normali javascript per i browser abilitati webkit o mozilla. webkit utilizza this.audioTracks e mozilla utilizza this.mozHasAudio rispettivamente:

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>

C'è anche una funzione di this.webkitAudioDecodedByteCount, però, non ho mai avuto alcuna fortuna farlo funzionare.

+0

Quando si utilizza questo codice, ottengo solo" Non riesco a leggere la proprietà 'lunghezza' di undefined ". – Jaketr00

+0

@ Jaketr00: Ho appena provato il codice e sembra funzionare correttamente (audio rilevato): https://jsfiddle.net/ac93zje5/ ... Potrebbe essere utile sapere con quale browser si sta provando. –

+0

Sto eseguendo Chrome v50.0.2661.94 su Mac OS X 10.11 e anche con jsfiddle ho ancora lo stesso errore. – Jaketr00

Problemi correlati