8
votes

transmis au format vidéo getUserMedia / MediaRecorder plus grand que le format demandé. Comment dire?

Contexte:

Sous Windows 10, j'utilise getUserMedia (gUM) et MediaRecorder dans Google Chrome (v71) pour capturer et encoder un flux vidéo.

  • J'utilise le paramètre contraintes de gUM pour lui dire que je veux un format vidéo de 352x288.
  • Je demande video / webm; codecs = "avc1.42E01E" comme type MIME du flux encodé (c'est H.264 encadré dans Matroska ).

  • Je sélectionne une webcam effrontée intégrée à un ordinateur portable comme source vidéo. Il s'appelle "EasyCamera" fait par DMAX-AVC. Il est tentant de l'appeler CheezyCamera.

Le flux vidéo est généré très bien.

Problème:

Les dimensions de la vidéo encodée dans le flux sont de 440 x 360 plutôt que celles de 352 x 288 demandées. Ces informations sont intégrées dans le flux enregistré et ne sont visibles que par le consommateur de ces données. L'utilisation des différentes API révèle que les métadonnées de l'élément gUM stream, MediaRecorder et pensent que les dimensions sont celles que j'ai demandées.

Bien sûr, webcam, gUM et MediaRecorder traitent le paramètre de contraintes comme des suggestions et sont libres de répondre avec quelque chose de différent. Dans ce cas, ils répondent avec 440x360 lorsque je demande 352x288. Ce système fonctionne comme prévu; Ce n'est pas mon problème.

Pour clarifier, les dimensions inattendues de 440x360 ne sont visibles que par le consommateur du flux enregistré. J'espère trouver un moyen de savoir que la webcam côté producteur, la gUM et la chaîne de signaux MediaEncoder produisent une résolution différente de celle que j'ai demandée.

Comment le consommateur de flux connaît-il les dimensions du flux? Ils sont dans les boîtes Matroska «PixelWidth» et «PixelHeight», et ils sont intégrés au flux H.264. (Curieusement, étant donné qu'il s'agit d'une résolution choisie par logiciel, ce n'est pas un nombre entier de macroblocs 16x16. Cela fonctionne toujours bien sûr.)

Je ne peux pas analyser les données enregistrées dans le navigateur car elles sont stockées dans des blobs opaques.

Lorsque j'utilise une webcam différente, meilleure (une Logitech C615), mon flux vidéo encodé est de la taille que j'ai demandée.

Ma question:

Y a-t-il un moyen dans la chaîne de signaux webcam / gUM / MediaRecorder / de trouver les dimensions réelles du flux encodé dans le navigateur enregistrant réellement le flux ? Autrement dit, puis-je trouver la réponse de la chaîne de signaux à mes dimensions demandées sans décoder le flux généré?


4 commentaires

Il y a des contradictions dans vos paroles: quelque part vous dites le "Les dimensions de la vidéo encodée dans le flux sont de 440x360" , puis vous dites que tout le Stream, le MediaRecorder et l'élément vidéo (c'est-à-dire les consommateurs de flux) indiquent que c'est celui que vous avez demandé (352x288). Êtes-vous sûr de ne pas vouloir dire que seul le fichier enregistré a les mauvaises dimensions? Veuillez également préciser comment vous avez vérifié les dimensions de ces consommateurs. Et enfin, avez-vous essayé de reproduire à partir d'un autre flux multimédia ayant les mêmes dimensions? Par exemple, celui provenant d'une toile.


Pourriez-vous fournir un exemple de code, par exemple comment vous définissez la largeur et la hauteur de votre encodeur. Si je me souviens bien de mon dernier projet, l'exemple de getUserMedia () ne garantit pas que la taille de la vidéo sera exactement ce que vous demandez et dépend également de votre matériel.


Veuillez consulter mes modifications à ma question. Travailler sur la source ...


"Curieusement, cette résolution générée n'est pas un nombre entier de macroblocs 16x16" - c'est normal et pas un problème, elle est complétée au multiple le plus proche et le décodeur la recadre


3 Réponses :


1
votes

Utilisez MediaStream.getVideoTracks () code> pour obtenir la piste vidéo ( MediaStreamTrack a>), puis utilisez MediaStreamTrack.getSettings () pour obtenir l'objet MediaTrackSettings , qui contient la hauteur et la largeur de la vidéo du flux.

Donc, si je demande une vidéo de 0 hauteur spécifiée comme Contraintes, j'obtiens une vidéo de hauteur 1 pixels. Pendant le streaming, nous pouvons récupérer à la fois la hauteur que j'ai demandée et la hauteur que j'obtiens en sortie.

function handleMediaStream(mystream){
  let videoStreamTrack = mystream.getVideoTracks()[0];
  let constraints = videoStreamTrack.getConstraints();
  console.log(constraints.width, constraints.height);
  // outputs: 640 0
  let settings = videoStreamTrack.getSettings();
  console.log(settings.width, settings.height);
  // outputs: 640 1
}

let videoConstraints = { width: 640, height: 0 }
navigator.mediaDevices.getUserMedia({ video: videoConstraints })
.then(function create_media_recorder(mystream) {
  handleMediaStream(mystream);
});


2 commentaires

Malheureusement, le résultat de MediaStreamTrack getSettings (et les résultats de getCapabilities et getConstraints) montrent la largeur et la hauteur que j'ai demandées, pas la largeur et la hauteur réelles.


Êtes-vous sûr de la largeur et de la hauteur réelles? Comment obtenez-vous la hauteur et la largeur?



1
votes

Vous devrez peut-être utiliser le mot-clé de contrainte exact comme dans ce test

const sdPalConstraints = {
  video: {width: {exact: 352}, height: {exact: 288}}
};
// Assuming |video| exists and represents a <video> element.
navigator.mediaDevices.getUserMedia(sdPalConstraints)
                      .then(stream) => {video.srcObject = stream};

Cela ne garantit pas que la WebCam sera diffusée en continu dans cette résolution, mais si celle produite diffère de celle demandée, VideoTrackAdapter sera engagé pour l'adapter pour vous (et pour MediaRecorder).


1 commentaires

J'aimerais pouvoir dire que cela a aidé. Mais ça ne l'a pas fait. Soupir.



1
votes

Après avoir essayé les différentes choses proposées par d'autres personnes ayant répondu à cette question, je n'ai pas réussi à résoudre ce problème.

Je conclus que c'est un bug quelque part dans la chaîne de signal webcam de Google Chrome à gUM.


0 commentaires