Raspberry Pi 5でHDMIキャプチャを行い、動画をリアルタイムでOneDriveにアップロードする方法

---

この記事では **Raspberry Pi 5** でUSB3.0接続のHDMIキャプチャーデバイスを使い、キャプチャした動画を **OneDrive** にリアルタイム（または準リアルタイム）でアップロード・保存する方法を詳しく解説します。HDMI映像だけでなく音声も含めた録画が可能です。定点観測やプレゼン録画など、さまざまな用途で活用していただけます。

---

## 接続図

以下は、ソース機器（PCやゲーム機など）からのHDMI信号をキャプチャデバイスで取り込み、Raspberry Pi 5で録画・アップロードする際の接続イメージ図です。

```mermaid
flowchart LR
    A[HDMI出力機器] -- HDMI<br>ケーブル --> B[HDMI<br>キャプチャー<br>デバイス] 
    B -- USB3.0 --> C[Raspberry Pi 5]

    B -- HDMI<br>パススルー--> D[モニター]
    
    C --LAN or <br>Wi-Fi--> E[(インターネット)]
    E --Cloud Sync--> F[OneDrive]
```

- **ソース機器**: PCやゲーム機、カメラなどのHDMI出力先  
- **HDMIキャプチャーデバイス**: HDMI信号を USB3.0 経由で Raspberry Pi 5 に取り込む  
- **パススルー**: キャプチャしながらモニタなどにも映像を出力できる機能 (機器による)  
- **Raspberry Pi 5**: キャプチャした映像を `ffmpeg` 等で録画し、`rclone` を使ってOneDriveへ自動アップロード  
- **OneDrive**: クラウド上に動画を保存・バックアップ

---

## 1. 概要

- **対象**  
  - Raspberry Pi 5 を使ってHDMI入力（映像・音声）をキャプチャ・録画したい  
  - その動画をクラウド(OneDriveなど)に自動的にアップロード・同期したい

- **前提**  
  - Raspberry Pi OS (64bit版) の最新バージョンがインストール済み  
  - HDMIキャプチャデバイスがUVC (USB Video Class) 対応であること  
  - インターネット回線のアップロード速度がある程度確保できること (動画はサイズが大きくなりがち)

**注意**: Raspberry Pi 5は比較的高性能とはいえ、フルHD映像の長時間録画やエンコードでCPU使用率が高くなります。**ヒートシンクやファンでの冷却対策を推奨**します。

---

## 2. 必要なもの

1. **Raspberry Pi 5本体**  
   - USB3.0ポートを活用してHDMIキャプチャデバイスを接続

2. **HDMIキャプチャデバイス**  
   - 多くのUSB3.0対応HDMIキャプチャデバイスはUVC準拠で、Raspberry Pi OS 上でドライバなしでも認識されやすい  
   - フルHD(1080p/30fps)が要件なら、4K対応品でなくても十分  

3. **録画用ストレージ**  
   - 録画ファイルは大容量になりやすい  
   - MicroSDカードだけでなく、外付けSSDやUSB-HDDなどを検討すると安心（SDカード寿命対策にもなる）

4. **ソフトウェア**  
   - `ffmpeg` : 音声・映像のキャプチャ・エンコード用  
   - `v4l2-utils` : Video4Linux2デバイスを扱うためのユーティリティ（認識確認など）  
   - `rclone` : OneDriveなど各種クラウドストレージとのファイル同期用  

### 2.1 ハードウェアエンコードの利用（オプション）
Raspberry Pi 5では、`ffmpeg`のオプションによってはハードウェアエンコード（`h264_v4l2m2m` など）を利用できる場合があります。CPU負荷が下がる利点もあるので、必要に応じて下記のように試してみると良いでしょう。

```bash
ffmpeg -f v4l2 -framerate 30 -video_size 1920x1080 -i /dev/video0 \
       -f alsa -i hw:1 \
       -c:v h264_v4l2m2m -b:v 4M \
       -c:a aac -b:a 128k \
       output_hwencode.mp4
```

