Skip to content

Commit

Permalink
Merge branch 'main' into mediastore-concurrency
Browse files Browse the repository at this point in the history
  • Loading branch information
allenheltondev authored Nov 12, 2024
2 parents 3ff742f + f599460 commit 3b91893
Show file tree
Hide file tree
Showing 24 changed files with 195 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@ keywords:
* **Content delivery network (CDN)** - 地理的に分散されたPoP(Point of Presence)と呼ばれるサーバーにキャッシュすることで、メディアをエンドユーザーに配信し、遅延を減らしてストリーミング・パフォーマンスを向上させる。
* **Media player** - CDNからメディアセグメントを要求し、再生するデバイス(ブラウザ、スマートテレビ、モバイルアプリなど)。

## オリジンとしてのMomento MediaStore
## オリジンとしてのMomento Media Storage

Momento MediaStoreは[ライブストリーミング](/media-storage/streaming/live-streaming/how-it-works)および[ビデオ・オン・デマンド(VOD)](/media-storage/streaming/video-on-demand/media-storage)アプリケーションの要求を満たすように設計された専用高速オリジンです。当社の超低遅延ストレージを活用することで、MediaStoreはコンテンツが常にアクセス可能で、CDNへの配信準備が整っていることを保証し、スムーズで中断のない視聴体験を可能にします。ライブイベントでもオンデマンドコンテンツでも、MediaStoreは卓越したパフォーマンスを維持しながらメディア配信の管理プロセスを簡素化します
Momento Media Storageは[ライブストリーミング](/media-storage/streaming/live-streaming/how-it-works)および[ビデオ・オン・デマンド(VOD)](/media-storage/streaming/video-on-demand/media-storage)アプリケーションの要求を満たすように設計された専用高速オリジンです。当社の超低遅延ストレージを活用することで、Media Storageはコンテンツが常にアクセス可能で、CDNへの配信準備が整っていることを保証し、スムーズで中断のない視聴体験を可能にします。ライブイベントでもオンデマンドコンテンツでも、Media Storageは卓越したパフォーマンスを維持しながらメディア配信の管理プロセスを簡素化します

信頼性はMomentoプラットフォームのすべてのサービスの中核であり、MediaStoreも例外ではありません。MediaStoreは、バッファリングを最小限に抑え、デバイスや場所を問わず、視聴者の[ゼロバッファレート(ZBR)](/media-storage/core-concepts/zero-buffer-rate)を実現します。このプラットフォームは、何百万もの同時リクエストを中断することなく処理し、楽に拡張できるように構築されているため、ライブスポーツのようなトラフィックの多いイベントに最適です。
信頼性はMomentoプラットフォームのすべてのサービスの中核であり、Media Storageも例外ではありません。Media Storageは、バッファリングを最小限に抑え、デバイスや場所を問わず、視聴者の[ゼロバッファレート(ZBR)](/media-storage/core-concepts/zero-buffer-rate)を実現します。このプラットフォームは、何百万もの同時リクエストを中断することなく処理し、楽に拡張できるように構築されているため、ライブスポーツのようなトラフィックの多いイベントに最適です。

開発者に優しいAPIにより、メディアアセットの統合と管理が容易になり、ワークフローの複雑さが軽減されます。サービスの動的な自動スケーリングにより、MediaStoreはトラフィックの急増や停止時にも一貫してコンテンツを配信します。この信頼性とシンプルさの組み合わせは、最新のメディアストリーミングに信頼性が高く使いやすいソリューションを提供します。
開発者に優しいAPIにより、メディアアセットの統合と管理が容易になり、ワークフローの複雑さが軽減されます。サービスの動的な自動スケーリングにより、Media Storageはトラフィックの急増や停止時にも一貫してコンテンツを配信します。この信頼性とシンプルさの組み合わせは、最新のメディアストリーミングに信頼性が高く使いやすいソリューションを提供します。
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ keywords:
* **Manifest** - さまざまなビットレートと解像度ですべてのセグメントを参照するプレイリスト(マニフェスト)が作成され、ネットワーク条件と希望する結果とビットレートに基づいて、次にどのセグメントをダウンロードするかをプレーヤーにガイドします。
* **Origin** - CDNによる検索のためにセグメントとマニフェストを保存する。

