image + audio = mp4: comment rendre la vidéo plus petite?

12

J'utilise ffmpeg pour ajouter un JPG à un MP4 pour en faire un MP4.

Comme il n'y a qu'une seule image pour faire la vidéo, je me demande s'il existe un moyen de réduire la taille de la vidéo?

Commander:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

Résultats:

  • image.jpg = 26,7 K (image pas si claire)
  • audio.mp3 = 64,6 M (54 minutes)
  • output.mp4 = 80,6 M (le résultat vidéo n'est pas si clair, la musique est toujours bonne)

Est-ce une taille raisonnable pour MP4?

SIDU
la source
Je me demande s'il est possible de méta mp4 pour qu'il ne joue que du mp3 et garde l'écran fixé sur un jpg pour économiser de la taille :)
SIDU
Quel est le joueur, l'appareil ou le site cible pour la sortie?
llogan
J'essaie de télécharger le .mp4 sur Youtube.com
SIDU

Réponses:

18

Pour télécharger sur YouTube

H.264: plus petits fichiers

Cette méthode utilise libx264 pour coder la vidéo H.264. Il est plus lent que la méthode de copie de flux ci-dessous, mais peut potentiellement générer une taille de fichier plus petite.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Copie de flux: processus le plus rapide

Cette méthode ne fait que diffuser des copies (sans encodage) de l'image dans le conteneur MKV. C'est super rapide, mais si la taille est importante, la méthode ci-dessus peut produire un fichier plus petit.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube accepte à peu près n'importe quoi.Ces commandes utilisent donc quelques astuces pour accélérer l'encodage ou réduire la taille du fichier, et pour maintenir une qualité élevée, car YouTube réencodera tout ce que vous lui donnerez. Votre lecteur ne l'aimera probablement pas, mais YouTube l'appréciera.

  • Dans ces exemples, une fréquence d'images très faible est utilisée, qui devrait être traitée plus rapidement que la valeur par défaut de 25 ips.


Compatibilité la plus large pour tous les joueurs

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Cela devrait jouer sur à peu près tout , sauf très anciens appareils (changement -profile:v mainde -profile:v baselinesi tel est le cas).

  • Si votre entrée audio est déjà AAC, passez -c:a aacà -c:a copypour éviter un ré-encodage inutile.

  • Le temps d'encodage sera plus long et la taille du fichier sera plus grande que les commandes YouTube ci-dessus.

  • Voir FFmpeg Wiki: H.264 pour plus d'informations.

llogan
la source
Pourriez-vous fournir une ligne de code pour créer a.jpg + a.mp3 = a.mp4 en 1280 * 720 avec les images / s les plus basses autorisées par YouTube? De plus, comme il n'y a qu'un seul travail, dois-je supprimer "-loop 1"? Merci d'avance.
SIDU
@SIDU La commande existante fait ce que vous demandez (autre que la sortie de MKV au lieu de MP4), mais je ne connais pas la fréquence d'images la plus basse prise en charge par YouTube. Vous n'aurez qu'à expérimenter. Pourquoi avez-vous besoin de MP4 lorsque vous téléchargez juste sur YouTube?
llogan
Je l'ai essayé mais il dit:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules
@NineCattoRules Difficile à dire sans plus d'informations. Utilisez un site pastebin pour afficher votre ffmpegcommande complète et la sortie console complète de la commande, puis fournissez le lien dans un commentaire.
llogan
Merci, j'ai réinstallé FFMPEG en utilisant le référentiel mc3man et fonctionne maintenant bien!
NineCattoRules
3

Avec seulement les informations que vous avez fournies à ce que je peux penser.

Allons par morceaux:

Comme il n'y a qu'une seule image ajoutée à la vidéo. Je me demande s'il existe un moyen de réduire la taille de la vidéo, par exemple, forcer le débit binaire / seconde = 1 au lieu de 28?

Comme il s'agit d'une image fixe, pas besoin de changer. reste juste immobile.

Ce dont vous parlez, ce sont les images par seconde (ips) et non le débit binaire. Et vous avez raison dans le concept. Beign juste une image fixe 1 fps ne serait pas un problème.

Est-ce une taille raisonnable pour mp4? La taille de l'image est-elle importante?

Dans ce cas, la taille de l'image n'aurait pas un poids significatif car nous avons affaire à une seule image fixe. S'il s'agissait d'une vidéo de haute qualité, c'est un problème différent.

Dois-je redimensionner jpg en 1080 * 720, et faire des réglages supplémentaires dans ffmpeg pour sortir en 720p (quel est le réglage ffmpeg alors :)?

La résolution que vous dites est 1280x720.

Je ne vois pas l'intérêt de l' -loop 1option ici, cela ne fera que ralentir le processus. L'avez-vous utilisé -shortestcar le fichier contient plus d'un flux d'entrée? Si non, il n'y a aucune raison de l'utiliser. Puisque vous l'avez utilisé, -acodec copyje devrai supposer que vous ne voulez pas le ré-encoder.

Pour une sortie de 720p 1fps sans ré-encodage et sans toucher au débit:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Dans le cas où il a plus d'un flux d'entrée et que vous souhaitez que ffmpeg termine l'encodage sur le flux le plus court, alors:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Maintenant, si vous devez changer le bitrate (disons 1024k comme exemple);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Voir: Limiter le débit binaire de sortie

-c: a copy = Copiez le flux audio d'entrée afin de ne pas ré-encoder.

-b: v = le débit spécifié pour être (pas précisément) constant.

-bufsize = C'est l'intervalle dans lequel calcule le débit binaire moyen. Signifiant l'image la plus basse avec une qualité de perte plus élevée mais des débits binaires plus précis en fonction de la valeur spécifiée dans -b: v .

-s = La taille réelle de la sortie vidéo.

-framerate = La fréquence d'images d'entrée que nous voulons que la sortie utilise.

Notez que si vous voulez toujours une vidéo de plus petite taille à un moment donné, vous devrez sacrifier la qualité pour y parvenir. Et d'autres façons de le faire impliquent un ré-encodage avec une compression avec perte.

D'après ce que vous dites, les informations que vous fournissez et ce que vous essayez de faire, je pense que votre objectif est d'incorporer la pochette d'album au format mp3. Si tel est votre objectif, cela correspondrait mieux à vos besoins:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = Le spécificateur de métadonnées ffmpeg pour sortir le fichier à partir du fichier. Dans ce cas ( zéro ), les métadonnées globales.

-map 0 = flux d'entrée 1 (audio).

-map 1 = flux d'entrée 2 (image).

Si rien ici ne correspond à vos demandes, veuillez donner plus d'informations.

Fenrir
la source
Pensez à utiliser -frameratecomme option d'entrée et à supprimer la sortie -r: sinon le framerate d'entrée par défaut de 25 sera utilisé, puis ffmpegsupprimera les images à atteindre -r 1. Si vous déclarez simplement la fréquence d'images en entrée, la sortie utilisera la même fréquence d'images.
llogan
Merci. Je ne le savais pas. Modifié pour refléter les changements suggérés.
Fenrir
Merci pour le tutoriel. Ma ligne de code ffmpeg d'origine était un copier-coller de la recherche Google, dont je n'ai aucune idée de quoi.
SIDU