
У меня есть (довольно большой) набор файлов, в котором все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.
Проблема, с которой я столкнулся при использовании этого решения, заключается в том, что оно приводит к файлам, необходимым для обычного веб-сервера для плавной потоковой передачи. поэтому у него есть фрагменты видео, разделенные на части, и метаданные для каждого фрагмента. Все это обычно обрабатывается потоковым сервером.