2017-08-24 2 views
0

J'ai deux vidéos que j'essaie de lire en utilisant MediaSource, mais une seule fonctionne. Les deux ont les codecs définis comme avc1.4d401f et mp4a.40.2, mais tandis que l'un d'eux joue très bien, l'autre ferme le MediaSource dès que j'appelle le appendBuffer sur le SourceBuffer. Les bits correspondants du code sont les suivants:MediaSource fermé après appendBuffer

var mainSource; 
var mimeCoded = 'video/mp4; codecs="avc1.4d401f,mp4a.40.2"'; 

    mainSource = new MediaSource(); 
    var sourceBuffer; 

    mainSource.addEventListener('sourceopen',() => { 
     console.log('readystate', mainSource.readyState); 
     var xhr = new XMLHttpRequest(); 
     xhr.responseType = 'arraybuffer'; 
     xhr.open('get', 'main.mp4'); 
     xhr.addEventListener('load', (e) => { 
      sourceBuffer = mainSource.addSourceBuffer(mimeCoded); 
      sourceBuffer.mode = 'sequence'; 
      sourceBuffer.addEventListener('updateend', onUpdateEnd); 
      sourceBuffer.appendBuffer(e.target.response); 
      console.log('updating', sourceBuffer.updating); 
     }); 
     xhr.send(); 

    }); 

    vid.src = URL.createObjectURL(mainSource); 

    onUpdateEnd = function() 
    { 
     console.log('readystate2', mainSource.readyState, sourceBuffer.updating); 
     vid.play(); 
     sourceBuffer.removeEventListener('updateend', onUpdateEnd); 
    }; 

Lorsque vous utilisez l'une des vidéos, les deux journaux sur mainSource.readyState volonté sortie open, mais avec un autre, il montre closed sur le second journal (et par conséquent des erreurs sur vid.play()) . Je suis déjà à court d'idées sur ce qui se passe, donc toute aide est appréciée.

Répondre

0

En réponse à d'autres références, pour que cela fonctionne, la vidéo doit être fragmentée lors du codage. L'utilisation de la commande ffmpeg suivante a fait l'affaire:

ffmpeg -i input.mp4 -movflags frag_keyframe+empty_moov+default_base_moof output_frag.mp4