Кодирование FFMPEG в MPEG-DASH - или WebM с кластерами ключевых кадров - для MediaSource API

В настоящее время я отправляю видеопоток в Chrome для воспроизведения через MediaSource API.

Насколько я понимаю, MediaSource поддерживает только файлы MP4, закодированные с помощью MPEG-DASH, или файлы WebM, кластеры которых начинаются с ключевых кадров (в противном случае возникает ошибка: сегмент мультимедиа не начинается с ключевого кадра).

Есть ли способ кодировать в формате MPEG-DASH или по ключевым кадрам WebM с FFMPEG в режиме реального времени?

Редактировать:

Я только что попробовал это с ffmpeg ... -f webm -vcodec vp8 -g 1 так что каждый кадр является ключевым. Не идеальное решение. Это работает с MediaStream сейчас, хотя. Есть ли способ синхронизировать сегменты с ключевыми кадрами в WebM, чтобы не каждый кадр был ключевым?


Справочные вопросы по WebM / MP4 и MediaSource:

Media Source Api не работает для пользовательского веб-файла (версия Chrome 23.0.1271.97 m)

MediaSource API и MP4

4 ответа

Решение

Чтобы убедиться, что каждый кластер в вашем WebM начинается с ключевого кадра, попробуйте что-то вроде этого:

ffmpeg \
  [...inputs] \
  -vcodec libvpx \
  -keyint_min 60 \
  -g 60 \
  -vb 4000k \
  -f webm \
  -cluster_size_limit 10M \
  -cluster_time_limit 2100 \
  [...output]

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

В этом примере у нас будет ключевой кадр каждые 2 секунды, а ограничение времени кластера составляет 2,1 секунды, поэтому мы никогда его не достигнем. Скорость передачи данных составляет 4 Мбит, а ограничение размера кластера составляет 10 МБ. Не уверен, что он там битовый или байтовый, но это не имеет значения, потому что мы никогда не поразим его, поскольку я установил его намного больше, чем нужно.

На данный момент FFMPEG не поддерживает кодировку DASH. Вы можете сегментировать с помощью FFMPEG ( https://www.ffmpeg.org/ffmpeg-formats.html), но я рекомендую объединить FFMPEG и MP4Box. Используйте FFMPEG для перекодирования вашего живого видео, а затем MP4Box для сегментирования и создания индекса.mpd.

MP4Box является частью GPAC ( http://gpac.wp.mines-telecom.fr/).

Вот пример использования h264:

ffmpeg -threads 4 -f v4l2 -i  /dev/video0 -acodec libfaac -ar 44100 -ab 128k -ac 2 -vcodec libx264 -r 30 -s 1280x720  -f mp4 -y "$movie" > temp1.mp4 && MP4Box -dash 10000 -frag 1000 -rap "$movie"

Если вам нужен VP8 (WebM), используйте: -vcodec libvpx а также -f webm или же -f ts,

Другому пользователю повезло с:

ffmpeg ... \
  -f mp4 \
  -reset_timestamps 1 \
  -movflags empty_moov+default_base_moof+frag_keyframe \
  -probesize 200000

Пожалуйста, см. Вопросы Galbarm по адресу:

Примечание. Если у вас нет ключевых кадров на входном видео, вам может потребоваться установить:

-frag_duration 100000

... вместо +frag_keyframe,

Я столкнулся с той же ситуацией, когда пытался воспроизвести записанный файл .webm с помощью MediaRecorder API обратно с помощью Media Source Extensions (MSE). Записи Chrome (51) искажены, Firefox (46) выглядит нормально.

Чтобы заставить его работать, вы должны исправить реплики в файле.webm:

  1. клон https://github.com/webmproject/libwebm
  2. убедитесь, что у вас установлена ​​версия cmake> = 3.2 ( https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04)
  3. cmake .
  4. make
  5. ./sample_muxer -i original.webm -o fixed.webm
  6. загрузите fixed.webm в DASH / свой собственный плеер!

Надеюсь, это помогло кому-то. Было довольно трудно гуглить любую информацию без ключевого слова DASH (я не использую DASH, только та же базовая технология - MSE):)

Другие вопросы по тегам