Кодирование FFMPEG в MPEG-DASH - или WebM с кластерами ключевых кадров-для MediaSource API
в настоящее время я отправляю видеопоток в Chrome, чтобы играть через API MediaSource.
Как я понимаю, MediaSource поддерживает только файлы MP4, закодированные с MPEG-DASH, или файлы WebM, которые имеют кластеры, начинающиеся с ключевых кадров (в противном случае возникает ошибка: сегмент мультимедиа не начинался с ключевого кадра).
есть ли способ кодирования в форматах MPEG-DASH или keyframed WebM с FFMPEG в режиме реального времени?
Edit:
Я просто попробовал с ffmpeg ... -f webm -vcodec vp8 -g 1
Так, что каждый кадр является ключевым. Не идеальное решение. Теперь он работает с MediaStream. Любой способ синхронизировать сегменты с ключевыми кадрами в WebM, чтобы не каждый кадр должен быть ключевым?
справочные Вопросы по WebM / MP4 и MediaSource:
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 секунды, поэтому мы никогда не попадем в него. Битрейт-4Mbit, а ограничение размера кластера-10M-что-то. Не уверен, что это бит или байт, но это не имеет значения, поскольку мы никогда не ударим по нему, поскольку я установил его намного больше, чем нужно.
на данный момент FFMPEG не поддерживает кодировку DASH. Вы можете сегментировать с FFMPEG (https://www.ffmpeg.org/ffmpeg-formats.html#segment_002c-stream_005fsegment_002c-ssegment), но я рекомендую комбинировать FFMPEG и MP4Box. Используйте FFMPEG для перекодирования живого видео, а затем MP4Box для сегментирования и создания .индекс мурз.
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
см. вопросы гальбарма по адресу:
- live streaming dash контент с помощью mp4box
- проблема Flush & Latency с фрагментированным созданием MP4 в FFMPEG
Примечание: Если у вас нет ключевых кадров на входном видео, вам может потребоваться установить:
-frag_duration 100000
... вместо +frag_keyframe
.
я столкнулся с той же ситуацией при попытке воспроизвести запись .файл WebM путем API MediaRecorder С помощью Расширения Источников Средств Массовой Информации (MSE). Записи Chrome (51) искажены, Firefox (46) выглядит нормально.
чтобы заставить его работать, вы должны решить подсказки .файл webm:
- клон https://github.com/webmproject/libwebm
- убедитесь, что у вас есть версия cmake >= 3.2 (https://askubuntu.com/questions/610291/how-to-install-cmake-3-2-on-ubuntu-14-04)
cmake .
make
./sample_muxer -i original.webm -o fixed.webm
- загрузить исправлена.webm в тире / ваш собственный игрок!
надеюсь, что это помогло кому-то. Было довольно сложно google любую информацию без ключевого слова DASH (я не использую DASH, только ту же базовую технологию-MSE):)