processus bash pour copier les sous-titres dans leur mp4 respectif avec FFMPEG

2

J'ai beaucoup de fichiers vidéo (mp4), avec leurs sous-titres respectifs (chaque vidéo et sous-titre ont le même nom).

L'idée de créer une bash pour copier chaque sous-titre dans leur vidéo sans re-encoder à nouveau. Pour la première vidéo, j'ai essayé cette commande sur Terminal et fonctionne à merveille:

$ ffmpeg -i 01-01-Introduction.mp4 -fix_sub_duration -i 01-01-Introduction.srt -c:s mov_text -c:v copy -c:a copy -map 0:v -map 0:a -map 1 -metadata:s:s:0 language=eng 01-01-Introduction-sub.mp4

Quelques fichiers:

  1. 01-01-Introduction.mp4
  2. 01-01-Introduction.srt
  3. 01-02-CourseOverview.mp4
  4. 01-02-CourseOverview.srt
  5. etc

Aucune suggestion? Merci d'avance

Shywel
la source

Réponses:

3

Cela marche. Pour éviter d'écraser les fichiers d'entrée, j'ai modifié la variable out:"${i%.mp4}-sub.mp4"

#!/usr/local/bin/bash
# GNU bash version 4.3.42
# To avoid overwrite files: "${i%.mp4}-sub.mp4"


for i in *.mp4; do
    SUB=${i%.mp4}.srt
    ffmpeg -i "$i" -fix_sub_duration -i "$SUB" -c:s mov_text -c:v copy -c:a copy -map 0:v -map 0:a -map 1 -metadata:s:s:0 language=eng "${i%.mp4}-sub.mp4";
done

Merci à @MariusMatutiae

Shywel
la source
2

Tu devrais essayer;

for i in *.mp4; do
    SUB={i%%.mp4}.srt
    ffmpeg -i "$i" -fix_sub_duration -i "$SUB" -c:s mov_text -c:v copy -c:a copy -map 0:v -map 0:a -map 1 -metadata:s:s:0 language=eng "$i"
 done

Vous devriez tester la commande ci-dessus en copiant un fichier mp4 et ses sous-titres dans un répertoire vide, et essayez-le à cet endroit. Si cela fonctionne, vous pouvez continuer.

MariusMatutiae
la source
Salut @MariusMatutiae je reçois une erreur: {i%%.mp4}.srt: No such file or directory; mais grâce à votre aide, j'ai découvert comment le faire.
Shywel
Pour avoir juste un nom sans extension:SUB=${i%.mp4}.srt
Shywel