Почему FFmpeg добавляет второй субтитр к моим файлам, хотя я явно добавил только один?

307
Peter W.

У меня есть куча файлов 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 subtitle menu showing two subtitle tracks, one labeled "Track 1 - English" and one just labeled "Track 2"

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

0

2 ответа на вопрос

1
fejyesynb

Ты виноват.

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

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

1
JakeGould

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/. Таким образом, вы можете не только увидеть, что было выполнено, но и сохранить отдельные файлы субтитров, если они вам понадобятся в будущем.

Имеет смысл, понятия не имею, почему я не подумал об этом. Спасибо! Peter W. 5 лет назад 1

Похожие вопросы