Как объединить сегменты видео/фрагментов видео ABR в одно бесшовное видео?

Я хочу захватить сегменты/фрагменты видео с адаптивным битрейтом (ABR) из проигрывателя (HLS/DASH), работающего в моем браузере, чтобы объединить все фрагменты в одно бесшовное видео для последующего анализа QoE (качества восприятия) видео целиком, т. е. VMAF. Для этого все сегменты должны быть частью одного видеофайла.

Как правило, объединение фрагментов видео с одинаковым разрешением может быть выполнено с помощью команды cat в ОС на базе Linux, например,

cat init.mp4 video1.mp4 video2.mp4 > fullvideo.mp4 

Однако я хочу объединить видео, когда проигрыватель ABR переключается между профилями/разрешениями, например,

  • 800x600init.mp4
  • 800x600video1.mp4
  • 1920x1024init.mp4
  • 1920x1024video2.mp4
  • 1920x1024video3.mp4

На проигрывателях HLS/DASH процесс переключения происходит плавно, и я хотел бы воспроизвести это поведение в комбинированном файле. Однако, когда я пытаюсь объединить все сегменты, используя cat, вывод неправильно обрабатывается проигрывателями mp4, такими как VLC. Насколько я понимаю, кажется, что формат .mp4 просто поддерживает конкатенацию видеокадров в одном разрешении.

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

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

[administrator@PlayerMedia mediaFiles]$ cat NGK_The_Owl_Y_Co_T1_E02_HD_STR-video=800000-init.mp4 \
NGK_The_Owl_Y_Co_T1_E02_HD_STR-video=800000-0.mp4 \
NGK_The_Owl_Y_Co_T1_E02_HD_STR-video=5993000-init.mp4 \
NGK_The_Owl_Y_Co_T1_E02_HD_STR-video=5993000-60060.mp4 \
NGK_The_Owl_Y_Co_T1_E02_HD_STR-video=5993000-120120.mp4 > final.mp4

Выходной файл final.mp4 содержит только метаданные, включенные в первый init.mp4 @ битрейт = 800000, поэтому следующие фрагменты видео с битрейтом = 5993000 (более высокое разрешение) отображаются как поврежденное видео.

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


person gdavila    schedule 21.08.2019    source источник


Ответы (1)


Решено с помощью ffmpeg.

Во-первых, все сегменты HLS должны быть загружены в том порядке, в котором они воспроизводились. Затем каждый сегмент необходимо масштабировать только до одного разрешения, то есть до 1920x1080. Это можно сделать с помощью ffmpeg.

ffmpeg -i <videoFile> -vf scale=1920:1080:flags=bicubic -c:v libx264 -preset slow -crf 21 <video upscaled>

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

person gdavila    schedule 01.02.2020