## 問題:カメラはRTSPで話しかけるのに、ブラウザは聞き取れないセキュリティカメラやIoTデバイスからのライブ映像をWebアプリに表示したいとしよう。カメラの大部分はRTSP(Real Time Streaming Protocol)で配信してる。だけブラウザは2010年代からRTSP対応を打ち切った。要するに「カメラが喋ってる言語」と「ブラウザが理解できる言語」が違うのが根本問題だ。この翻訳を担当するのが**FFmpeg**(動画処理の万能ナイフ)と**MediaMTX**(プロトコル変換サーバー)。この2つを組み合わせれば、プロ並みの低遅延ストリーミングパイプラインが組める。## ツール解説### FFmpeg:あらゆる動画形式を変換する魔法の杖FFmpegの処理フロー:- **デマルチプレックス**:コンテナから動画と音声を分離- **デコード**:圧縮データを生フレームに変換- **フィルタリング**:スケーリング、色補正など適用- **エンコード**:H.264やVP9で圧縮- **マルチプレックス**:出力コンテナにパッケージ化ストリーミング用途では、FFmpegは入力エンジンとして動作。Webカメラやファイルから映像をキャプチャし、効率良くエンコードして、RTSPやRTMPでサーバーに送出する。### MediaMTX:複数クライアント対応のプロトコルハブFFmpegは単一出力だけど、MediaMTXは複数クライアントに同時配信できる。さらに:- RTSP/RTMP/WebRTC/HLSで受信- 異なるクライアント向けに再パッケージ化- RTSPをWebRTCに変換(ブラウザで再生可能に)- 認証・負荷分散・クライアント管理たった1つのバイナリとYAML設定ファイルで、従来は複数専用サーバーが必要な複雑なシーン対応できる。## 実装ステップ### ステップ1:ツールをインストール**Ubuntu/Debian:**sudo apt updatesudo apt install autoconf automake build-essential pkg-config libx264-dev libvpx-dev libfdk-aac-devgit clone ffmpegcd ffmpeg./configure --enable-gpl --enable-libx264 --enable-nonfreemake -j$(nproc)sudo make install**macOS:**brew install ffmpeg**Windows:**gydan.devからダウンロード→C:\ffmpegに解凍→システムPATHに追加MediaMTX v1.15.0もインストール(単一バイナリで簡単)。### ステップ2:動画ファイルをストリーミングmediamtx.ymlを作成:paths: test_video: source: publisherMediaMTXを起動:mediamtx mediamtx.ymlFFmpegで動画をRTSPで送出:ffmpeg -re -i video.mp4 -c:v libx264 -preset fast -c:a aac -f rtsp rtsp://localhost:8554/test_video-re:フレームレート保持(ライブストリーミング必須)-preset fast:エンコード速度のバランスVLC Media Playerで確認:Media → Open Network Stream → rtsp://localhost:8554/test_video### ステップ3:Webカメラをライブ配信**Windows:**ffmpeg -f dshow -rtbufsize 100M -i video="Integrated Webcam" -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:8554/webcam**macOS:**ffmpeg -f avfoundation -framerate 30 -video_size 1280x720 -i "0" -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:8554/webcam**Linux:**ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -f rtsp rtsp://localhost:8554/webcam-tune zerolatencyがポイント。リアルタイムストリーミング最適化。### ステップ4:ブラウザで再生(WebRTC化)mediamtx.ymlを更新:webrtc: yeswebrtcAddress: :8889webrtcEncryption: nowebrtcAllowOrigin: '*'paths: webcam: source: publisherMediaMTXを再起動して、ブラウザでhttp://localhost:8889を開く→ライブ映像がブラウザに表示される。## データの流れ1. Webカメラ → 生フレーム生成2. FFmpeg → H.264でエンコード&RTSP送出3. MediaMTX → RTSP受信・WebRTC変換4. ブラウザ → WebRTCでリアルタイム再生MediaMTXは**再エンコードしない**。H.264ストリームを異なるプロトコルのコンテナに詰め替えるだけ。だから低レイテンシー実現。## 今回のまとめ基本的なパイプライン完成:- FFmpegとMediaMTX導入済み- 動画ファイルとWebカメラのストリーミング確認- WebRTC経由ブラウザ再生成功だけ本番運用には課題あり:- 認証・セキュリティなし- localhostのみ動作- 実IPカメラ対応未- エラーハンドリングなしPart 2では認証追加、IPカメラ接続、インターネット対応に進む。
ライブ映像配信パイプラインを自分で構築する:FFmpeg×MediaMTXの実践ガイド
問題:カメラはRTSPで話しかけるのに、ブラウザは聞き取れない
セキュリティカメラやIoTデバイスからのライブ映像をWebアプリに表示したいとしよう。カメラの大部分はRTSP(Real Time Streaming Protocol)で配信してる。だけブラウザは2010年代からRTSP対応を打ち切った。要するに「カメラが喋ってる言語」と「ブラウザが理解できる言語」が違うのが根本問題だ。
この翻訳を担当するのがFFmpeg(動画処理の万能ナイフ)とMediaMTX(プロトコル変換サーバー)。この2つを組み合わせれば、プロ並みの低遅延ストリーミングパイプラインが組める。
ツール解説
FFmpeg:あらゆる動画形式を変換する魔法の杖
FFmpegの処理フロー:
ストリーミング用途では、FFmpegは入力エンジンとして動作。Webカメラやファイルから映像をキャプチャし、効率良くエンコードして、RTSPやRTMPでサーバーに送出する。
MediaMTX:複数クライアント対応のプロトコルハブ
FFmpegは単一出力だけど、MediaMTXは複数クライアントに同時配信できる。さらに:
たった1つのバイナリとYAML設定ファイルで、従来は複数専用サーバーが必要な複雑なシーン対応できる。
実装ステップ
ステップ1:ツールをインストール
Ubuntu/Debian:
sudo apt update sudo apt install autoconf automake build-essential pkg-config libx264-dev libvpx-dev libfdk-aac-dev git clone ffmpeg cd ffmpeg ./configure --enable-gpl --enable-libx264 --enable-nonfree make -j$(nproc) sudo make install
macOS:
brew install ffmpeg
Windows: gydan.devからダウンロード→C:\ffmpegに解凍→システムPATHに追加
MediaMTX v1.15.0もインストール(単一バイナリで簡単)。
ステップ2:動画ファイルをストリーミング
mediamtx.ymlを作成:
paths: test_video: source: publisher
MediaMTXを起動:
mediamtx mediamtx.yml
FFmpegで動画をRTSPで送出:
ffmpeg -re -i video.mp4 -c:v libx264 -preset fast -c:a aac -f rtsp rtsp://localhost:8554/test_video
-re:フレームレート保持(ライブストリーミング必須) -preset fast:エンコード速度のバランス
VLC Media Playerで確認:Media → Open Network Stream → rtsp://localhost:8554/test_video
ステップ3:Webカメラをライブ配信
Windows:
ffmpeg -f dshow -rtbufsize 100M -i video=“Integrated Webcam” -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:8554/webcam
macOS:
ffmpeg -f avfoundation -framerate 30 -video_size 1280x720 -i “0” -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:8554/webcam
Linux:
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -f rtsp rtsp://localhost:8554/webcam
-tune zerolatencyがポイント。リアルタイムストリーミング最適化。
ステップ4:ブラウザで再生(WebRTC化)
mediamtx.ymlを更新:
webrtc: yes webrtcAddress: :8889 webrtcEncryption: no webrtcAllowOrigin: ‘*’
paths: webcam: source: publisher
MediaMTXを再起動して、ブラウザでhttp://localhost:8889を開く→ライブ映像がブラウザに表示される。
データの流れ
MediaMTXは再エンコードしない。H.264ストリームを異なるプロトコルのコンテナに詰め替えるだけ。だから低レイテンシー実現。
今回のまとめ
基本的なパイプライン完成:
だけ本番運用には課題あり:
Part 2では認証追加、IPカメラ接続、インターネット対応に進む。