Вопрос или проблема
Этот вопрос связан с другим вопросом, который я задавал, в котором добавил субтитры в формате .idx file к существующему .ts файлу с помощью кодека FFmpeg dvbsub.
В этом вопросе я хочу добавить субтитры в формате .srt file в качестве дополнительного потока к .ts файлу. Я пробовал кодек mov_text
, но он не работает.
В моем .ts файле уже есть ПЯТЬ потоков:
- 1 x видео
- 2 x аудио
- 1 x телетекстовые субтитры
- 1 x DVB-субтитры
Вот команда, которую я пытаюсь использовать:
-i "input.ts" ^
-i "subtitles.srt" ^
-map 0 -map 1 -vcodec copy -acodec copy -c:s:0 copy -c:s:1 copy -c:s:2 mov_text ^
-metadata:s:s:0 language=eng -metadata:s:s:0 handler_name=Name1 -metadata:s:s:0 title=Name1 ^
-metadata:s:s:1 language=eng -metadata:s:s:1 handler_name=Name2 -metadata:s:s:1 title=Name2 ^
-metadata:s:s:1 language=eng -metadata:s:s:1 handler_name=Name3 -metadata:s:s:1 title=Name3 ^
"output.ts"
Я получаю следующий вывод от ffmpeg:
ffmpeg -probesize 60M -analyzeduration 60M ^
More? -i "input.ts" ^
More? -i "output.srt" ^
More? -map 0 -map 1 -vcodec copy -acodec copy -c:s:0 copy -c:s:1 copy -c:s:2 mov_text ^
More? -metadata:s:s:0 language=eng -metadata:s:s:0 handler_name=Name1 -metadata:s:s:0 title=Name1 ^
More? -metadata:s:s:1 language=eng -metadata:s:s:1 handler_name=Name2 -metadata:s:s:1 title=Name2 ^
More? -metadata:s:s:1 language=eng -metadata:s:s:1 handler_name=Name3 -metadata:s:s:1 title=Name3 ^
More? "output.ts"
ffmpeg version 7.0.2-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 13.2.0 (Rev5, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv
--enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsr
t --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribca
ption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable
-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libo
penjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbu
zz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 -
-enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enabl
e-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-a
mrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilb
c --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable
-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 59. 8.100 / 59. 8.100
libavcodec 61. 3.100 / 61. 3.100
libavformat 61. 1.100 / 61. 1.100
libavdevice 61. 1.100 / 61. 1.100
libavfilter 10. 1.100 / 10. 1.100
libswscale 8. 1.100 / 8. 1.100
libswresample 5. 1.100 / 5. 1.100
libpostproc 58. 1.100 / 58. 1.100
[mpegts @ 0000024c425e1d00] Несоответствие размера PES-пакета
[mpegts @ 0000024c425e1d00] Поврежденный пакет (поток = 1, dts = 8522036508).
[mpegts @ 0000024c425e1d00] Несоответствие размера PES-пакета
[mpegts @ 0000024c425e1d00] Поврежденный пакет (поток = 2, dts = 8522036508).
Input #0, mpegts, from 'input.ts':
Длительность: 02:46:58.18, начало: 84671.804778, битрейт: 3163 кбит/с
Программа 9220
Поток #0:0[0x931]: Видео: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, top first), 704x576 [SAR 16:11 DAR 16:9], 25 fps, 25 tbr
, 90k tbn
Дополнительные данные:
cpb: максимальный/минимальный/средний битрейт: 15000000/0/0 размер буфера: 1605632 vbv_delay: N/A
Поток #0:1[0x932](eng): Аудио: mp2 ([4][0][0][0] / 0x0004), 48000 Гц, стерео, s16p, 192 кбит/с
Поток #0:2[0x933](NAR): Аудио: mp2 ([4][0][0][0] / 0x0004), 48000 Гц, стерео, s16p, 128 кбит/с
Поток #0:3[0x934](eng,eng): Субтитры: dvb_teletext (libzvbi_teletextdec) ([6][0][0][0] / 0x0006), 492x250
Поток #0:4[0x935](eng): Субтитры: dvb_subtitle (dvbsub) ([6][0][0][0] / 0x0006)
Input #1, srt, from 'subtitles.srt':
Длительность: N/A, битрейт: N/A
Поток #1:0: Субтитры: subrip (srt)
Сопоставление потоков:
Поток #0:0 -> #0:0 (копировать)
Поток #0:1 -> #0:1 (копировать)
Поток #0:2 -> #0:2 (копировать)
Поток #0:3 -> #0:3 (копировать)
Поток #0:4 -> #0:4 (копировать)
Поток #1:0 -> #0:5 (subrip (srt) -> mov_text (native))
Нажмите [q], чтобы остановить, [?] для справки
Вывод #0, mpegts, в 'output.ts':
Метаданные:
энкодер : Lavf61.1.100
Поток #0:0: Видео: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, top first), 704x576 [SAR 16:11 DAR 16:9], q=2-31, 25 fps, 25 tb
r, 90k tbn
Дополнительные данные:
cpb: максимальный/минимальный/средний битрейт: 15000000/0/0 размер буфера: 1605632 vbv_delay: N/A
Поток #0:1(eng): Аудио: mp2 ([4][0][0][0] / 0x0004), 48000 Гц, стерео, s16p, 192 кбит/с (по умолчанию)
Поток #0:2(NAR): Аудио: mp2 ([4][0][0][0] / 0x0004), 48000 Гц, стерео, s16p, 128 кбит/с
Поток #0:3(eng): Субтитры: dvb_teletext ([6][0][0][0] / 0x0006), 492x250 (по умолчанию)
Метаданные:
handler_name : Name1
title : Name1
Поток #0:4(eng): Субтитры: dvb_subtitle ([6][0][0][0] / 0x0006)
Метаданные:
handler_name : Name3
title : Name3
Поток #0:5: Субтитры: mov_text
Метаданные:
энкодер : Lavc61.3.100 mov_text
[mpegts @ 0000024c42b98200] Временные метки не установлены в пакете для потока 3. Это устарело и в будущем перестанет работать. Исправьте вашу
программу, чтобы установить временные метки должным образом
[mpegts @ 0000024c42b98200] Поток 5, кодек mov_text, собирается как частный поток данных и может не распознаваться при чтении.
[dvbsub @ 0000024c425e6500] Мусор в пакете3145.2kbits/s speed=85.2x
[dvbsub @ 0000024c425e6500] Мусор в пакете3139.1kbits/s speed=68.5x
[dvbsub @ 0000024c425e6500] Мусор в пакете3079.0kbits/s speed= 118x
[dvbsub @ 0000024c425e6500] Мусор в пакете3119.3kbits/s speed= 172x
Последнее сообщение повторено 1 раз
[dvbsub @ 0000024c425e6500] Мусор в пакете3124.2kbits/s speed= 177x
[dvbsub @ 0000024c425e6500] Мусор в пакете3156.2kbits/s speed= 218x
[dvbsub @ 0000024c425e6500] Мусор в пакете3187.6kbits/s speed= 212x
[dvbsub @ 0000024c425e6500] Мусор в пакете3165.9kbits/s speed= 245x
[dvbsub @ 0000024c425e6500] Мусор в пакете3149.8kbits/s speed= 264x
[dvbsub @ 0000024c425e6500] Мусор в пакете3172.2kbits/s speed= 298x
[dvbsub @ 0000024c425e6500] Мусор в пакете3179.6kbits/s speed= 294x
[dvbsub @ 0000024c425e6500] Мусор в пакете3175.3kbits/s speed= 306x
[dvbsub @ 0000024c425e6500] Мусор в пакете3195.0kbits/s speed= 307x
[dvbsub @ 0000024c425e6500] Мусор в пакете3175.7kbits/s speed= 318x
[mpegts @ 0000024c425e1d00] Несоответствие размеров PES-пакетов/s speed= 327x
[mpegts @ 0000024c425e1d00] Поврежденный пакет (поток = 1, dts = 8522036508).
[in#0/mpegts @ 0000024c425e1980] Поврежденный входной пакет в потоке 1
Последнее сообщение повторено 1 раз
[mpegts @ 0000024c425e1d00] Несоответствие размера PES-пакета
[mpegts @ 0000024c425e1d00] Поврежденный пакет (поток = 2, dts = 8522036508).
[in#0/mpegts @ 0000024c425e1980] Поврежденный входной пакет в потоке 2
Последнее сообщение повторено 3 раза
[out#0/mpegts @ 0000024c42b23500] видео:3252315KiB аудио:391193KiB субтитры:76606KiB другие потоки:0KiB глобальные заголовки:0KiB накладные расходы мультиплексирования:
4.940417%
размер= 3903904KiB время=02:46:34.70 битрейт=3199.8kbits/s скорость= 330x
Когда я воспроизвожу output.ts в VLC, я не могу увидеть новый поток субтитров, чтобы выбрать его. Я вижу некоторые проблемы в выводе ffmpeg.
Значит ли это, что кодек mov_text не поддерживается в моем случае?
[mpegts @ 0000024c42b98200] Поток 5, кодек mov_text, собирается как частный поток данных и может не распознаваться при чтении.
Также в выводе ffmpeg говорится:
Поток #1:0: Субтитры: subrip (srt)
И…
Сопоставление потоков:
Поток #1:0 -> #0:5 (subrip (srt) -> mov_text (native))
Мой вопрос:
Использую ли я неправильный кодек для добавления .srt файла в мой .ts поток?
Ответ или решение
Для добавления субтитров в формате .srt
в существующий .ts
файл с использованием FFmpeg, вы действительно на правильном пути, однако нужно учитывать определённые нюансы, поскольку кодек mov_text
не поддерживается в контейнерах MPEG-TS. Вместо этого, вы можете использовать кодек srt
непосредственно, что позволит корректно инкапсулировать субтитры в вашем .ts
файле.
Вот как это можно сделать, чтобы добавить субтитры .srt
к вашему файлу:
- Команда FFmpeg для объединения потоков: Вам нужно будет изменить вашу команду следующим образом:
ffmpeg -i "input.ts" -i "subtitles.srt" -map 0 -map 1 -c copy -c:s srt -metadata:s:s:0 language=eng -metadata:s:s:0 title="English Subtitles" "output.ts"
-
Разъяснение параметров команды:
-i "input.ts"
— указывает входной.ts
файл.-i "subtitles.srt"
— указывает файл субтитров.-map 0
и-map 1
— указывает, что нужно использовать все потоки из входного файла 0 (видеопотоки, аудиопотоки и существующие субтитры) и добавлять субтитры из файла 1.-c copy
— копирует видеопоток и аудиопотоки без перекодирования.-c:s srt
— добавляет субтитры с использованием подходящего кодека для формата.srt
.-metadata:s:s:0 language=eng
и-metadata:s:s:0 title="English Subtitles"
— задаёт метаданные для добавленных субтитров.
-
Проблемы с совместимостью: Обратите внимание, что некоторые проигрыватели могут иметь ограниченную поддержку субтитров, особенно в контейнерах MPEG-TS. VLC поддерживает многие форматы, поэтому, если после выполнения вышеуказанной команды субтитры все равно не отображаются, убедитесь, что в VLC выбраны правильные настройки для отображения субтитров.
-
Проверка результата: После выполнения команды проверьте
output.ts
, открыв его в вашем медиапроигрывателе и удостоверитесь, что субтитры доступны. -
Дополнительные советы: Если у вас по-прежнему возникают проблемы с отображением субтитров, вы можете рассмотреть возможность конвертации файла
.srt
в.ass
или в другой формат субтитров, который может быть более совместим с вашим.ts
файлом.
Надеюсь, вышеизложенная информация поможет вам успешно добавить субтитры .srt
в ваш .ts
файл. Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь спрашивать!