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.
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
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).
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.
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
.
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.