Encodage de FFMPEG en MPEG-DASH – ou WebM avec des Clusters D'images clés – pour L'API MediaSource

j'envoie actuellement un flux vidéo à Chrome, pour le lire via L'API MediaSource.

D'après ce que j'ai compris, MediaSource ne supporte 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 Media n'a pas commencé avec l'image clé).

y a-t-il un moyen d'encoder en MPEG-DASH ou en format keyframed WebM avec FFMPEG en temps réel?

Edit:

je viens de il a essayé avec ffmpeg ... -f webm -vcodec vp8 -g 1 pour que chaque image soit une image clé. Pas la solution idéale. Cela fonctionne avec MediaStream maintenant cependant. N'importe quel moyen de synchroniser les segments avec les images clés dans WebM donc chaque image n'a pas besoin d'être une image clé?


questions de référence sur WebM / MP4 et MediaSource:

Api Media Source ne fonctionne pas pour un fichier WEBM personnalisé (Chrome Version 23.0.1271.97 m)

API MediaSource et mp4

17
demandé sur Chris Nolet 2014-06-11 04:13:17

4 réponses

pour s'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. C'est-à-dire que sur key frame il y aura un nouveau cluster, mais sur new cluster il n'y aura pas nécessairement un keyframe. Pour contourner ce problème, nous définissons simplement la taille de la grappe à quelque chose de grand que nous ne toucherons jamais.

dans cet exemple, nous aurons une image clé toutes les 2 secondes, et la limite de temps de l'amas est de 2,1 secondes, donc on n'y arrivera jamais. Le débit est de 4Mbit, et la limite de taille des amas est de 10M-quelque chose. Je ne sais pas si c'est un morceau ou un octet là-bas mais ça n'a pas d'importance car nous ne le frapperons jamais car je l'ai mis beaucoup plus grand qu'il n'a besoin d'être.

3
répondu Brad 2017-07-18 16:40:07

actuellement FFMPEG ne supporte pas 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 le .mpd index.

MP4Box fait partie du GPAC (http://gpac.wp.mines-telecom.fr/).

Voici un exemple d'utilisation de 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.

11
répondu Cibrán Docampo 2016-05-13 01:24:33

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

s'il vous Plaît voir galbarm questions:

Remarque: Si vous n'avez pas des images clés sur la vidéo d'entrée, vous devrez peut-être définir:

-frag_duration 100000

... au lieu de +frag_keyframe.

8
répondu Chris Nolet 2018-08-05 22:14:27

je suis tombé dans la même situation en essayant de jouer enregistré .webm fichier par API MediaRecorder retour à l'aide de Extensions Des Sources Médiatiques (MSE). Les enregistrements de Chrome (51) sont malformés, Firefox (46) semble OK.

pour que cela fonctionne, vous devez corriger les indices .fichier webm:

  1. clone https://github.com/webmproject/libwebm
  2. assurez-vous d'avoir la version de cmake > = 3.2 (https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04)
  3. cmake .
  4. make
  5. ./sample_muxer -i original.webm -o fixed.webm
  6. charge fixe.webm dans DASH / votre propre lecteur!

J'espère que ça a aidé quelqu'un. Il était assez difficile de google toute information sans le mot-clé DASH (Je n'utilise pas DASH, seulement la même technologie sous-jacente-MSE):)

4
répondu lukyer 2017-04-13 12:22:39