ただし、ハードウェアエンコードの制約や対応状況は環境によって異なるため、うまくいかない場合は従来の `libx264` ソフトウェアエンコードを使用してください。

---

## 3. Raspberry Pi側の事前準備

### 3.1 システムアップデート & 必要パッケージのインストール

```bash
sudo apt update
sudo apt upgrade -y
sudo apt install -y ffmpeg v4l-utils rclone
```

- `ffmpeg` : 動画キャプチャやエンコード  
- `v4l2-utils` : キャプチャデバイスの認識・設定を確認  
- `rclone` : クラウドストレージ連携 (OneDriveを含む)

### 3.2 HDMIキャプチャデバイスの認識確認

キャプチャデバイスをRaspberry Pi 5 のUSB3.0ポートに挿し、以下を実行：

```bash
v4l2-ctl --list-devices
```

- `/dev/video0` や `/dev/video1` として表示されれば、システム上で認識されています  
- もし表示されない場合は、キャプチャデバイスがUSB2.0ポートに刺さっていないか、認識されるまで挿し直す、または別ポートを試すなどの対処が必要です

---

## 4. OneDriveとの連携設定 (rclone)

### 4.1 `rclone config` でOneDriveを設定

```bash
rclone config
```

1. **New remote**: `n` を入力して新規リモート追加  
2. リモート名 (例: `onedrive`) を入力  
3. ストレージタイプとして `OneDrive` を選択  
4. ブラウザ認証用URLが表示されるので、指示に従いブラウザからMicrosoftアカウントでログイン → 許可 → 完了  
5. `rclone` が取得したアクセストークンが `~/.config/rclone/rclone.conf` に保存される  

設定が完了すると、以下のようにリモートリストに `onedrive:` が表示されます。

```bash
rclone listremotes
# onedrive:
```

### 4.2 セキュリティ上の注意

- `~/.config/rclone/rclone.conf` には認証トークンが保存されています  
- 他ユーザーから読み取られないようにファイルパーミッションを設定しましょう  
  ```bash
  chmod 600 ~/.config/rclone/rclone.conf
  ```

---

## 5. HDMI映像・音声の録画テスト (ローカル保存)

まずは、OneDrive連携の前にローカルで録画が動作するか確かめます。  
以下はフルHD (1920x1080) を30fps、音声もキャプチャする例です。

```bash
# video0: デバイスパス (環境によって異なる場合は要確認)
# hw:1:   音声デバイスの識別子 (arecord -l や arecord -L で確認し、適宜置き換える)

ffmpeg -f v4l2 -framerate 30 -video_size 1920x1080 -i /dev/video0 \
       -f alsa -i hw:1 \
       -c:v libx264 -preset ultrafast -crf 23 \
       -c:a aac -b:a 128k \
       output.mp4
```

- **`-f v4l2`** : Video4Linux2から映像を取得  
- **`-framerate 30`** : 30fps（必要に応じて15〜60fpsなど調整）  
- **`-video_size 1920x1080`** : フルHD  
- **`-c:v libx264`** : H.264でエンコード（CPU負荷高めだが汎用性が高い）  
- **`-preset ultrafast`** : エンコード速度最優先（ファイルサイズはやや大きめ）  
- **`-crf 23`** : エンコード品質 (数値が小さいほど高品質)  
- **`-c:a aac -b:a 128k`** : 音声をAACで128kbps  

これで録画が開始し、`Ctrl + C` で終了した際に `output.mp4` が生成されます。再生できればキャプチャデバイス・音声ともに問題ありません。

---

## 6. OneDriveへ自動アップロードする仕組み

### 6.1 大まかな流れ

1. **Raspberry Pi上で動画を録画**  
   - ローカルストレージ(例: `/home/pi/videos`)に一時保存  
2. **`rclone` を使って一定間隔でOneDriveにアップロード**  
   - アップロード後、ローカルにあるファイルを削除または移動してストレージを節約  

この方法は「ローカルに一旦保存 → 定期的に同期」という形で、ネットワークが途切れても再開処理がしやすく、安定しやすい利点があります。

### 6.2 録画スクリプト例

