J'envoie actuellement un flux vidéo à Chrome, pour jouer via l'API MediaSource.
Si je comprends bien, MediaSource ne prend en charge que les fichiers MP4 encodés avec MPEG-DASH, ou les fichiers WebM qui ont des clusters commençant par des images clés (sinon cela soulève l'erreur: le segment multimédia n'a pas commencé avec l'image clé).
Existe-t-il un moyen d'encoder au format MPEG-DASH ou WebM avec images clés avec FFMPEG en temps réel?
Modifier:
Je viens de l'essayer avec ffmpeg ... -f webm -vcodec vp8 -g 1
pour que chaque image soit une image clé. Pas la solution idéale. Cela fonctionne maintenant avec MediaStream. Est-il possible de synchroniser les segments avec les images clés dans WebM afin que chaque image ne soit pas nécessairement une image clé?
Questions de référence sur WebM/MP4 et MediaSource:
Media Source Api ne fonctionne pas pour un fichier webm personnalisé (Chrome Version 23.0.1271.97 m)
Pour vous assurer que chaque cluster de votre WebM commence par une image clé, essayez quelque chose comme ceci:
ffmpeg \
[...inputs] \
-vcodec libvpx \
-keyint_min 60 \
-g 60 \
-vb 4000k \
-f webm \
-cluster_size_limit 10M \
-cluster_time_limit 2100 \
[...output]
Fondamentalement, comme implémenté, chaque image clé doit être au début d'un cluster, mais l'inverse n'est pas vrai. Autrement dit, sur l'image clé, il y aura un nouveau cluster, mais sur le nouveau cluster, il n'y aura pas nécessairement une image clé. Pour contourner ce problème, nous avons simplement défini la taille du cluster sur quelque chose de grand que nous n'atteindrons jamais.
Dans cet exemple, nous aurons une image clé toutes les 2 secondes et la limite de temps du cluster est de 2,1 secondes, donc nous ne l'atteindrons jamais. Le débit binaire est de 4Mbit et la taille limite du cluster est de 10M-quelque chose. Je ne sais pas si c'est un bit ou un octet, mais cela n'a pas d'importance car nous ne le toucherons jamais car je l'ai réglé beaucoup plus qu'il ne devrait l'être.
À l'heure actuelle, FFMPEG ne prend pas en charge l'encodage DASH. Vous pouvez segmenter avec FFMPEG ( https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment ), mais je recommande de combiner FFMPEG et MP4Box. Utilisez FFMPEG pour transcoder votre vidéo en direct, puis MP4Box pour segmenter et créer l'index .mpd.
MP4Box fait partie de GPAC ( http://gpac.wp.mines-telecom.fr/ ).
Voici un exemple utilisant h264:
ffmpeg -threads 4 -f v4l2 -i /dev/video0 -acodec libfaac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -r 30 -s 1280x720 -f mp4 -y "$movie" > temp1.mp4 && MP4Box -dash 10000 -frag 1000 -rap "$movie"
Si vous avez besoin de VP8 (WebM), utilisez: -vcodec libvpx
et -f webm
ou -f ts
.
Un autre utilisateur a eu de la chance avec:
ffmpeg ... \
-f mp4 \
-reset_timestamps 1 \
-movflags empty_moov+default_base_moof+frag_keyframe \
-probesize 200000
Veuillez consulter les questions de galbarm sur:
Remarque: Si vous n'avez pas d'images clés sur la vidéo d'entrée, vous devrez peut-être définir:
-frag_duration 100000
... au lieu de +frag_keyframe
.
J'ai rencontré la même situation en essayant de lire un fichier .webm enregistré par API MediaRecorder en utilisant les extensions de source multimédia (MSE). Chrome (51) les enregistrements sont mal formés, Firefox (46) semble OK.
Pour le faire fonctionner, vous devez corriger les indices dans le fichier .webm:
cmake .
make
./sample_muxer -i original.webm -o fixed.webm
J'espère que cela a aidé quelqu'un. Il était assez difficile de rechercher des informations sur Google sans le mot clé DASH (je n'utilise pas DASH, uniquement la même technologie sous-jacente - MSE) :)