2017-07-11 1 views
1

Si nous voulions faire une HTTP/1.0 ou HTTP/1.1 demande, par exemple octets 2-100000 ou seconde 20 à 35 secondes d'une ressource média donné par exemple, .webm ou .ogg audio ou .mp4 vidéo, où la réponse serait un fragment de média discret capable de lire sans autres parties de la ressource multimédia, comment pourrions-nous y parvenir?Comment faire une requête de plage pour une partie d'un fragment de média?

Par exemple

let headers = new Headers(); 
let range = 1024 * 1024; 
headers.append("Range", "bytes=0-" + range); 
let request = new Request(url, {headers:headers}); 
fetch(request) 
.then(response => response.blob()) 
.then(data => audio.src = URL.createObjectURL(data)); 

charges et les médias joue

let headers = new Headers(); 
let range = 1024 * 1024; 
headers.append("Range", "bytes=" + range + "-" + range * 2); 
let request = new Request(url, {headers:headers}); 
fetch(request) 
.then(response => response.blob()) 
.then(data => audio.src = URL.createObjectURL(data)); 

journaux succès statuts de réponse 200 et 206, mais ne rend pas la lecture multimédia à l'élément <audio>. Comment créer une requête de plage pour un média donné, qui retourne uniquement la plage demandée de la ressource en tant que ressource discrète capable de lire sans autres parties du média, où le fragment de média demandé peut être une partie discrète du média Ressource?

+0

@charlietfl Oui http://plnkr.co/edit/h1MOoIPwgEf0WiHMdm6z ? p = aperçu – guest271314

+0

juste pensé que ce que la 206 serait probablement dire qu'il fallait revenir cet en-tête – charlietfl

+0

@charlietfl Composé d'un workaroun d, qui a des problèmes. Intéressé pour voir comment les autres développeurs abordent le cas. – guest271314

Répondre

1

Vous pouvez tout simplement pas.

Vous devez absolument les en-têtes de fichier multimédia (métadonnées) pour votre navigateur pour pouvoir décoder les données qu'il contient.

Différents formats de médias auront des règles d'analyse différentes, avec des morceaux de données différemment et obtenir ordonné qu'une partie des données brutes briser toute la structure des données. Ainsi, avec certains formats de fichiers, vous pourriez être en mesure de lire le début d'un média en ne fournissant que le début du fichier, mais tous les formats de médias ne le permettent pas et ne s'attendent même pas à une lecture de début à la fin.

Que peut-on faire si est d'utiliser le timerange parameter de src du MediaElement:

#t=[starttime][,endtime]

const url = 'https://upload.wikimedia.org/wikipedia/commons/4/4b/011229beowulf_grendel.ogg'; 
 

 
btn.onclick = e => { 
 
    // fast input check for the demo 
 
    if (max.value > aud.duration) 
 
    max.value = aud.duration; 
 
    if (min.value > max.value) 
 
    min.value = max.value - 1; 
 
    // construct our timerange parameter 
 
    let range = '#t=' + min.value + ',' + max.value; 
 
    // append it to our original url 
 
    aud.src = url + range; 
 
} 
 
btn.onclick();
<audio id="aud" aud controls></audio><br> 
 
<label>start: <input id="min" type="number" value="10" min="0" max="119"></label> 
 
<label>end: <input id="max" type="number" value="20" min="1" max="120"></label> 
 
<button id="btn">re-load</button>

+0

étiquette de fin doit être « fin »? Oui, familier avec les URI Media Fragment. Est-il possible de créer un enregistrement de chaque tranche de fragment de média qui peut être joué individuellement et de fusionner les fragments en un seul fichier qui peut être joué de façon transparente? Comment pouvons-nous extraire, et éventuellement créer ou réutiliser les en-têtes de médias pour chaque type de média? Pourquoi est-il possible de jouer une plage commençant à "0", mais pas une plage qui ne commence pas par "0"? – guest271314

+0

@ guest271314, oui vous pouvez évidemment créer un nouvel élément MediaElement de chaque tranche avec cette méthode, puis utiliser sa méthode 'captureStream' avec MediaRecorders pour exporter ces fragments. Si vous voulez les concaténer, vous devez contrôler un seul flux dans lequel vous mettez à jour le currentTime de la source d'origine, car vous ne pouvez pas enregistrer plus rapidement que * x1 *. – Kaiido

+0

Pour le * pourquoi cela ne fonctionne pas avec les demandes de plage de démarrage autres que 0 *, c'est uniquement parce que vous avez eu de la chance toutes les métadonnées requises pour ** votre fichier ** ont été incluses dans cette plage. Si cela avait été à la fin du fichier, vous n'auriez pas pu jouer quoi que ce soit. – Kaiido