У меня есть куча файлов MP4 и файлов субтитров в папке, каждая из которых соответствует шаблону episode[num].mp4 и episode[num].ass .

Я написал небольшой сценарий оболочки для автоматизации их объединения в файлы MKV:

for i in *.mp4; do 
  name=`echo $i | cut -d'.' -f1`;
  mp4name="$name.mp4";
  subname="$name.ass";
  mkvname="$name.mkv";
  ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname"
done

echo "Done";

После открытия одного из полученных MKV-файлов VLC показывает две дорожки субтитров:

Меню субтитров VLC, показывающее две дорожки субтитров, одну с надписью «Track 1 - English» и одну только с надписью «Track 2»

Кто здесь виноват? FFmpeg, VLC или мой быстрый и грязный скрипт? И как мне решить эту проблему?

2 ответа2

1

Ты виноват.

Удалите существующий файл .ass из каталога видео.

VLC показывает вложенный субтитр и тот, что находится в каталоге видео.

1

VLC и вы виноваты, но это зависит от вашей конечной цели.

FFmpeg не добавляет субтитры дважды, но VLC автоматически обнаруживает файл .ass в каталоге и добавляет его в список доступных субтитров. VLC ищет ресурсы, такие как файлы субтитров, которые имеют то же имя, что и видеофайл, и загружает их в окно проигрывателя для целей воспроизведения.

Поэтому, если вы играете в GreatMovie.mkv вас есть файл GreatMovie.ass в каталоге и вы воспроизводите его, VLC отобразит субтитры, встроенные в файл MKV, а также тот GreatMovie.ass который находится рядом с файлом MKV в этом каталоге. ,

Теперь я говорю, что это зависит от вашей конечной цели. Если вашей конечной целью является просто один объединенный файл MKV, который содержит все ресурсы, вам нужно удалить этот файл .ass после того, как он будет сделан. Поэтому я бы изменил ваш скрипт, добавив rm -f "$subname"; сразу после команды ffmpeg - как таковой, чтобы сделать это:

for i in *.mp4; do 
  name=`echo $i | cut -d'.' -f1`;
  mp4name="$name.mp4";
  subname="$name.ass";
  mkvname="$name.mkv";
  ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname"
  rm -f "$subname";
done

echo "Done";

Или, возможно, создайте каталог completed_subs/ и переместите субтитры в этот каталог, когда закончите.

for i in *.mp4; do 
  name=`echo $i | cut -d'.' -f1`;
  mp4name="$name.mp4";
  subname="$name.ass";
  mkvname="$name.mkv";
  ffmpeg -i "$mp4name" -i "$subname" -map 0:v -map 0:a -map 1:s -metadata:s:a language=jpn -metadata:s:s:0 language=eng -c copy -y "$mkvname"
  mkdir -p "completed_sub";
  mv $subname "completed_sub/$subname";
done

echo "Done";

Таким образом вы удаляете субтитры из каталога обработки, поэтому при просмотре файла MKV будут отображаться только ресурсы субтитров, встроенные в файл MKV, а автономные файлы .ass субтитров теперь находятся в completed_sub/ . Таким образом, вы можете не только увидеть, что было выполнено, но и сохранить отдельные файлы субтитров, если они вам понадобятся в будущем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .