Ты виноват.
Удалите существующий .ass
файл из каталога видео.
VLC показывает вложенный субтитр и тот, что находится в каталоге видео.
У меня есть куча файлов 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 показывает две дорожки субтитров:
Кто здесь виноват? FFmpeg, VLC или мой быстрый и грязный скрипт? И как мне решить эту проблему?
Ты виноват.
Удалите существующий .ass
файл из каталога видео.
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/
. Таким образом, вы можете не только увидеть, что было выполнено, но и сохранить отдельные файлы субтитров, если они вам понадобятся в будущем.