AWS Elastic Transcoder / S3: преобразованные видео в HLSv4 воспроизводят звук только при низкой пропускной способности интернета

TL; DR:

  • загружать видео через aws-sdk (js) -> AWS Elastic Transcoder в S3 в формате HLSv4
  • загрузить мое видео с 4 предустановками: video_only_low, video_only_mid, video_only_high, audio_only (HLSv4 в Elastic Transcoder не поддерживает предустановку, включающую видео И аудио)
  • автоматически сгенерированный файл.m3u8 имеет аудиопоток рядом с моими 3 видеопотоками, так что пользователь с медленным интернетом слышит только звук без видео (черный экран) в видеоплеере
  • я мог бы удалить строку потока только аудио из файла.m3u8 вручную, но я хотел бы иметь автоматически сгенерированные файлы.m3u8 без этого потока только аудио

-> см. вопросы в конце.

Полный рассказ:

Я транслирую видео + аудио с помощью HLSv4, и я использую aws-sdk (js) (2.604.0) с AWS Elastic Transcoder и S3 для преобразования исходного файла (например,.mp4) в HLSv4. Я указал 4 предустановки эластичного транскодера: video_low, video_mid, video_high и один для звука, который используется в каждом видео. Для HLSv4 я не могу создать одну предустановку для видео И звука, должен быть один или несколько предустановок для видео и один для звука. После перекодирования следующий сгенерированный файл.m3u8 находится в выходном хранилище S3 (рядом с видео / аудиофайлами разного качества):

(заменен Guid на случайный guid)

    #EXTM3U
    #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-0",NAME="Default",AUTOSELECT=YES,DEFAULT=YES,URI="11111111-2222-3333-4444-555555555555_audio_v4.m3u8"
    #EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=14024000,CODECS="avc1.4d001f",URI="11111111-2222-3333-4444-555555555555_video_low_iframe.m3u8"
    #EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=22071000,CODECS="avc1.4d001f",URI="11111111-2222-3333-4444-555555555555_video_mid_iframe.m3u8"
    #EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=38803000,CODECS="avc1.4d0029",URI="11111111-2222-3333-4444-555555555555_video_high_iframe.m3u8"
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1387000,RESOLUTION=960x540,CODECS="avc1.4d001f,mp4a.40.2",AUDIO="audio-0" 11111111-2222-3333-4444-555555555555_video_low_v4.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2001000,RESOLUTION=1280x720,CODECS="avc1.4d001f,mp4a.40.2",AUDIO="audio-0" 11111111-2222-3333-4444-555555555555_video_mid_v4.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=4061000,RESOLUTION=1920x1080,CODECS="avc1.4d0029,mp4a.40.2",AUDIO="audio-0" 11111111-2222-3333-4444-555555555555_video_high_v4.m3u8
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=182000,CODECS="mp4a.40.2",AUDIO="audio-0" 11111111-2222-3333-4444-555555555555_audio_v4.m3u8

Наш код + эластичный транскодер отлично работал последние годы. С начала 2020 года наши пользователи открывают много билетов, так что иногда они слышат только аудиопоток без видео. Итак, мы протестировали видео с разными интернет-полосами пропускания и можем воспроизвести ошибку, когда пропускная способность недостаточно высока для видео в низком качестве.

Файл.m3u8 определяет во второй строке файла выше, что это звук с идентификатором 'audio-0', который использует каждое видео. Это нормально, поэтому звук сохраняется только один раз для всех видео различного качества.

В последней строке файла.m3u8 определяется, что только аудио - это поток для устройств с низкой пропускной способностью. Итак, я понимаю, что устройства с медленным интернетом получают только аудиопоток. Но я не хочу, чтобы наши пользователи транслировали только аудио без видео, они должны видеть значок загрузки, пока видеоплеер не буферизируется достаточно для самого низкого качества видео. Итак, для теста я удалил эту последнюю строку, поэтому для видеоплеера доступны только потоки video_low, -_mid и -_high, поэтому, когда я нахожусь в медленном Интернете, видеоплеер буферизуется, пока не загрузит первый сегмент (7 секунд) видео.

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

Создание задания для эластичного перекодирования реализуется через aws-sdk для javascript и использует объект CreateJobOutputs со всей информацией о предустановках, которые необходимо перекодировать для нового видео.

2 вопроса:

  • Что я могу сделать, чтобы сгенерированный файл.m3u8 не содержал последней строки для аудиопотока?

  • Почему наш код и видеопоток отлично работали последние несколько лет и с начала 2020 года у наших пользователей возникла эта проблема? Мы обновляем aws-sdk ежемесячно, но я долгое время не мог найти никаких изменений и примечаний к выпуску aws-sdk для Elastic Transcoder.

0 ответов