## Momento MediaStoreとセグメント
## Momento Media Storageとセグメント

Momento MediaStoreは、セグメントを保存し、光速のパフォーマンスと低いエラー率で配信します。当社のプラットフォームは、[ライブストリーミング](/media-storage/streaming/live-streaming/how-it-works)[ビデオオンデマンド(VOD)](/media-storage/streaming/video-on-demand/media-storage)の両方のユースケースに最適化されており、メディアセグメントを確実に高速検索してCDNに配信します。当社の超低遅延ストレージを活用することで、MediaStoreはデバイスや地域を超えた視聴者のシームレスな再生をサポートします
Momento Media Storageは、セグメントを保存し、光速のパフォーマンスと低いエラー率で配信します。当社のプラットフォームは、[ライブストリーミング](/media-storage/streaming/live-streaming/how-it-works)[ビデオオンデマンド(VOD)](/media-storage/streaming/video-on-demand/media-storage)の両方のユースケースに最適化されており、メディアセグメントを確実に高速検索してCDNに配信します。当社の超低遅延ストレージを活用することで、Media Storageはデバイスや地域を超えた視聴者のシームレスな再生をサポートします

Momento MediaStoreを使用すると、セグメントが保存され、迅速に配信されるため、中断の可能性が低くなり、バッファリングが最小限に抑えられます。パフォーマンスを犠牲にすることなく高トラフィックイベントを処理できるため、大量の需要がある場合でも、セグメントをエラーなく確実に配信し、エラーのないスムーズなストリーミング体験に貢献します。
Momento Media Storageを使用すると、セグメントが保存され、迅速に配信されるため、中断の可能性が低くなり、バッファリングが最小限に抑えられます。パフォーマンスを犠牲にすることなく高トラフィックイベントを処理できるため、大量の需要がある場合でも、セグメントをエラーなく確実に配信し、エラーのないスムーズなストリーミング体験に貢献します。
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ keywords:

Momentoは、**イン・メモリ・アーキテクチャ****低テール・レイテンシ**により、ZBRを改善します。高速で信頼性の高いオリジンとして、Momento は動画セグメントを迅速に配信し、バッファリングのリスクを低減します。このプラットフォームの細かく調整されたアーキテクチャは、セグメント配信時間を最小化し、プレーヤーが中断のない再生に不可欠な完全なルックアヘッド・バッファを維持できるようにします。

低レイテンシー配信に加え、Momentoのアーキテクチャはエラー率を低減し、セグメント配信を遅らせる可能性のある書き込み失敗や再試行の可能性を低減します。エラーの減少とデータ転送の高速化により、MomentoはZBRを大幅に改善します。従来のオブジェクトストアに比べて100倍も速いテールレイテンシーで、Momento MediaStoreは、ハイデマンドシーンでも、すべての視聴者にスムーズで一貫性のあるストリーミングを提供します。
低レイテンシー配信に加え、Momentoのアーキテクチャはエラー率を低減し、セグメント配信を遅らせる可能性のある書き込み失敗や再試行の可能性を低減します。エラーの減少とデータ転送の高速化により、MomentoはZBRを大幅に改善します。従来のオブジェクトストアに比べて100倍も速いテールレイテンシーで、Momento Media Storageは、ハイデマンドシーンでも、すべての視聴者にスムーズで一貫性のあるストリーミングを提供します。

オリジンが遅いとボトルネックが発生し、プレーヤーが新しいセグメントのロードを待つ間にバッファリングが発生し、最終的に ZBR が低下します。Momentoでは、このようなリスクを最小限に抑え、視聴者を飽きさせないシームレスでバッファのない視聴体験を提供します。
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ keywords:
- reactions
---

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

# ビデオストリームにリアルタイムの絵文字リアクションを追加する

