ffmpeg: упаковка H264@MPEGTS в Smooth Streaming

ffmpeg: упаковка H264@MPEGTS в Smooth Streaming

У меня есть (довольно большой) набор файлов, в котором всеH264вMPEG-TSконтейнер. Из-за ограничений по времени мне нужно перепаковать этот контент в плавную потоковую передачу без его перекодирования (перекодирование заняло бы слишком много времени).

Я пытался выяснить, как это сделать с помощью ffmpeg, так как, похоже, у него есть 2 разных мультплексора, которые могут подойти для этой задачи. Я пробовал и мультплекс 'smoothstreaming', и мультплекс 'ismv', но с обоими у меня возникли проблемы.

ffmpeg -i input.mpg -codec copy -f smoothstreaming ss_out

При этом я получаю следующую ошибку:

ffmpeg версия N-79695-g675cfb2 Авторские права (c) 2000-2016 разработчики FFmpeg
  собрано с помощью gcc 5.3.1 (Debian 5.3.1-14) 20160409
  конфигурация:
  libavutil 55. 23.100 / 55. 23.100
  libavcodec 57.38.100 / 57.38.100
  libavformat 57. 35.100 / 57. 35.100
  libavdevice 57. 0.101 / 57. 0.101
  libavfilter 6. 44.100 / 6. 44.100
  libswscale 4. 1.100 / 4. 1.100
  libswresample 2. 0.101 / 2. 0.101
Вход №0, mpegts, из «input.mpg»:
  Продолжительность: 01:28:41.98, начало: 2.040000, битрейт: 2500 кб/с
  Программа 1
    Поток #0:0[0x1e1]: Видео: h264 (Основной) ([27][0][0][0] / 0x001B), yuv420p, 720x576 [SAR 16:11 DAR 20:11], 25 кадров в секунду, 25 tbr, 90k tbn
    Поток #0:1[0x1e2](eng): Аудио: mp2 ([4][0][0][0] / 0x0004), 48000 Гц, стерео, s16p, 192 кбит/с
[smoothstreaming @ 0x2616340] Использование AVStream.codec для передачи параметров кодека мультиплексорам устарело, вместо этого используйте AVStream.codecpar.
    Последнее сообщение повторено 1 раз
[smoothstreaming @ 0x2616340] Для потока 0 битрейт не установлен
Выход №0, плавная передача, в «ss_out»:
  Метаданные:
    кодер: Lavf57.35.100
    Поток #0:0: Видео: h264 ([33][0][0][0] / 0x0021), yuv420p, 720x576 [SAR 16:11 DAR 20:11], q=2-31, 25 кадров в секунду, 25 tbr, 50 tbn
    Поток #0:1(eng): Аудио: mp2 (i[0][0][0] / 0x0069), 48000 Гц, стерео, 192 кбит/с
Картографирование потока:
  Поток #0:0 -> #0:0 (копия)
  Поток #0:1 -> #0:1 (копия)
Не удалось записать заголовок для выходного файла №0 (неверные параметры кодека?): недопустимый аргумент

Еще я попробовал упаковать его с помощью ffmpeg в ismv:

ffmpeg -i input.mpg -c copy -movflags isml+frag_keyframe -f ismv ss_out.ismv

Пока все работает нормально, но затем мне понадобится инструмент ismindex для создания файлов манифеста, но это не сработает:

ismindex -n ss_out ss_out.ismv

Unable to read the MFRA atom in ss_out.ismv (mfra size mismatch)

Может быть, я что-то делаю не так или что-то не так с моим входным файлом?

решение1

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

ISMV-мультиплексор + ismindex

Мне был нужен набор файлов на стороне сервера (.ism, .ismc, .ismv). Чтобы добиться этого, я сделал следующие 2 вещи:

ffmpeg -i input.mpg -c:v copy -c:a aac -b:a 192k -movflags frag_keyframe -f ismv ss_out.ismv

Приведенная выше команда копирует видеопотоки без их перекодирования, перекодирует аудио в AAC (хотя, похоже, ffmpeg и ismindex тоже не против аудио MP2) и упаковывает его в файл .ismv.

ismindex -n ss_out ss_out.ismv

Затем инструмент ismindex может создать нужные мне файлы .ism и .ismc.

Файлы, которые я получил в результате, можно было транслировать через IIS с помощью Media Services.

Smoothstreaming-мультиплексор

В конце концов я также заставил работать 'smoothstreaming' muxer, трюк был в том, что ему также требовался файл .ismv в качестве входных данных. Поэтому я сначала запустил ту же команду ffmpeg, что и выше, после чего я мог снова использовать ffmpeg, чтобы перепаковать его с 'smoothstreaming' muxer.

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

Связанный контент