以下のように、録画用スクリプトを書きます。連続的に録画したい場合はファイル名にタイムスタンプを付けるのがおすすめです。

```bash
#!/bin/bash

# フォルダ作成(存在しない場合)
mkdir -p /home/pi/videos

# 現在時刻をファイル名に
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# 例: 30分ごとにファイルを分割して録画したい場合は -t 1800 などを付与
ffmpeg -f v4l2 -framerate 30 -video_size 1920x1080 -i /dev/video0 \
       -f alsa -i hw:1 \
       -c:v libx264 -preset ultrafast -crf 23 \
       -c:a aac -b:a 128k \
       /home/pi/videos/output_${TIMESTAMP}.mp4
```

- 長時間1ファイルで録画するとサイズが巨大になるため、`-t 1800` (30分) や `-segment_time` (セグメント録画) などを使って区切ると便利  
- 長時間運用時はCPU負荷が高く、温度管理(ヒートシンク・ファン)が必須

### 6.3 アップロードスクリプト例

次に、保存されたファイルをOneDriveへアップロードするスクリプト例を示します。`rclone move` コマンドを使うと、アップロード完了後にローカルファイルが削除されます。

```bash
#!/bin/bash

# アップロード先のフォルダ名 (OneDrive上)
TARGET="onedrive:MyVideoFolder"

# ローカルの録画ファイルが格納されているパス
LOCAL_DIR="/home/pi/videos"

# 定期的に繰り返す
while true; do
    # move: アップロード完了後にローカルファイルを削除
    # --max-age 1m: 作成or更新されてから1分以内のファイルを対象 (必要に応じて調整)
    # --min-size 1k: 1KB未満の(空の)ファイルは無視
    # --retries 3: 3回リトライする
    # --log-file: ログファイルの出力先
    rclone move "${LOCAL_DIR}" "${TARGET}" \
        --max-age 1m \
        --min-size 1k \
        --retries 3 \
        --log-file /home/pi/rclone_upload.log
    
    # 10秒待ってから再度チェック
    sleep 10
done
```

- `--max-age 1m` は「作成から1分以内のファイル」を対象とする例ですが、録画中のファイルがアップロードされてしまわないように工夫しています  
- ファイルの書き込みが終わる前にアップロードが始まるとエラーになる可能性もあるため、録画完了後にファイル名を変更し、完了済みファイルだけをアップロードするなどの運用も考えられます

---

## 7. 自動起動設定

### 7.1 シェルスクリプトを作成

上記録画とアップロードをまとめたシェルスクリプトを作り、実行権限を付与します。

```bash
chmod +x capture_and_upload.sh
```

スクリプト例（簡略版）:

```bash
#!/bin/bash

# 1) 録画開始(例として無期限の連続録画)
ffmpeg -f v4l2 -framerate 30 -video_size 1920x1080 -i /dev/video0 \
       -f alsa -i hw:1 \
       -c:v libx264 -preset ultrafast -crf 23 \
       -c:a aac -b:a 128k \
       /home/pi/videos/output_$(date +%Y%m%d_%H%M%S).mp4 &

# 2) アップロードのループ
while true; do
    rclone move /home/pi/videos onedrive:MyVideoFolder \
        --retries 3 \
        --log-file /home/pi/rclone_upload.log
    sleep 10
done
```

### 7.2 `crontab` で起動時に自動実行

```bash
crontab -e
```

以下を末尾に追加し、Raspberry Pi 起動時に自動実行するように設定します。

```bash
@reboot /home/pi/capture_and_upload.sh
```

保存して終了すると、次回起動時にスクリプトが自動的に走り出します。

---

## 8. 運用上の注意点

1. **ネットワーク帯域**  
   - フルHD映像を連続録画すると1時間あたり数GBになる場合があります。  
   - アップロード速度が低いとリアルタイムに近い送信が難しくなるため、解像度やフレームレート、`-crf` 値を見直してみてください。

2. **冷却対策**  
   - エンコード処理中はCPU負荷が高く、Raspberry Pi 5 でも温度上昇が顕著です。  
   - 小型ファンやヒートシンクを用意しましょう。

