Перейти к основному содержимому

WebM

WebM – это открытый формат мультимедийного контейнера, разработанный компанией Google в 2010 году. Он предназначен для передачи видео через интернет, особенно в контексте потокового вещания. Контейнер поддерживает несколько аудиоформатов, но основным является VP8/VP9, а также AV1 для видео и Opus/Vorbis для аудио. WebM широко используется в таких сервисах, как YouTube, Vimeo и других платформах для стриминга видео.

Основные характеристики WebM:

Форматы сжатия видео:

  • VP8: Предшественник VP9, первый видеокодек, поддерживаемый WebM. Разработка компании On2 Technologies, позже приобретенной Google. VP8 был выпущен под лицензией BSD, что сделало его бесплатным для использования.
  • VP9: Усовершенствованный преемник VP8, который обеспечивает лучшее качество при меньшем размере файла. Этот кодек стал стандартом де-факто для потоковой передачи видео высокого разрешения.
  • AV1: Новый кодек от альянса AOMedia, включающего такие компании, как Google, Microsoft, Netflix и другие. AV1 предлагает еще большее улучшение качества и эффективности сжатия по сравнению с VP9.

Аудиоформаты:

  • Vorbis: Открытый аудиокодек без лицензионных отчислений, часто используемый вместе с VP8/VP9.
  • Opus: Современный аудиокодек, оптимизированный для передачи голоса и музыки через интернет. Обеспечивает высокое качество звука даже при низких битрейтах.

Поддержка платформ:

WebM поддерживается всеми основными браузерами, такими как Chrome, Firefox, Opera и Edge. Однако Internet Explorer и Safari требуют установки дополнительных плагинов для воспроизведения контента в этом формате.

Спецификация контейнера:

Контейнер WebM основан на стандарте Matroska (.mkv), что позволяет ему поддерживать различные потоки данных, включая субтитры, метаданные и главы. Вот структура заголовков WebM:

EBML Header
Segment
Tracks
Cluster
SimpleBlock
BlockGroup
Block
Frame

Конвертация MP4 в WebM в FFMPEG с использованием VP9 и Opus:

ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 0 -crf 30 -c:a libopus output.webm

Здесь:

  • -i input.mp4 указывает входной файл.
  • -c:v libvpx-vp9 задает использование кодека VP9 для видео.
  • -b:v 0 отключает фиксированный битрейт, позволяя использовать переменный битрейт.
  • -crf 30 устанавливает параметр качества Constant Rate Factor (CRF). Чем ниже значение CRF, тем выше качество, но больше размер файла.
  • -c:a libopus задает использование кодека Opus для аудио.
  • output.webm – выходной файл.

Конвертация WebM в MP4 с использованием H.264 и AAC:

ffmpeg -i input.webm -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128k output.mp4

Здесь:

  • -c:v libx264 задает использование кодека H.264 для видео.
  • -preset slow устанавливает медленный пресет для лучшего качества, но увеличивает время обработки.
  • -crf 22 устанавливает высокий уровень качества.
  • -c:a aac задает использование кодека AAC для аудио.
  • -b:a 128k устанавливает битрейт аудио 128 кбит/с.

Декодирование и воспроизведение WebM в GStreamer:

gst-launch-1.0 filesrc location=input.webm ! matroskademux name=demux \
demux.video_0 ! vp9dec ! autovideosink demux.audio_0 ! vorbisdec ! audioconvert ! autoaudiosink

Здесь:

  • filesrc location=input.webm загружает входной файл.
  • matroskademux разбирает контейнер WebM.
  • vp9dec декодирует видео с помощью VP9.
  • autovideosink выводит видео на экран.
  • vorbisdec декодирует аудио с помощью Vorbis.
  • audioconvert преобразует аудиопоток в нужный формат.
  • autoaudiosink выводит звук на устройство вывода.

Создание WebM-файла из потока RTSP:

gst-launch-1.0 rtspsrc location=rtsp://example.com/live_stream ! rtph264depay ! h264parse ! vp9enc ! webmmux ! filesink location=output.webm

Здесь:

  • rtspsrc получает поток RTSP.
  • rtph264depay извлекает данные H.264 из RTP-пакетов.
  • h264parse анализирует данные H.264.
  • vp9enc перекодирует видео в VP9.
  • webmmux собирает все потоки в контейнер WebM.
  • filesink сохраняет результат в файл output.webm.