Création de vidéos MP4 prêtes pour le streaming HTTP

25

Comment puis-je convertir some.flvou some.aviou some.wmvavec FFmpeg pour être sûr que cette vidéo sera jouable et consultable dans JW Player?

abrahab
la source

Réponses:

9

Ceci est une réponse au dernier commentaire de votre part @abrahab.

Vous n'avez pas besoin d' mp4boxun fichier pour pouvoir le pseudo streamer via nginx. Le module de streaming MP4 s'en charge indépendamment du positionnement des atomes moov ( mp4boxdéplace l'atome moov au début du fichier).


Maintenant, pour l'erreur de serveur 500, utilisez-vous l'option "-frag" avec mp4box? Le module de streaming MP4 ne peut pas lire les fichiers MP4 fragmentés. Une bonne utilisation de la mp4boxpseudo-diffusion consiste à entrelacer les vidéos pour une meilleure recherche. Le déplacement des atomes de Moov est un avantage supplémentaire.

Je fais toujours ça sur mp4boxun fichier encodé FFmpeg

MP4Box -add MyVideo.mp4 -isma Myvideo-box.mp4

Cela entrelacera également le fichier MP4 en 500 millisecondes de morceaux par défaut.

Vineet
la source
1
Pour effectuer l'entrelacement de fichiers "sur place" sans avoir à créer un nouveau fichier, utilisez directementMP4Box -isma -inter 500 Myvideo.mp4
Vineet
45

H.264 en MP4

En règle générale, vous souhaitez créer une vidéo x264 dans un conteneur MP4. Cette option est prise en charge par pratiquement tous les appareils et navigateurs.

Ce qui suit devrait suffire. Assurez-vous de remplacer le nom d'entrée et les options CRF. Ce dernier définit la qualité, où les valeurs saines varient de 19 à 25 - une valeur inférieure signifie une meilleure qualité, mais également un débit binaire plus élevé:

ffmpeg -i input.avi -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

Vous pouvez également utiliser Handbrake pour l'encodage si vous aimez la méthode GUI.

Utiliser l' faststartoption

Maintenant, ce que vous devez faire est de déplacer l' atome MOOV du conteneur MP4 au début. Cet atome (en substance, une unité de données dans le conteneur MP4) contiendra des métadonnées importantes sur les flux vidéo / audio eux-mêmes. -movflags faststartdevrait faire exactement cela.

Si votre version FFmpeg ne dispose pas de cette option, envisagez la mise à niveau. Si vous ne pouvez pas mettre à niveau, vous pouvez réaliser la même chose avec l'un des outils ci-dessous:

  • QTIndexSwapper , une application Adobe AIR

  • MP4Box , gratuit et open source, exécutant une commande similaire à la suivante, où vous pouvez modifier l'intervalle (ici, 500):

    mp4box -inter 500 input.mp4

  • qt-faststart en Python , qui fonctionne partout où Python est installé.

    qtfaststart input.mp4

C'est à peu près ça.

Contrôle du débit / de la qualité

Maintenant, bien sûr, pour le streaming, vous pouvez en fait vouloir contraindre le débit à rester dans certaines limites. Vous pouvez en savoir plus à ce sujet dans mon article de blog sur les méthodes de contrôle des taux .

Par exemple, en ajoutant -maxrate 2M -bufsize 2Maux options d'encodage, vous limitez l'encodage à 2 Mbit / s, ce qui peut être suffisant pour la vidéo 720p. Le débit requis dépendra bien sûr de la complexité du contenu. Cela prend quelques essais et erreurs.

slhck
la source
merci, je fais tout de la même manière, mais le problème semble toujours avec la vidéo :( je le fais ffmpeg -i 1.flv -vcodec libx264 -f mp4 -an -g 1 -f mp4 -g 30 -level 3 new.mp4alors mp4boxet mp4 ne peut pas rechercher et nginx rapporter le 500 internal server errorparamètre de démarrage plus que 0. lorsqu'il est codé en vidéo sans -vcoded libx264(codeur mp4 par défaut) qualité! malade!) :( (désolé, maintenant, pas autorisé à voter, vous répondez)
abrahab
Cela semble être un problème de plugin h.264 avec NginX plutôt que n'importe quel problème de conversion vidéo. Je ne suis pas l'expert du streaming vidéo Web en soi, mais je vois que vous avez déjà posé des questions à ce sujet sur Stack Overflow? stackoverflow.com/questions/11079748/…
slhck
Je pense également que nginx ne peut pas lire correctement ce format vidéo. la vidéo de YouTube est également bien lue. oui, on me demande sur pile sur le problème de nginx, mais il semble qu'il n'y ait pas de réponses. :(
abrahab
3
+1 pour -movflags faststartexactement ce dont j'avais besoin
andrew
le lien est mort, il faut utiliser web.archive.org: web.archive.org/web/20140201142344/http://www.longtailvideo.com/…
malat
5

Vous pouvez simplement convertir un AVI ou MP4 non streamable, également sans tout ré-encoder, en procédant comme suit:

ffmpeg -i INPUT.mp4 -c copy -movflags faststart STREAMABLE_OUTPUT.mp4

Il n'est pas nécessaire de ré-encoder quoi que ce soit, car il suffit de déplacer l'atome moov.

user769852
la source
-1

Vous pouvez essayer ceci avec ffmpeg:

ffmpeg.exe -i "INPUT_FILE.AVI" -threads 2 -s 800x600 -r 25.00 -threads 1 -pix_fmt yuv420p -g 300 -qmin 3 -b 2048k -async 1 -acodec pcm_s16le -ar 22050 -ac 1 -ab 128k -y "OUTPUT_FILE.mp4"
Tomás Hernández
la source
5
Audio stéréo PCM 22 kHz pour le streaming vidéo sur Internet? Ne semble pas trop efficace. Et pourquoi voudriez-vous régler le débit audio à 128k alors?
slhck
@slhck, vous pouvez changer 22k en 44k en remplaçant "-ar 22050" par "ar 44100"
Searush
1
@SEARAS Le problème n'est pas le taux d'échantillonnage. C'est le fait que l'audio est une stéréo PCM non compressée. Pour le streaming sur Internet. Cela ne figure pas.
slhck
Cette réponse est de très mauvaise qualité et doit être supprimée. Les paramètres peuvent modifier la fréquence d'images, la résolution vidéo et le taux d'échantillonnage audio du contenu et produire des résultats inefficaces ou de faible qualité (ffmpeg peut choisir lui-même des paramètres plus sûrs ou meilleurs). Les performances sont également réduites par la limitation à moins de threads et ne fonctionnent même pas avec le -acodec pcm_s16le(erreur:) Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument. Une bonne raison, comme un projet IETF, pour laquelle choisir exactement ces paramètres semble également faire défaut.
LiveWireBT