web-dev-qa-db-fra.com

Conversion par lots de mkv H.265 en H.264 avec ffmpeg pour rendre les fichiers compatibles pour le réencodage

J'ai des fichiers codés H.265 qui utilisent tellement de ressources qu'ils ne fonctionnent pas bien et que mon logiciel de conversion (mencoder) ne prend pas (actuellement) en charge le format H.265. Puis-je les convertir au format H.264 dans un fichier de commandes en ligne de commande pour convertir rapidement les fichiers en recompression à l'aide de Devede/OGMrip? Lors de la recherche sur ce site, je n'ai pas trouvé le sujet discuté, alors je vais poster ce que j'estime être une question utile et une réponse à la question.

26
TheMegolith

Oui, en utilisant ffmpeg.

Ouvrez un terminal et dirigez-le vers le répertoire contenant les fichiers codés H.265, en supposant que vous avez ffmpeg et les bibliothèques appropriées installées et en supposant qu'ils soient au format MKV, copiez-collez les éléments suivants dans la fenêtre du terminal.

INPUT="$1"
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

Voilà. Cela convertira en h.264 dans un conteneur MPG dans le même répertoire.

Explication des commutateurs de commande:

  • for i in *.mkv ; do ... done

    Cela configure tous les fichiers .mkv d'un répertoire à inclure dans le traitement par lots. Cela peut être modifié pour s'adapter à l'extension de conteneur des fichiers que vous souhaitez traiter.

  • ffmpeg -i "$i" Exécute le programme ffmpeg et appelle les fichiers à traiter.

    • -bsf:v active le filtre de flux de bits vidéo à utiliser.

    • h264_mp4toannexb - Le filtre de flux de bits est-il activé?.

      Convertissez un flux de bits H.264 du mode préfixé en longueur au mode de préfixe de code de démarrage (comme défini dans l'Annexe B de la spécification UIT-T H.264).

      Ceci est requis par certains formats de diffusion, généralement le format de flux de transport MPEG-2 (mpegts) qui traite MKV h.264 (actuellement) l'exige. Si cette option n'est pas incluse, vous obtiendrez une erreur dans la fenêtre du terminal vous invitant à l'utiliser.

    • -sn arrête la diffusion des flux de sous-titres (pour ceux qui ne veulent pas de sous-titres dans leur vidéo). Ceci est facultatif et peut être supprimé.

    • -map 0:0 -map 0:1 Indique à ffmpeg de ne traiter que les deux premiers flux du fichier (0:0 est le flux vidéo, 0:1 est le premier flux audio du fichier). Cela fait deux choses, supprime les flux audio en excès, généralement le premier flux audio est en anglais mais pas toujours. Les autres flux tels que les sous-titres intégrés sont supprimés, ce qui réduit la taille du fichier. C'est aussi une chaîne facultative. Vous pouvez utiliser ffprobe pour afficher les flux disponibles dans le fichier. -map est facultatif et peut être supprimé de la commande.

    • -vcodec libx264 Ceci indique à ffmpeg de coder la sortie au format H.264

    • "$i.ts" Enregistre la sortie au format .ts, ce qui est utile pour ne pas écraser vos fichiers source.

  • mv "$i.ts" "$i.mpg" Convertit l'extension de fichier en MPG dans le même répertoire. Cela peut être configuré pour l'envoyer dans n'importe quel répertoire.

  • sleep 3 - permet au processus de rester en attente en donnant à ffmpeg le temps de mettre le fichier suivant en file d'attente

31
TheMegolith

Conversion par lots de H.265 à H.264

Ces exemples ont été écrits pour _ffmpeg récent. Epargnez-vous quelques ennuis et téléchargez une version récente. Ensuite, placez le binaire ffmpeg dans ~/bin ou /usr/local/bin (vous devrez peut-être vous déconnecter puis vous connecter pour le remarquer).

Sortie Matroska

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • Cet exemple affichera un répertoire nommé h264vids.

  • Cet exemple suppose que vos entrées sont .mp4. Sinon, remplacez l'instance .mp4 dans l'exemple par votre type de fichier d'entrée ou utilisez simplement le glouton * seul.

  • Ajustez -crf pour la qualité et -preset pour la vitesse/efficacité de l'encodage. Ou alors, supprimez simplement ces options et utilisez les valeurs par défaut qui sont assez bonnes et devraient suffire pour la plupart (l'exemple utilise les valeurs par défaut pour ces options). Voir FFmpeg Wiki: H.264 pour plus d'informations sur ces options.

Sortie MP4

Celui-ci est un peu plus compliqué. Ceci effectuera un codage conditionnel selon que l'audio d'entrée est au format AAC ou non. Si l'audio d'entrée est AAC, l'audio sera copié en flux (remodelé) tel quel et un recodage inutile est évité. Si l'audio d'entrée est pas AAC, il sera ré-encodé en AAC.

Voici un script simple montrant comment faire ceci en utilisant ffprobe et ffmpeg. Copiez-le et enregistrez-le dans le répertoire contenant vos vidéos à convertir, donnez-lui l'autorisation d'exécution avec chmod +x yourscriptname, puis exécutez-le avec ./yourscriptname.

#!/bin/bash

audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")

mkdir h264vids

for f in *.mkv
do
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • Cet exemple affichera un répertoire nommé h264vids.

  • Cet exemple suppose que vos entrées sont .mkv. Sinon, remplacez l'instance .mkv dans l'exemple par votre type de fichier d'entrée ou utilisez simplement le glouton * seul.

  • Voir la note ci-dessus concernant -crf et -preset.

  • Vous pouvez mettre en pause l’encodage avec ctrl+z et reprendre avec fg.

18
llogan

Compte tenu des réponses précédentes, j'ai proposé ce qui suit:

for file in *265.mkv; do Nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done

Cela suppose que les fichiers ont toujours un nom se terminant par 265.mkv. Cette fin sera remplacée par 264.mkv.

Si votre nom de fichier est différent, vous devez adapter la commande en conséquence.

0
kerner1000