> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-docs-hivemind-launch.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 動画をログする

> moviepy を使用して Weave のトレース内の動画データを自動的にログし、UI で再生や分析ができるようにします。

Weave は [`moviepy`](https://zulko.github.io/moviepy/) を使用して動画を自動的にログします。これにより、トレース対象の関数に動画の入力や出力を渡せるようになり、動画データのアップロードと保存は Weave が自動的に処理します。

<Note>
  動画のサポートは現在 Python でのみ利用可能です。
</Note>

<div id="usage-prerequisites">
  ## 使用するための前提条件
</div>

1. `weave` と `moviepy==1.0.3` をインストールします。
2. W\&B アカウントを作成します。

<div id="supported-video-types">
  ## サポートされる動画タイプ
</div>

Weave は、以下のような `moviepy` の動画クリップオブジェクトを認識します。

* 動画ファイルから読み込んだ `VideoFileClip`
* `ImageClip`、`ColorClip`、`TextClip` などのインメモリクリップ

<div id="direct-upload-of-file-based-clips">
  ### ファイルベースのクリップの直接アップロード
</div>

クリップが`VideoFileClip`で、サポート対象の拡張子を持つ有効なファイル名がある場合、Weave はそのファイルを直接アップロードします。

**サポート対象のファイル拡張子:**

* `.mp4`
* `.webm`
* `.gif`

<div id="in-memory-clip-support">
  ### インメモリクリップのサポート
</div>

動画オブジェクトがインメモリの場合 (ディスク上にファイルがない場合) 、Weave はそれを `.mp4` ファイルとしてエンコードし、自動的にアップロードします。これは、次のタイプのクリップに適用されます。

* `ImageClip`
* `ColorClip`
* `TextClip`

<div id="example-trace-a-video-function">
  ## 例: 動画処理関数をトレースする
</div>

以下のコードサンプルは、Weave で動画処理関数をトレースする方法を示します。このコードサンプルでは、次のことを行います。

1. Weave プロジェクト `video-test` を初期化します。
2. `get_video` 関数を `weave.op` としてトラッキングし、読み込んだ `VideoFileClip` から 1 秒間のサブクリップを `VideoClip` として抽出するように定義します。
3. クリップを Weave にアップロードしてトラッキングします。
4. 動画が見つからない場合は、ダミーの MP4 動画を自動的に生成します。

<Warning>
  スレッドセーフティの問題を避けるため、`VideoFileClip` オブジェクトは Weave の `op` の外で作成せず、必ずそのパスを渡してください。
</Warning>

以下のコードスニペットを使用する前に、[利用の前提条件](#usage-prerequisites)を完了してください。

```python lines theme={null}
import os
import weave
from moviepy.editor import VideoFileClip, ColorClip, VideoClip

# プロジェクト名を更新するか、'video-test' という名前の新しいプロジェクトを作成してください
weave.init('video-test')

@weave.op
def get_video(clip: VideoFileClip) -> VideoClip:
    """クリップを直接渡すのではなく、パスを使用してビデオを処理します。

    これにより、VideoFileClip が Weave op のスレッドコンテキスト内で
    作成・管理され、スレッドセーフティの問題を回避できます。
    """
    new_clip = clip.subclip(0, 1)
    return new_clip

if __name__ == "__main__":
    os.makedirs("videos", exist_ok=True)

    # MP4 ファイルを指すようにパスを更新してください
    video_path = './videos/example.mp4'

    # ファイルが存在しない場合はダミー動画を生成する
    # ダミー動画の内容: 5秒間表示される赤い正方形
    if not os.path.isfile(video_path):
        print("動画が見つかりません。ダミー動画を作成しています...")
        dummy_clip = ColorClip(size=(640, 480), color=(255, 0, 0), duration=5)
        dummy_clip.write_videofile(video_path, fps=24)

    clip = VideoFileClip(video_path, has_mask=False, audio=True)
    get_video(clip) 
```

コードサンプルが正常に実行されると、プロジェクトの**トレース**表にあるリンクをクリックして、動画を表示できます。

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-docs-hivemind-launch/IJ5wvwHtTZtWc35M/weave/guides/tracking/imgs/video-trace.png?fit=max&auto=format&n=IJ5wvwHtTZtWc35M&q=85&s=0070bfcc205eca3932b5590ddc12af4e" alt="トレース表内の動画処理関数のトレース。" width="2766" height="582" data-path="weave/guides/tracking/imgs/video-trace.png" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/wb-21fd5541-docs-hivemind-launch/IJ5wvwHtTZtWc35M/weave/guides/tracking/imgs/video-trace-popout.png?fit=max&auto=format&n=IJ5wvwHtTZtWc35M&q=85&s=ceda02efaa00c4488bea848927c6f317" alt="Weave にアップロードされ、トレースのポップアウトで表示された MP4 動画。" width="720" height="323" data-path="weave/guides/tracking/imgs/video-trace-popout.png" />
</Frame>
