Azure Media Services で Blob からアセットを作成する方法

Azure Media Services (AMS) に既存の Blob ストレージ上のファイルを直接インポートする際、CreateFromBlob メソッドを使用することがある。この処理中に以下のようなエラーが発生することがある:
<?xml version="1.0" encoding="utf-8"?>
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <m:code />
  <m:message xml:lang="en-US">AssetFile ContentFileSize must not be negative</m:message>
</m:error>
このエラーは、Blob のメタデータ(特にサイズ情報)が AMS 側で正しく取得できていないことを示している。根本的な原因は、CloudBlockBlob オブジェクトのプロパティが初期化されていないことにある。 解決策は、Blob 参照を取得した後に FetchAttributes() を呼び出して、Blob の実際のメタデータ(サイズ、コンテンツタイプなど)を明示的に取得することである。 また、ストレージ資格情報(StorageCredentials)には必ずアカウント名とアカウントキーの両方を含める必要がある。SAS トークンのみではこの操作はサポートされない。 以下は、Blob から AMS アセットを作成するための修正済みコード例である:
public string UploadBlobToAsset(string blobUri)
{
    var accountName = ConfigurationManager.AppSettings["StorageAccountName"];
    var accountKey = ConfigurationManager.AppSettings["StorageAccountKey"];

    // Blob URI からコンテナー名と BLOB 名を抽出(環境に応じて調整)
    var uri = new Uri(blobUri);
    var segments = uri.Segments;
    var containerName = segments[1].TrimEnd('/');
    var blobName = segments[2];

    var storageCredentials = new StorageCredentials(accountName, accountKey);
    var blobClient = new CloudBlobClient(uri, storageCredentials);
    var container = blobClient.GetContainerReference(containerName);
    var blockBlob = container.GetBlockBlobReference(blobName);

    // 必須:Blob の属性(特に Length)を取得
    blockBlob.FetchAttributes();

    // AMS コンテキストの初期化(省略)
    InitializeMediaContext();

    // Blob からアセットを作成
    var asset = _mediaContext.Assets.CreateFromBlob(
        blockBlob,
        storageCredentials,
        AssetCreationOptions.None
    );

    // SAS URL を生成して返す
    return GenerateSasUrl(asset);
}
InitializeMediaContext() は Azure AD 認証を使って AMS REST API に接続する標準的な初期化処理を含む。また、GenerateSasUrl はアセットに SAS ロケーターを作成し、MP4 ファイルのダウンロード URL を返すヘルパー関数とする。 注意点として、StorageConnectionString を使わずに、明示的に accountNameaccountKey を AppSettings から読み込む方が安全かつ確実である。接続文字列の解析ミスや権限不足がエラーの原因となることがある。 最後に、HTML のファイルアップロードコントロール経由でファイルを受け取る場合は、サーバー側の一時ディレクトリに保存 → AMS にアップロード → 一時ファイルを削除、というフローが推奨される。ブラウザから直接 Blob URI を渡すことは通常不可能であるため、間接的な処理が必要になる。

タグ: Azure Media Services Blob Storage CloudBlockBlob FetchAttributes StorageCredentials

5月29日 11:46 投稿