Skip to main content

Raw audio/video player for Python

Project description

raw-player

PyPI image License Actions status

About Shiguredo's open source software

We will not respond to PRs or issues that have not been discussed on Discord. Also, Discord is only available in Japanese.

Please read https://github.com/shiguredo/oss/blob/master/README.en.md before use.

時雨堂のオープンソースソフトウェアについて

利用前に https://github.com/shiguredo/oss をお読みください。

raw-player について

[!WARNING] raw-player は破壊的変更を伴う可能性のある開発段階のソフトウェアです。 そのため、 API は予告なく変更される可能性があります。

numpy.ndarray 形式で渡された生の映像・音声データを再生する Python ライブラリです。

PCM / I420 / NV12 データを PTS (Presentation Timestamp) に基づいて音声と映像を同期しながら再生します。

https://github.com/user-attachments/assets/cdbb5b95-dbb7-4088-a842-0c66830e2a25

特徴

  • 生の音声/映像入力データをそのまま再生できる
  • 入力データに numpy.ndarray を採用
  • 音声フォーマットは PCM (int16 / float32) に対応
  • 映像フォーマットは I420 (YUV420P) / NV12 に対応
  • PTS ベース音声をマスタークロックとした映像同期機能
  • GPU レンダリング
    • macOS: Metal
    • Windows: Vulkan / Direct3D 12
    • Linux: Vulkan

対応プラットフォーム

  • macOS 26 arm64
  • macOS 15 arm64
  • Ubuntu 24.04 x86_64
  • Ubuntu 24.04 arm64
  • Windows 11 x86_64

対応 Python

  • 3.14
  • 3.13
  • 3.12

インストール

uv add raw-player

使い方

音声再生

import numpy as np
import raw_player as rp

player = rp.AudioPlayer()

# 440Hz のサイン波を生成
sample_rate = 48000
duration = 2.0
t = np.linspace(0, duration, int(sample_rate * duration), dtype=np.float32)
mono = 0.3 * np.sin(2 * np.pi * 440.0 * t)

# ステレオに変換(shape: (frames, channels))
stereo = np.column_stack([mono, mono])

# PTS とサンプルレートを指定してキューに追加
player.enqueue_audio(stereo, pts_us=0, sample_rate=sample_rate)
player.play()

I420 (YUV420P) 再生

import numpy as np
import raw_player as rp

# ウィンドウサイズとタイトルを指定して作成
player = rp.VideoPlayer(width=1920, height=1080, title="I420 Player")

# Y, U, V プレーンを用意
# Y: (H, W), U: (H/2, W/2), V: (H/2, W/2)
y_plane = np.zeros((1080, 1920), dtype=np.uint8)
u_plane = np.zeros((540, 960), dtype=np.uint8)
v_plane = np.zeros((540, 960), dtype=np.uint8)

# PTS(マイクロ秒)を指定してキューに追加
player.enqueue_video_i420(y_plane, u_plane, v_plane, pts_us=0)
player.play()

while player.is_open:
    # イベント処理とフレームレンダリング
    if not player.poll_events():
        break

player.close()

NV12 再生

import numpy as np
import raw_player as rp

player = rp.VideoPlayer(width=1920, height=1080, title="NV12 Player")

# Y プレーンと UV インターリーブプレーンを用意
# Y: (H, W), UV: (H/2, W)
y_plane = np.zeros((1080, 1920), dtype=np.uint8)
uv_plane = np.zeros((540, 1920), dtype=np.uint8)

# PTS(マイクロ秒)を指定してキューに追加
player.enqueue_video_nv12(y_plane, uv_plane, pts_us=0)
player.play()

while player.is_open:
    if not player.poll_events():
        break

player.close()

PTS ベースの AV 同期再生

import numpy as np
import raw_player as rp

# 映像と音声を統合したプレイヤー
player = rp.VideoPlayer(width=1920, height=1080, title="AV Sync Player")

# 映像フレームをキューに追加(I420 形式)
player.enqueue_video_i420(y_plane, u_plane, v_plane, pts_us=0)

# 音声データをキューに追加
# pcm: int16 または float32、shape: (frames,) または (frames, channels)
player.enqueue_audio(audio_data, pts_us=0, sample_rate=48000)

player.play()