3. **ファイル分割**  
   - 長時間1つのファイルに録画するとサイズが膨大になり、アップロードや編集の手間が増えます。  
   - `-t` (録画時間指定) や `-segment_time`（連続セグメント録画）などでファイルを分割すると便利です。

4. **音声デバイス**  
   - `hw:1` は環境によって異なるため、`arecord -l` や `arecord -L` でデバイスを確認してから設定してください。  
   - もし音声が入らない場合は、別のデバイスID (`hw:2` など) を試すか、キャプチャーデバイスの仕様・音声入力に対応しているかを確認しましょう。

5. **ログの確認**  
   - `rclone` のログ (`/home/pi/rclone_upload.log`) を定期的に確認し、エラーが発生していないかチェックします。  
   - ネットワーク障害やOneDrive側のエラーなどでアップロードが停止していないか注意。

6. **SDカードの書き込み負荷**  
   - 常時録画→アップロードでは書き込みが多く、SDカードの寿命に影響する可能性があります。  
   - 外付けSSDなどの使用を強く推奨します。

---

## 9. HDMIキャプチャーデバイスを使った時の注意事項

HDMIキャプチャーデバイスによっては、**パススルー機能**を備えている場合があります（「Input (キャプチャ用)」と「Output (ディスプレイ出力)」がある製品）。この際、以下の点に留意してください。

### 9.1 ディスプレイ認識（EDID）の扱い

キャプチャーデバイスを介してパススルー接続を行うと、**PCから見たディスプレイ名や解像度情報**は、キャプチャーデバイスがEDID（Extended Display Identification Data）をどう処理するか次第で変わります。

- **モニタのEDIDをそのままパススルーするデバイス**  
  - 実際のモニタ名や最大解像度がPC側に表示される（例：「Samsung ○○」「DELL ○○」など）
- **キャプチャーデバイス独自のEDIDを返すデバイス**  
  - PCから見ると「USB Capture Device」や「Generic Monitor」のような名称になり、解像度・リフレッシュレートが制限されることもある

### 9.2 解像度やリフレッシュレートの制限

- デバイス独自のEDIDを返す場合、**本来のモニタ最大解像度**を認識できずに設定が制限される場合があります。  
- その結果、PC側のディスプレイ設定で選べる解像度が低くなるなど、表示に影響が出る可能性があります。

### 9.3 HDCPや音声の扱い

- **HDCP（著作権保護）**  
  - ソース機器やキャプチャーデバイスがHDCP非対応の場合、映像が表示されなかったり録画できなかったりします。  
- **音声パススルー**  
  - 映像はパススルーできても、音声はキャプチャーデバイス内で別処理となり、ディスプレイ出力に音声が通らないこともあります。  
  - 必要に応じて、キャプチャーデバイスのマニュアルで音声出力を確認してください。

---

## 10. まとめ

- **Raspberry Pi 5 + USB3.0 HDMIキャプチャーデバイス** の組み合わせで、フルHD動画の録画や音声キャプチャが可能  
- `rclone` を利用すれば **OneDrive** (他のクラウドストレージも含む) に自動アップロードできる  
- 運用には **ネットワーク速度**、**冷却対策**、**ストレージ容量** などに注意が必要  
- **パススルー対応のキャプチャーデバイス**を使う場合は、EDIDや音声パススルー、HDCPの可否などの仕様を確認する  

Raspberry Piは小型で省電力かつ常時稼働にも向いており、プレゼンや会議、監視カメラ、オンライン配信のバックアップ用など、さまざまなシーンで応用できます。ぜひ本記事を参考にして環境構築を進めてみてください。

---

### 参考リンク

- [ffmpeg公式ドキュメント](https://ffmpeg.org/documentation.html)  
- [rclone公式サイト](https://rclone.org/)  
- [Video4Linux2 (V4L2) ドキュメント](https://linuxtv.org/downloads/v4l-dvb-apis/)  
- [Microsoft OneDrive 公式ページ](https://onedrive.live.com/about/)  

---

以上