web-dev-qa-db-fra.com

Comment puis-je fournir correctement une vidéo webcam simulée à Chrome?

J'essaie d'exécuter des tests de bout en bout dans Chrome pour un produit qui nécessite un flux de webcam à mi-chemin pour fonctionner. D'après ce que je comprends, cela signifie fournir une fausse vidéo webcam à Chrome en utilisant l'argument de ligne de commande --use-file-for-fake-video-capture="/path/to/video.y4m". Il l'utilisera ensuite comme une vidéo webcam.

Cependant, quel que soit le fichier y4m que je fournis, j'obtiens l'erreur suivante de Chrome s'exécutant dans ces conditions:

DOMException: Could not start video source
{
  code: 0,
  message: "Could not start video source",
  name: "NotReadableError"
}

Notamment Je peux très bien fournir un fichier audio en utilisant --use-file-for-fake-audio-capture Et Chrome fonctionnera bien avec. La vidéo a été mon point de friction.

Cette erreur provient de la simple demande mediaDevices suivante:

navigator.mediaDevices.getUserMedia({ video: true, audio: true })
  .then(data => {
    // do stuff
  })
  .catch(err => {
    // oh no!
  });

(Cela frappe toujours la branche "oh non!" Lorsqu'un fichier vidéo est fourni.)

Ce que j'ai essayé jusqu'à présent

J'ai exécuté Chrome avec les arguments de ligne de commande suivants (ajout de nouvelles lignes pour la lisibilité), et j'utilise un Mac d'où la commande open:

open -a "Google Chrome" --args
  --disable-gpu
  --use-fake-device-for-media-stream
  --use-file-for-fake-video-capture="~/Documents/mock/webcam.y4m"
  --use-file-for-fake-audio-capture="~/Documents/mock/microphone.wav"

webcam.y4m Et microphone.wav Ont été générés à partir d'un fichier vidéo que j'ai enregistré.

J'ai d'abord enregistré une vingt-deuxième vidéo mp4 à l'aide de MediaRecorder de mon navigateur, téléchargé le résultat et converti à l'aide des commandes de ligne de commande suivantes:

ffmpeg -y -i original.mp4 -f wav -vn microphone.wav
ffmpeg -y -i original.mp4 webcam.y4m

Lorsque cela n'a pas fonctionné, j'ai essayé la même chose en utilisant un fichier vidéo de vingt-deuxième que j'ai enregistré dans Quicktime:

ffmpeg -y -i original.mov -f wav -vn microphone.wav
ffmpeg -y -i original.mov webcam.y4m

Lorsque cela aussi a échoué, je suis allé directement à le fichier Chromium qui explique la fausse capture vidéo , je suis allé à l'exemple de liste de fichiers y4m il a fourni , et téléchargé le fichier de grand-mère et à condition qu'à la place d'un argument de ligne de commande dans Chrome:

open -a "Google Chrome" --args
  --disable-gpu
  --use-fake-device-for-media-stream
  --use-file-for-fake-video-capture="~/Documents/mock/grandma_qcif.y4m"
  --use-file-for-fake-audio-capture="~/Documents/mock/microphone.wav"

Chrome me fournit la exacte même erreur dans tout de ces situations.

La seule fois où Chrome ne commet pas d'erreur avec cette demande mediaDevices, c'est quand j'omets complètement la vidéo:

open -a "Google Chrome" --args
  --disable-gpu
  --use-fake-device-for-media-stream
  --use-file-for-fake-audio-capture="~/Documents/mock/microphone.wav"

Comptabilisation de C420mpeg2

TestRTC suggère que Chrome "plantera" si je lui donne un fichier C420mpeg2, Et recommande que le simple remplacement des métadonnées corrige le problème. En effet le fichier vidéo que je génère à partir de ffmpeg me donne l'en-tête suivant:

YUV4MPEG2 W1280 H720 F30:1 Ip A1:1 C420mpeg2 XYSCSS=420MPEG2

Chrome ne tombe pas en panne lorsqu'il est exécuté avec ce fichier, je reçois juste l'erreur ci-dessus. Si je modifie le fichier vidéo dans l'en-tête suivant, mais selon les recommandations de TestRTC, j'obtiens la même situation:

YUV4MPEG2 W1280 H720 F30:1 Ip A1:1 C420 XYSCSS=420MPEG2

Le fichier vidéo me donne toujours l'erreur ci-dessus dans ces conditions.

Que puis-je/dois-je faire?

Comment dois-je fournir un fichier vidéo à Chrome pour cet argument de ligne de commande?

Comment dois-je enregistrer ou créer le fichier vidéo?

Comment dois-je le convertir en y4m?

11
doppelgreener

Après avoir lu le lien que vous avez fourni, j'ai remarqué que nous pouvons également fournir un mjpeg .

Selon ce que vos exigences de test - cela peut être suffisant pour vous.

ffmpeg -i oldfile.mp4 newfile.mjpeg

puis j'ai testé en utilisant:

google-chrome --use-fake-device-for-media-stream --use-file-for-fake-video-capture=newfile.mjpeg

Après avoir accédé à Tracking JS j'ai pu voir la vidéo en cours de lecture.

J'espère que cela fonctionne pour vous!

7
Matt Harvey