while player.is_open:
    if not player.poll_events():
        break
    # poll_events() が音声 PTS に基づいて適切なフレームを自動描画

player.close()

フォーマット変換

I420 / NV12 フォーマットへの変換には webcodecs-py を使用する。

BGRA から I420 への変換

import numpy as np
from webcodecs import VideoFrame, VideoPixelFormat

def bgra_to_i420(
    bgra: np.ndarray,
    width: int,
    height: int,
    timestamp_us: int = 0,
) -> VideoFrame:
    """
    BGRA (H, W, 4) を I420 形式の VideoFrame に変換する。

    Args:
        bgra: BGRA 画像データ
        width: 画像幅
        height: 画像高さ
        timestamp_us: タイムスタンプ(マイクロ秒)

    Returns:
        I420 形式の VideoFrame
    """
    # BGRA で VideoFrame を作成
    bgra_frame = VideoFrame(
        bgra.flatten(),
        {
            "format": VideoPixelFormat.BGRA,
            "coded_width": width,
            "coded_height": height,
            "timestamp": timestamp_us,
        },
    )

    # I420 用のバッファを確保
    i420_size = bgra_frame.allocation_size({"format": VideoPixelFormat.I420})
    i420_data = np.zeros(i420_size, dtype=np.uint8)

    # I420 フォーマットでコピー
    bgra_frame.copy_to(i420_data, {"format": VideoPixelFormat.I420})
    bgra_frame.close()

    # VideoFrame を I420 で作成
    return VideoFrame(
        i420_data,
        {
            "format": VideoPixelFormat.I420,
            "coded_width": width,
            "coded_height": height,
            "timestamp": timestamp_us,
        },
    )

VideoFrame から Y, U, V プレーンを取得

# I420 VideoFrame から各プレーンを取得
video_frame = bgra_to_i420(bgra_data, width, height, pts_us)
y_plane, u_plane, v_plane = video_frame.planes()

# raw-player に enqueue
player.enqueue_video_i420(y_plane, u_plane, v_plane, pts_us)
video_frame.close()

NV12 VideoFrame から Y, UV プレーンを取得

# デコーダから NV12 形式で出力された場合
# NV12: Y プレーン (plane 0) + UV インターリーブ (plane 1)
y_plane = decoded_frame.plane(0)
uv_plane = decoded_frame.plane(1)

# raw-player に enqueue
player.enqueue_video_nv12(y_plane, uv_plane, decoded_frame.timestamp)
decoded_frame.close()

API リファレンス

AudioPlayer

独立した音声再生用クラス。

player = AudioPlayer()
メソッド 説明
enqueue_audio(pcm, pts_us, sample_rate) 音声データをキューに追加
play() 再生開始/再開
pause() 一時停止
stop() 停止してキューをクリア
stats() 統計情報を取得
プロパティ 説明
is_playing 再生中かどうか
volume 音量(0.0〜1.0)

enqueue_audio の引数

  • pcm: 音声データ(int16 または float32 の numpy 配列)
    • 1D: (frames,) モノラル
    • 2D: (frames, channels) マルチチャンネル
  • pts_us: PTS(マイクロ秒)
  • sample_rate: サンプルレート(Hz)

VideoPlayer

映像再生用クラス。音声も統合可能。

player = VideoPlayer(width=960, height=540, title="Raw Player")
メソッド 説明
enqueue_video_i420(y, u, v, pts_us) I420 フレームをキューに追加
enqueue_video_nv12(y, uv, pts_us) NV12 フレームをキューに追加
enqueue_audio(pcm, pts_us, sample_rate) 音声データをキューに追加
play() 再生開始
pause() 一時停止
stop() 停止してキューをクリア
close() リソースを解放
poll_events() イベント処理とフレーム描画(閉じられたら False)
set_key_callback(callback) キーイベントコールバックを設定
stats() 統計情報を取得
プロパティ 説明
is_open ウィンドウが開いているか
is_playing 再生中か
width ウィンドウ幅
height ウィンドウ高さ
title ウィンドウタイトル(読み書き可)
renderer_name GPU レンダラー名(metal, vulkan など)
volume 音量(0.0〜1.0)