視聴者の体験において、インタラクティブ性は重要な役割を果たしています。リアクションを送ったり、他の視聴者と感情を共有したりすることで、メディアストリーミングだけでは得られないコミュニティ感やエンゲージメントが生まれます。このチュートリアルでは、動画プレーヤにリアルタイムの絵文字オーバーレイを設定します。Momento Topics** を使用すると、ユーザーとのインタラクションに応じて絵文字のリアクションが即座に表示されるため、生き生きとした魅力的な視聴体験が可能になります。
Expand Down Expand Up @@ -54,7 +57,10 @@ Momento Topicsによって呼び出されたブラウザのイベントハンド

## Step 1: トークン発行機の作成

動画プレーヤが絵文字を公開および受信するには、Momento トピックへのアクセスが必要です。アクセスを許可するには、セッション トークンを生成して呼び出し元に返す必要があります。これを行うには、`POST /tokens` エンドポイントを持つ単純な [Express サーバ](https://expressjs.com/) を作成します。
動画プレーヤが絵文字を公開および受信するには、Momento トピックへのアクセスが必要です。アクセスを許可するには、セッション トークンを生成して呼び出し元に返す必要があります。これを行うには、`POST /tokens` エンドポイントを持つ単純な Web サーバーを作成します。

<Tabs>
<TabItem value="node" label="Node.js">

```javascript
import express from 'express';
Expand All @@ -79,6 +85,156 @@ app.post('/tokens', (req, res) => {
});
```

</TabItem>
<TabItem value="go" label="Go">

```go
package main

import (
"context"
"encoding/json"
"log"
"net/http"
"time"

"github.com/gorilla/mux"
"github.com/momentohq/client-sdk-go/auth"
"github.com/momentohq/client-sdk-go/config"
"github.com/momentohq/client-sdk-go/momento"
auth_resp "github.com/momentohq/client-sdk-go/responses/auth"
"github.com/momentohq/client-sdk-go/utils"
)

var (
ctx context.Context
authClient momento.AuthClient
)

type TokenRequest struct {
PlayerID string `json:"playerId"`
StreamID string `json:"streamId"`
}

type TokenResponse struct {
Token string `json:"token"`
}

func generateTokenHandler(w http.ResponseWriter, r *http.Request) {
var req TokenRequest
err := json.NewDecoder(r.Body).Decode(&req)
if err != nil {
http.Error(w, "Invalid request payload", http.StatusBadRequest)
return
}

credentialProvider, err := auth.NewEnvMomentoTokenProvider("MOMENTO_API_KEY")
if err != nil {
panic(err)
}

authClient, err = momento.NewAuthClient(config.AuthDefault(), credentialProvider)
if err != nil {
panic(err)
}

resp, err := authClient.GenerateDisposableToken(ctx, &momento.GenerateDisposableTokenRequest{
ExpiresIn: utils.ExpiresInMinutes(30),
Scope: momento.TopicSubscribeOnly(
momento.CacheName{Name: "video"},
momento.TopicName{Name: req.StreamID},
),
Props: momento.DisposableTokenProps{
TokenId: &req.PlayerID,
},
})

if err != nil {
http.Error(w, "Failed to generate token", http.StatusInternalServerError)
return
}

switch r := resp.(type) {
case *auth_resp.GenerateDisposableTokenSuccess:
res := TokenResponse{Token: r.ApiKey}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(res)
default:
http.Error(w, "Failed to generate token", http.StatusInternalServerError)
}
}

func main() {
ctx = context.Background()

r := mux.NewRouter()
r.HandleFunc("/tokens", generateTokenHandler).Methods("POST")

srv := &http.Server{
Handler: r,
Addr: ":8080",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}

log.Println("Server is running on port 8080")
log.Fatal(srv.ListenAndServe())
}

```

</TabItem>
<TabItem value="dotnet" label=".NET">

```csharp
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Momento.Sdk;
using Momento.Sdk.Auth;
using Momento.Sdk.Config;
using Momento.Sdk.Auth.AccessControl;
using Momento.Sdk.Responses;
using System;
using System.Threading.Tasks;

[ApiController]
[Route("api/[controller]")]
public class TokenController : ControllerBase
{
private readonly Momento.AuthClient _authClient;

public TokenController(IConfiguration configuration)
{
_authClient = configuration.AuthClient;
}

[HttpPost]
[Route("tokens")]
public async Task<IActionResult> GenerateToken([FromBody] TokenRequest request)
{
try
{
var response = await _authClient.GenerateDispableTokenAsync(
DisposableTokenScopes.TopicPublishSubscribe("video", request.StreamId),
ExpiresIn.Minutes(30)
)

return Created("", new TokenResponse { Token = response.AuthToken });
}
catch (Exception ex)
{
Console.WriteLine($"Error generating token: {ex.Message}");
return StatusCode(500, "Failed to generate token");
}
}
}

```

</TabItem>
</Tabs>

ここで作成したエンドポイントは、`playerId``streamId` プロパティを含むリクエストボディを受け付けます。streamId` は、視聴する動画ストリームの一意な識別子です。これは、リアクションのスコープをリクエストされた動画*に限定するために使用されます。`playerId` は呼び出し元の識別子です。Momento のベストプラクティスでは、*常にセッション トークンに発信者の識別子を含めるように*言われています。私たちは `playerId` を直接埋め込んだトークンを作成しており、このトークンはユーザーが公開するすべてのメッセージに適用されます。

:::tip
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ keywords:
- entitlements
---

# Momento MediaStoreのエンタイトルメント
# Momento Media Storageのエンタイトルメント

エンタイトルメントとは、サブスクリプション、地域、視聴権に基づいてユーザがアクセスできるコンテンツを制御する認可メカニズムです。エンタイトルメントを効率的に管理することで、**セキュア****パーソナライズ****オーソライズ**された**コンテンツ配信が可能になります。Momentoは、リアルタイムで動的にエンタイトルメントを管理、配布、実施する低レイテンシーでスケーラブルなパターンを実装し、権利とアクセスを保護しながらスムーズなコンテンツ配信を実現します。

Expand Down Expand Up @@ -55,7 +55,7 @@ keywords:

ライブイベントや、視聴後に視聴期限が切れるペイ・パー・ビューなど、期間限定で利用できるコンテンツもあります。

## Momento MediaStoreでエンタイトルメントを効率的に管理
## Momento Media Storageでエンタイトルメントを効率的に管理

特に、ユーザーデータ、ロケーション、デバイス、およびコンテンツメタデータに依存する複雑なロジックを含む場合、エンタイトルメントチェックは、多くの場合、リソースを消費します。Momentoを使用すると、エンタイトルメントデータをキャッシュし、最小限の遅延でリアルタイムの権限チェックを処理することにより、このオーバーヘッドを劇的に削減できます。

Expand Down Expand Up @@ -143,13 +143,13 @@ return canView;

エンタイトルメントにアプローチするもう一つの方法は、コンテンツへのアクセスを[session tokens](/cache/develop/authentication/tokens)に直接埋め込むことです。エンタイトルメントの計算が完了し、ユーザーがアクセスできるメディアのリストがわかったら、短命のトークンを使ってコンテンツへの明示的なアクセスを許可できます。

Momento MediaStoreが[メディアオリジン](/media-storage/core-concepts/origin)として使用されている場合、要求に応じてコンテンツへのアクセスを制限するために、きめ細かいアクセス制御を使用することができます。
Momento Media Storageが[メディアオリジン](/media-storage/core-concepts/origin)として使用されている場合、要求に応じてコンテンツへのアクセスを制限するために、きめ細かいアクセス制御を使用することができます。

:::warning
メディアを配信するためにCDNを使用する場合、このアプローチは機能しません。このソリューションは、Momentoから直接コンテンツを取得するユースケースのためのものです。MomentoのIntelligent Gatewayは、提供された認証トークンに対してすべての受信リクエストを評価します。CDNは特定の視聴者のトークンをMomentoに転送しないため、この方法は有効ではありません。
:::

コンテンツが以下のような構造でMomento MediaStoreに保存されているとします
コンテンツが以下のような構造でMomento Media Storageに保存されているとします

```text
/{ContentName}/playlist.m3u8
Expand Down
Loading

0 comments on commit 3b91893

Please sign in to comment.