Может ли ffmpeg добавить файл субтитров .srt к файлу “.ts”?

Вопрос или проблема

У меня есть файл .srt с субтитрами, который я хочу добавить в качестве отдельного потока в файл .ts.

Если я сначала конвертирую этот файл .srt в формат VobSub, я могу добавить файл субтитров .idx следующим образом:

ffmpeg -probesize 60M -analyzeduration 60M ^
-i "V808.ts" ^
-i "V808.[2357](41001ms).idx" ^
-map 0 -map 1 -vcodec copy -acodec copy -c:s:0 copy -c:s:1 dvbsub ^
-metadata:s:s:0 language=eng -metadata:s:s:0 handler_name=Bad -metadata:s:s:0 title=Bad ^
-metadata:s:s:1 language=eng -metadata:s:s:1 handler_name=Good -metadata:s:s:1 title=Good ^
OUTPUT.ts

Однако я не могу просто добавить файл .srt в файл .ts и хотел бы понять, почему.

Вот команда, которую я пытаюсь использовать:

-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 ^
Больше? -i "input.ts" ^
Больше? -i "output.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 version 7.0.2-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
  построен с помощью gcc 13.2.0 (Rev5, построен проектом MSYS2)
  конфигурация: --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 kb/s
  Программа 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 Hz, стерео, s16p, 192 kb/s
  Поток #0:2[0x933](NAR): Аудио: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, стерео, s16p, 128 kb/s
  Поток #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 (copy)
  Поток #0:1 -> #0:1 (copy)
  Поток #0:2 -> #0:2 (copy)
  Поток #0:3 -> #0:3 (copy)
  Поток #0:4 -> #0:4 (copy)
  Поток #1:0 -> #0:5 (subrip (srt) -> mov_text (native))
Нажмите [q], чтобы остановить, [?] для помощи
Вывод #0, mpegts, в 'output.ts':
  Метаданные:
    encoder         : 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 Hz, стерео, s16p, 192 kb/s (по умолчанию)
  Поток #0:2(NAR): Аудио: mp2 ([4][0][0][0] / 0x0004), 48000 Hz, стерео, s16p, 128 kb/s
  Поток #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
      Метаданные:
        encoder         : Lavc61.3.100 mov_text
[mpegts @ 0000024c42b98200] В пакетах для потока 3 временные метки не установлены. Это устарело и в будущем перестанет работать. Исправьте свой
код, чтобы правильно установить временные метки
[mpegts @ 0000024c42b98200] Поток 5, кодек mov_text, мультиплексируется как частный поток данных и может не распознаваться при чтении.
[dvbsub @ 0000024c425e6500] Мусор в пакете3145.2kbits/s скорость=85.2x
[dvbsub @ 0000024c425e6500] Мусор в пакете3139.1kbits/s скорость=68.5x
[dvbsub @ 0000024c425e6500] Мусор в пакете3079.0kbits/s скорость= 118x
[dvbsub @ 0000024c425e6500] Мусор в пакете3119.3kbits/s скорость= 172x
    Последнее сообщение повторено 1 раз
[dvbsub @ 0000024c425e6500] Мусор в пакете3124.2kbits/s скорость= 177x
[dvbsub @ 0000024c425e6500] Мусор в пакете3156.2kbits/s скорость= 218x
[dvbsub @ 0000024c425e6500] Мусор в пакете3187.6kbits/s скорость= 212x
[dvbsub @ 0000024c425e6500] Мусор в пакете3165.9kbits/s скорость= 245x
[dvbsub @ 0000024c425e6500] Мусор в пакете3149.8kbits/s скорость= 264x
[dvbsub @ 0000024c425e6500] Мусор в пакете3172.2kbits/s скорость= 298x
[dvbsub @ 0000024c425e6500] Мусор в пакете3179.6kbits/s скорость= 294x
[dvbsub @ 0000024c425e6500] Мусор в пакете3175.3kbits/s скорость= 306x
[dvbsub @ 0000024c425e6500] Мусор в пакете3195.0kbits/s скорость= 307x
[dvbsub @ 0000024c425e6500] Мусор в пакете3175.7kbits/s скорость= 318x
[mpegts @ 0000024c425e1d00] Несоответствия размера пакета PESs/s скорость= 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 сообщает:

[mpegts @ 0000024c42b98200] Поток 5, кодек mov_text, мультиплексируется как частный поток данных и может не распознаваться при чтении.

Я получаю ту же ошибку, если пытаюсь использовать кодек subrip.

Дополнительно, если я сначала создаю файл .ts без потоков субтитров, а затем конвертирую его в файл .mp4..

ffmpeg -probesize 60M -analyzeduration 60M -i "input.ts" -map 0 -c copy "output.mp4"

То я МОГУ добавить в файл .srt субтитров без необходимости предварительно конвертировать его в формат VobSub…

ffmpeg -probesize 60M -analyzeduration 60M ^
-i "input.mp4" ^
-i "subtitles.srt" ^
-map 0 -map 1 -vcodec copy -acodec copy -c:s:0 mov_text ^
-metadata:s:s:0 language=eng -metadata:s:s:0 handler_name=Subs -metadata:s:s:0 title=Subs ^
"output.mp4"

Мой вопрос
Может ли ffmpeg добавить файл .srt с субтитрами как отдельный поток в файл .ts или есть ли необходимость сначала конвертировать его в формат VobSub?

Ответ или решение

Да, FFmpeg может добавить файл субтитров .srt в файл .ts как отдельный поток, но с определёнными оговорками. Формат MPEG-TS (Transport Stream) использует определённые кодеки для субтитров, и не все кодеки поддерживаются для создания .ts файлов, особенно в случае с методом, который вы используете.

Ваш текущий подход, когда вы пытаетесь использовать кодек mov_text для субтитров .srt в .ts файле, приводит к ошибкам, поскольку кодек mov_text в основном предназначен для формата MP4, а не TS.

Кроме того, ваш вывод Stream 5, codec mov_text, is muxed as a private data stream and may not be recognized upon reading указывает на то, что созданный поток субтитров не распознан.

Чтобы корректно добавить субтитры в .ts файл, вы можете использовать кодек dvbsub, который совместим с MPEG-TS. Однако, если вы хотите использовать субтитры в формате .srt, вам нужно сначала конвертировать их в формате VobSub или использовать другой подход.

Решение:

  1. Конвертация .srt в VobSub (если вы всё же хотите использовать VobSub):

    ffmpeg -i "subtitles.srt" "subtitles.idx"

    Затем вы можете следовать вашему первому примеру, где вы добавляете файл .idx к .ts файлу.

  2. Добавление .srt в .mp4:
    Если у вас нет жёстких требований использовать .ts, вы можете сначала создать .mp4 файл без субтитров и затем добавить их:

    ffmpeg -probesize 60M -analyzeduration 60M -i "input.ts" -map 0 -c copy "temp.mp4"
    ffmpeg -i "temp.mp4" -i "subtitles.srt" -map 0 -map 1 -c copy -c:s mov_text -metadata:s:s:0 language=eng "output.mp4"

Обратите внимание:

  • Совместимость: Кодек dvbsub работает с .ts, но для использования .srt лучше конвертировать в mov_text, если формат выходного файла – .mp4.
  • Потоковые форматы: Если вы хотите использовать .srt в выходном файле .ts, возможно, вам придётся конвертировать в VobSub, но если нет строгих требований к формату .ts, рекомендуем использовать .mp4 для лучшей совместимости.

Таким образом, для изменения формата или их добавления в .ts файл вы можете использовать только кодеки, которые поддерживаются для этого формата, в то время как MP4 предоставляет большую гибкость.

Оцените материал
Добавить комментарий

Капча загружается...