Можно ли извлекать субтитры SubRip (SRT) из видео MP4 с помощью ffmpeg?

Я проверил документацию FFMpeg и многие форумы и выяснил, что правильная строка для извлечения субтитров из видео .MP4 должна выглядеть так:

ffmpeg -i video.mp4 -vn -an -codec:s:0 srt out.srt

Однако, я получаю следующую ошибку, которая дает мне возможность задать вопрос о том, возможно ли это вообще:

Ошибка при открытии энкодера для выходного потока # 0: 0 - возможно, неправильные параметры таких как бит_трат, скорость, ширина или высота

Используя ffmpeg -codecs, я могу подтвердить, что ffmpeg должен иметь возможность кодировать субпригарные субтитры.

Используя ffmpeg -i video.mp4, я вижу, что в видео есть две дорожки субтитров:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
...
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 720x572 [SAR 64:45 DAR 256:143], 1341 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 191 kb/s
Stream #0:2(fra): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 191 kb/s
Stream #0:3(eng): Subtitle: dvd_subtitle (mp4s / 0x7334706D)
Stream #0:4(und): Subtitle: mov_text (text / 0x74786574)

ИЗМЕНИТЬ

Я тестировал с упрощенной командной строкой, показанной в комментариях, но я все равно получаю ту же ошибку. Ниже приведена ссылка на подробный подробный вывод из команды. Я также попытался полностью отключить метаданные и главы в результирующем результате, но все еще вызывает ту же ошибку.

Ответ 1

Я убедительно выяснил, почему мне это не удалось:

Указанная командная строка была бы прекрасно, если субтитры из исходного видео были закодированы в текстовом представлении. Однако, как видно на выходе в командной строке ffmpeg -i, субтитры кодируются в формате "dvd_subtitle".

Формат dvd_subtitle хранит растровые изображения для каждого субтитров в видео. Таким образом, ffmpeg не сможет преобразовать битмапы в текст.

Для этой задачи нужно прибегнуть к программному обеспечению на основе OCR, которое помогает пользователю идентифицировать каждый субтитр как текст из его растрового объявления.

(В исходном видео есть субтитры на основе текста, но я не знаю, откуда он появился и не встречается большинством популярных игроков. Для всех целей и целей этот субтитр "mov_text", кажется, заглушка, возможно, артефакт преобразования с оригинального DVD)

Ответ 2

Просто FYI (пока не могу комментировать из-за rep), но извлечение SRT из MP4 приведет к тому, что файл будет отформатирован как MOV_Text, а не обычный SRT. Он по-прежнему будет добавлен и работать, но это, как изменение mp4 на m4v. Хотя он обычно работает, в коде все не работает. Mov_text ужасен для ручной настройки шрифта/размера и т.д. Лучшая ставка - загрузить и протестировать SRT из Интернета!

Это будет работать, но приведет к файлу srt с кодировкой mov_text:

ffmpeg -i in.mp4 out.srt

Ответ 3

Попробуйте использовать опцию карты... если в входных файлах слишком много потоков....

Синтаксис:

ffmpeg -i video.mp4 -map 0: 4 out.srt

Поскольку в вашем видео есть два потока субтитров, сначала на 0: 3, который является dvdsubtitle, поэтому его нельзя преобразовать в srt, поэтому мы преобразуем второй субтитр в поток 0: 4, который является mov_text и является мягкой копией субтитров, поэтому может быть легко преобразуется....