enqueue_video_i420 の引数

  • y: Y プレーン(uint8、shape: (H, W)
  • u: U プレーン(uint8、shape: (H/2, W/2)
  • v: V プレーン(uint8、shape: (H/2, W/2)
  • pts_us: PTS(マイクロ秒)

enqueue_video_nv12 の引数

  • y: Y プレーン(uint8、shape: (H, W)
  • uv: UV インターリーブプレーン(uint8、shape: (H/2, W)
  • pts_us: PTS(マイクロ秒)

stats() の戻り値

{
    "video_queue_size": int,      # 映像キュー内のフレーム数
    "audio_queue_ms": float,      # 音声キューの長さ(ミリ秒)
    "dropped_frames": int,        # ドロップしたフレーム数
    "repeated_frames": int,       # 繰り返したフレーム数
    "video_pts_us": int,          # 最後に描画した映像の PTS
    "audio_pts_us": int,          # 現在の音声再生位置
    "sync_diff_us": int,          # 音声と映像の差
    "current_video_width": int,   # 現在の映像幅
    "current_video_height": int,  # 現在の映像高さ
    "current_fps": float,         # 現在の FPS
    "total_frames_enqueued": int, # エンキューしたフレーム総数
    "total_frames_rendered": int, # レンダリングしたフレーム総数
    "video_buffer_ms": float,     # 映像バッファ時間(ミリ秒)
    "elapsed_time_ms": float,     # 経過時間(ミリ秒)
    "video_bitrate_kbps": float,  # 映像ビットレート(kbps)
}

モジュール関数

システム情報を取得するためのモジュールレベル関数。

関数 説明
get_version() SDL のバージョン文字列を取得
get_audio_driver() 現在の音声ドライバー名を取得
get_video_driver() 現在の映像ドライバー名を取得
get_gpu_driver() プライマリ GPU ドライバー名を取得(metal, vulkan, d3d12 など)
get_num_gpu_drivers() 利用可能な GPU ドライバーの数を取得
get_all_gpu_drivers() 利用可能な全ての GPU ドライバー名をリストで取得

使用例

from raw_player import (
    get_version,
    get_audio_driver,
    get_video_driver,
    get_gpu_driver,
    get_all_gpu_drivers,
)

# SDL バージョンを表示
print(f"SDL Version: {get_version()}")

# ドライバー情報を表示
print(f"Audio Driver: {get_audio_driver()}")
print(f"Video Driver: {get_video_driver()}")
print(f"GPU Driver: {get_gpu_driver()}")

# 利用可能な全ての GPU ドライバーを表示
print(f"Available GPU Drivers: {get_all_gpu_drivers()}")

Simple DirectMedia Layer ライセンス

Zlib license

https://github.com/libsdl-org/SDL/blob/main/LICENSE.txt

Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
  
This software is provided 'as-is', without any express or implied
warranty.  In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
  
1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required. 
2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

raw-player ライセンス

Apache License 2.0

Copyright 2025-2025, Shiguredo Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

raw_player-2025.1.0.dev0-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

raw_player-2025.1.0.dev0-cp314-cp314-manylinux_2_34_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

raw_player-2025.1.0.dev0-cp314-cp314-manylinux_2_34_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ ARM64

raw_player-2025.1.0.dev0-cp314-cp314-macosx_15_0_arm64.whl (930.2 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

raw_player-2025.1.0.dev0-cp313-cp313-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.13Windows x86-64

raw_player-2025.1.0.dev0-cp313-cp313-manylinux_2_34_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

raw_player-2025.1.0.dev0-cp313-cp313-manylinux_2_34_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

raw_player-2025.1.0.dev0-cp313-cp313-macosx_15_0_arm64.whl (930.4 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

raw_player-2025.1.0.dev0-cp312-cp312-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.12Windows x86-64

raw_player-2025.1.0.dev0-cp312-cp312-manylinux_2_34_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

raw_player-2025.1.0.dev0-cp312-cp312-manylinux_2_34_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

raw_player-2025.1.0.dev0-cp312-cp312-macosx_15_0_arm64.whl (930.3 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

File details

Details for the file raw_player-2025.1.0.dev0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ade702d16498ab0ce9085888e02277557b085bb7e7ed30b2a63a7992f5135de3
MD5 60b05df6a5b59914370c7fef8b6b1347
BLAKE2b-256 328237f47605a14a5c0b0804569acf0b4f550eeba0f98705061024d595295e82

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp314-cp314-win_amd64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 4977152d86c02c163bc9d4ceb6c909490c4312a9c71da89fc879facdc734db1d
MD5 857872c30c3838b734d5267ed761bc64
BLAKE2b-256 84002ccead2d354c4499071ad591587aa4ff7d6e36b38a151deea24d424d12a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp314-cp314-manylinux_2_34_x86_64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp314-cp314-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp314-cp314-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 9ea3a4f4894103a4e76a82382b683243aebf7d789058ff84454bc0043a0943e4
MD5 8532046928d6d2ac3c4f87287c2ac26e
BLAKE2b-256 73b939a974802b800afabe76a08fc585bef9d7a5fb60fa97040e994185cf2cb0

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp314-cp314-manylinux_2_34_aarch64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d809684b42dc02f51d7ca9b0ff30d2c1dcc4225248c4dc3f76c8e304d8e9a1d1
MD5 164fa7c01c11bc23cb1385131e0d8a82
BLAKE2b-256 be53263e0f876202b38f12c13b2eff3e74129822773badf6617eb95eac505522

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp314-cp314-macosx_15_0_arm64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 654c2729bb69cdef82a0ebadb71799b9275a9d38c3636d1e1f9a2737b29faaad
MD5 af1d8de8cf7e1104cc68098bc80ad768
BLAKE2b-256 d5137d334d8703f4c59f02f201018a11fa6c84e22c92bad0e530d1c6b204e76c

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp313-cp313-win_amd64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ddd855391258b24f92da296a074baed0e8317f58c1f6e0e8bbde821e62362e37
MD5 81df8867b284a2e8ae9f20bffd27ffc8
BLAKE2b-256 a1e4b2ccbd1bfb3f8343a5e5f84a8d9f286e27d1311a5e9202b1c1e0a2f0d973

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp313-cp313-manylinux_2_34_x86_64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp313-cp313-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 82d791dba15f43cd162905bce78c5fa15070ce0590136a4e65cf60c1fa2b1d7e
MD5 3e99d3f833f93867302485f25a5ccfd4
BLAKE2b-256 0e0c9950ec9a4b9d837791756e627b48b5421ecc57891c02aa966a9f94829c42

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp313-cp313-manylinux_2_34_aarch64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 9d2faa798150aef1ec0ac8870e3419ed04c23a5e1bea26f3905253ecef79eb78
MD5 0d2cce911545afae40d3d1e74bb747f4
BLAKE2b-256 987a5f1faa33e091453c0765bd8b932f6dc1de631102c29373e65434798e7603

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp313-cp313-macosx_15_0_arm64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 633d0527b9a04be6228fe8e4a3fa4bffca6b9e4bbd9b8f8a6cf9c028624c3a64
MD5 ceeffb48ab18ef4d0028865bfd858ef8
BLAKE2b-256 4b4b5e3ac78c2220ca8b292ff269ae75626194d5801040abc5c38c1006bedfdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp312-cp312-win_amd64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8917abe59d8f08cf66334aa9ff6027d70577d47298924464c565ece321d490de
MD5 029b234359c82e1de7110ed55b05166f
BLAKE2b-256 be1c103cee9f20530ff79d343dde99d3be98bb27720c294a835905de1dfe2300

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp312-cp312-manylinux_2_34_x86_64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp312-cp312-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 eacfbe0bacb06c3bc8fcdfb29d6e20c8ff2c487d1bc06bf22149c80d1919cbbf
MD5 b8f92cbea1b5a86e5266e04dbcef8b46
BLAKE2b-256 d33fff4607b5c6f6aca461d5426f3558ba8a682fac3fe6a150422280e288a660

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp312-cp312-manylinux_2_34_aarch64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raw_player-2025.1.0.dev0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for raw_player-2025.1.0.dev0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d464c269be56c6c974b9c06cc43258007bed40e4b27cab9599fc57992bed9ff6
MD5 158d2cd1494b67a7287b8076fbd55825
BLAKE2b-256 f90045a4c1ffba9fb0e968c8666918219f41cc881632f0e27aac9ed91e3d115c

See more details on using hashes here.

Provenance

The following attestation bundles were made for raw_player-2025.1.0.dev0-cp312-cp312-macosx_15_0_arm64.whl:

Publisher: wheel.yml on shiguredo/raw-player

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page