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.