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.
Réponses
Trop de publicités?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 utiliserffprobe
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
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
.
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.