日本のデジタルテレビ(地上波・BS・CS)をWebブラウザで視聴できるリアルタイムストリーミングシステム
このプロジェクトは、Mirakurunを使用して日本のデジタルテレビ放送を受信し、Webブラウザでリアルタイム視聴を可能にするシステムです。MPEG2-TSストリームをHLS(HTTP Live Streaming)形式に変換し、HLS.jsを使用してブラウザで再生します。
-
📺 リアルタイム視聴
- 地上波デジタル放送対応
- BSデジタル放送対応(28チャンネル)
- 🆕 CSデジタル放送対応(50サービス)
- リアルタイムMPEG2-TS → HLS変換
- NVENC/H.264ハードウェアエンコーディング
-
🎮 ユーザーインターフェース
- モダンなWebUI(Svelte + Tailwind CSS)
- 📱 レスポンシブデザイン(モバイル・タブレット対応)
- タブ切り替えチャンネル選択(地上波・BS・CS)
- 放送局名の正確な表示(TBSチャンネル1、フジテレビONEなど)
- タイプ別カラーコーディング(地上波:緑、BS:青、🆕 CS:紫)
- 🆕 iPhoneインライン再生対応
- 🆕 ストリーム選択UI(映像・音声トラック切り替え)
-
🔧 デバッグ・監視機能
- 🆕 改善されたデバッグUI(専用ログパネル)
- FFmpegリアルタイムログ表示
- エンコーディングプロセス監視
- API健全性チェック
- アプリケーションログとFFmpegログの分離表示
-
⚡ パフォーマンス
- 最適化されたFFmpeg設定
- 🆕 CS放送高速分析(20秒 → 0.5秒)
- 効率的なHLSセグメント管理(2秒セグメント)
- 🆕 複数チャンネル同時エンコーディング(最大3ch)
- NVENC(RTX 3080)ハードウェア加速対応
- Go 1.21: 高性能なAPIサーバー
- Gin Framework: RESTful API
- FFmpeg: MPEG2-TS → HLS エンコーディング
- SQLite: 設定・データ管理
- Svelte: モダンなWebフレームワーク
- TypeScript: 型安全な開発
- Tailwind CSS: ユーティリティファーストCSS
- HLS.js: ブラウザHLS再生
- Docker & Docker Compose: コンテナ化
- NVIDIA Container Toolkit: GPU コンテナサポート
- Nginx: リバースプロキシ
- Host Networking: 低レイテンシー通信
- NVENC: NVIDIA GPUハードウェアエンコーディング
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Mirakurun │───▶│ TV Viewer │───▶│ Web Browser │
│ (TV Tuner) │ │ Backend │ │ (HLS.js) │
│ │ │ │ │ │
│ MPEG2-TS Stream │ │ Go + FFmpeg │ │ Svelte Frontend │
└─────────────────┘ │ HLS Transcoding │ └─────────────────┘
└──────────────────┘
- Docker & Docker Compose
- Mirakurunサーバーが稼働中(
localhost:40772) - (オプション)NVIDIA GPU + NVIDIA Container Toolkit(NVENC使用時)
# リポジトリをクローン
git clone <your-repo-url>
cd tv-viewer
# コンテナをビルド・起動
docker compose up -d
# GPU搭載システムでNVENCを使用する場合
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d
# フロントエンドにアクセス
open http://localhost:3001# docker-compose.yml で設定済み
MIRAKURUN_URL=http://localhost:40772
PORT=18088| Method | Endpoint | 説明 |
|---|---|---|
| GET | /api/health |
健全性チェック |
| GET | /api/channels |
チャンネル一覧取得 |
| GET | /api/channels/{id}/stream |
ストリーミング開始 |
| GET | /api/logs/{channel} |
FFmpegログ取得 |
| GET | /api/sessions |
アクティブセッション一覧 |
| POST | /api/sessions/stop-all |
全セッション停止 |
| Method | Endpoint | 説明 |
|---|---|---|
| GET | /api/nvenc/status |
NVENCステータス確認 |
| POST | /api/nvenc/toggle |
NVENC有効/無効切替 |
| Method | Endpoint | 説明 |
|---|---|---|
| GET | /api/stream/{channel}/playlist.m3u8 |
HLSプレイリスト |
| GET | /api/stream/{channel}/segment{n}.ts |
HLSセグメント |
| GET | /api/stream/{channel}/subtitles.ass |
字幕ファイル |
| Method | Endpoint | 説明 |
|---|---|---|
| GET | /api/channels/{id}/stream-info |
ストリーム情報取得 |
| POST | /api/channels/{id}/select-streams |
ストリーム選択変更 |
- NVIDIA GPU 自動検出: RTX/GTX シリーズで自動有効化
- コーデック選択: H.264 または H.265(HEVC)
- 品質設定: High/Medium/Low プリセット
- CPU 負荷減: 15-30% → 10-12% にCPU使用率削減
# GPU対応で起動
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d
# NVENC ステータス確認
curl http://localhost:18088/api/nvenc/status
# H.265 を有効にする場合
export USE_HEVC=true
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d| 項目 | CPUエンコード | NVENC H.264 | NVENC H.265 |
|---|---|---|---|
| CPU使用率 | 15-30% | 10-12% | 10-12% |
| GPU使用率 | 0% | 1-5% | 1-5% |
| GPUメモリ | 0MB | 272MB | 330MB |
| 圧縮効率 | 基準 | 基準 | +15-25% |
| 画質 | 高 | 高 | 最高 |
デジタル放送には複数の映像・音声トラックが含まれていることがあります。本機能により、視聴中にリアルタイムでトラックを切り替えることができます。
- チャンネルを選択してストリーミングを開始
- 「ストリーム選択」ボタンをクリック
- ドロップダウンメニューから希望の映像・音声トラックを選択
- 「ストリームを切り替え」ボタンで適用
- 映像ストリーム: 解像度、ビットレート、言語情報を表示
- 音声ストリーム: チャンネル数、サンプリングレート、ビットレート、言語を表示
- 自動選択: デフォルトでは最初のトラックを自動選択
- リアルタイム切り替え: 選択変更時にストリームを再起動して即座に反映
- NHK総合、NHK Eテレ
- 日本テレビ、テレビ朝日、TBS、テレビ東京、フジテレビ
- その他地域局
- NHK BS、NHK BS プレミアム
- BS朝日、BS-TBS、BSテレ東、BSフジ
- BS日テレ、その他専門チャンネル
- CSチャンネルは現在無効化(セグメンテーション違反回避)
- 同時エンコーディング数制限(デフォルト:1)
問題: playlist not ready エラー
# FFmpeg解析時間の調整で解決済み
# analyzeduration: 地上波5秒、BS10秒に最適化問題: Invalid frame dimensions 0x0
# 正常動作: 日本のデジタル放送の初期化時の一時的現象
# 数秒後に正常なエンコーディングが開始されます問題: Docker コンテナが起動しない
# ポート競合確認
docker compose logs
netstat -tlnp | grep :3001# バックエンドログ
docker logs tv-viewer-backend-1 -f
# フロントエンドログ
docker logs tv-viewer-frontend-1 -f
# FFmpegログ(ブラウザ内)
# デバッグモードを有効にして確認詳細な開発履歴と実装ノートは DEVELOPMENT.md を参照してください。
This project is licensed under CC0 (Creative Commons Zero).