38 votes

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

J'ai des fichiers encodés en H.265 qui sont si gourmands en ressources qu'ils ne se lisent pas bien et mon logiciel de conversion (mencoder) ne supporte pas (actuellement) le format H.265. Puis-je les convertir en H.264 dans un fichier batch en ligne de commande pour convertir rapidement les fichiers pour la recompression avec Devede/OGMrip ? En cherchant sur ce site, je n'ai pas trouvé de discussion à ce sujet, je vais donc poster ce que je pense être une question utile et une réponse à cette question.

43voto

TheMegolith Points 941

Oui, en utilisant ffmpeg .

Ouvrez un terminal et dirigez-le vers le répertoire contenant les fichiers encodés H.265, en supposant que vous ayez ffmpeg et les bibliothèques appropriées installées, et en supposant qu'ils sont au format MKV, copiez et collez ce qui suit 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à, c'est fait. 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 permet d'inclure tous les fichiers .mkv d'un répertoire dans le traitement par lots. Ce paramètre peut être modifié pour tenir compte de l'extension du conteneur des fichiers que vous souhaitez traiter.

  • ffmpeg -i "$i" Exécute le programme ffmpeg et demande le traitement des fichiers.

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

    • h264_mp4toannexb - Est le filtre de flux de bits qui est activé.

      Convertir un flux binaire H.264 du mode préfixé par la longueur au mode préfixé par le code de démarrage (tel que défini dans l'annexe B de la spécification H.264 de l'UIT-T).

      Certains formats de diffusion en continu l'exigent, notamment le format de flux de transport MPEG-2 ( mpegts ) Le traitement des MKV h.264 (actuellement) nécessite ceci, si ce n'est pas le cas, vous obtiendrez une erreur dans la fenêtre du terminal vous demandant de 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) Cette option est facultative et peut être supprimée.

    • -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). Cette opération a deux effets : elle supprime les flux audio excédentaires. En général, le premier flux audio est en anglais, mais ce n'est pas toujours le cas. Les autres flux, tels que les sous-titres intégrés, sont supprimés, ce qui réduit la taille du fichier. Il s'agit également d'une chaîne facultative. Vous pouvez utiliser ffprobe pour afficher les flux disponibles dans le fichier. -map est facultatif et peut être écarté de la commande.

    • -vcodec libx264 Ceci indique à ffmpeg d'encoder la sortie en H.264

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

  • mv "$i.ts" "$i.mpg" Convertit l'extension du fichier en MPG dans le même répertoire. Il peut être configuré pour être envoyé dans le répertoire de votre choix.

  • sleep 3 - permet au processus de se reposer, ce qui donne à ffmpeg le temps de mettre en file d'attente le fichier suivant

22voto

Robert Gilliam Points 21

Conversion par lots de H.265 à H.264

Ces exemples ont été rédigés pour des ffmpeg . Épargnez-vous des ennuis et télécharger une version récente. Ensuite, mettez le ffmpeg binaire en ~/bin o /usr/local/bin (il se peut que vous deviez vous déconnecter puis vous connecter pour que cela soit remarqué).

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
  • Dans cet exemple, la sortie se fera dans un répertoire nommé h264vids .

  • Cet exemple suppose que les données d'entrée sont les suivantes .mp4 . Si ce n'est pas le cas, modifiez le .mp4 dans l'exemple à votre type de fichier d'entrée, ou utilisez simplement la méthode gourmande * par lui-même.

  • Ajuster -crf pour la qualité et -preset pour la vitesse et l'efficacité de l'encodage. Vous pouvez également supprimer ces options et utiliser 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

Celle-ci est un peu plus compliquée. Il va effectuer un encodage conditionnel selon que l'audio d'entrée est AAC ou non. Si l'audio d'entrée est AAC, alors l'audio sera copié en flux (re-muxed) tel quel et le ré-encodage inutile sera évité. Si l'audio d'entrée est pas AAC, il sera réencodé en AAC.

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

#!/bin/bash

mkdir h264vids

for f in *.mkv
do
  audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
  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
  • Dans cet exemple, la sortie se fera dans un répertoire nommé h264vids .

  • Cet exemple suppose que les données d'entrée sont les suivantes .mkv . Si ce n'est pas le cas, modifiez le .mkv dans l'exemple à votre type de fichier d'entrée, ou utilisez simplement la méthode gourmande * par lui-même.

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

  • Vous pouvez interrompre l'encodage avec ctrl + z et reprendre avec fg .

2voto

kerner1000 Points 3204

Compte tenu des réponses précédentes, je suis arrivé à la conclusion suivante :

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 terminaison sera remplacée par 264.mkv .

Si le nom de vos fichiers est différent, vous devez adapter la commande en conséquence.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X