今年の最後の週にHabrを見る力を見つけた皆さん、良い一日です! 今回は、クラウドプロバイダーが提供するマルチメディアコンテンツを操作するためのサービスの使用経験を共有したいと思います。 プロセスをさらに面白くするために、Windows Azure Media ServicesとAmazon Elastic Transcoderの2つのクラウドプロバイダーを検討します。 その後、もちろん、それらを比較することを忘れないでください! さあ、行こう!
入力データ
入力ファイルを、720p形式のモバイルデバイス(Android)を使用して撮影したビデオファイルとします。 継続時間は24秒で、サイズは13 MBです。 480p形式に変換したいと思います。
基本インターフェース
そのため、Visual Studioで新しいソリューションを作成します。 クライアントが各クラウドプロバイダーと連携するための基本的な機能を実装する必要があるとします。 たとえば、Windows Azure Media Servicesの使用をAmazon Elastic Transcoderに簡単に置き換えることができます。 したがって、ベースインターフェイスを宣言します。
public interface IVideoConverter
{
void Convert(string sourceFile, string destinationFile);
void UploadFile(string localFile);
void DownloadFile(string localFile);
void WaitForConversionToComplete();
}
このインターフェイスを実装する各クライアントは次のことができる必要があります。
- UploadFile-ローカルストレージからクラウドにファイルをアップロードします。
- DownloadFile-クラウドストレージからローカルにトランスコードされたファイルをダウンロードします。
- 変換-ファイルをある形式から別の形式に実際にトランスコードできます。
- WaitForConversionToComplete-エンコード操作の結果を待ちます。
クライアントと連携する一般的な原則は次のとおりです。
IVideoConverter client = new IVideoConverter();
client.Convert(“___”, “___”);
したがって、擬似コードのConvertメソッドは次のようになります。
public void Convert(string sourceFile, string destinationFile)
{
//
UploadFile(sourceFile);
//
();
//
WaitForConversionToComplete();
//
DownloadFile(destinationFile);
}
Windows Azure Mediaサービス
まず、Windows Azure Media Servicesを操作するクライアントを実装することから始めましょう。 コードの記述を開始する前に、このWindows Azureサービスと連携する新しいエンドポイントを作成する必要があります。 これを行うには、Windows Azure管理ポータルに移動し、[新規作成]-> [App Services]-> [メディアサービス]-> [クイック作成]を選択します。

新しいサービスの名前(名前)、領域(地域)を設定する必要があります。これには、容量、ストレージアカウント(ストレージアカウント)、およびWindows Azure Media Servicesサービスを使用するサブスクリプション(サブスクリプション)が割り当てられます。
ここで、サービスを使用するには、アカウント名とアクセスキーを取得する必要があります。 これを行うには、Windows Azure管理ポータルの[メディアサービス]セクションに移動し、[キーの管理]ボタンをクリックします。

次に、表示されるウィンドウで、アカウント名とプライマリアクセスキーの値をコピーする必要があります。

Windows Azure Media Servicesで動作するクラスの定数にコピーされた値を定義します。
public class MediaServicesClient : IVideoConverter
{
private const string AccountName = "MEDIA_SERVICE_NAME";
private const string AccessKey = "MEDIA_SERVICE_KEY";
}
そのため、対応するクラスのコードを直接記述する前に、Windows Azure Media Services SDKアセンブリを接続する必要があります。 これを行うには、NuGetパッケージマネージャーを使用します。 プロジェクトのコンテキストメニューで、[NuGetパッケージの管理...]を選択します。 適切なパッケージを探してインストールしています。

Windows Azure Media Servicesを操作するための基本オブジェクトはMediaContextです。 Entity FrameworkのDataContextに似ています。 クラスコンストラクターで、AccountNameとAccessKeyを使用して作成します。
public MediaServicesClient()
{
_mediaContext = new CloudMediaContext(AccountName, AccessKey);
}
このオブジェクトにより、Windows Azure Media Servicesが提供するすべてのエンティティを操作できます。
最初に必要なエンティティはメディアプロセッサです。 Windows Azure Media Servicesの処理のために送信するすべてのタスク(タスク)は、特定の種類のプロセッサで処理する必要があります。 すべての可能なプロセッサオプションを
ここに示し
ます 。 Windows Azure Media Encoderに関心があります。 このプロセッサは、ビデオストリームをさまざまな形式でエンコードする役割を直接担います。 対応するプロセッサの領収書をコンストラクタに追加します。
private const string MediaProcessorName = "Windows Azure Media Encoder";
public MediaServicesClient()
{
...
_mediaProcessor = GetMediaProcessor();
}
private IMediaProcessor GetMediaProcessor()
{
return _mediaContext.MediaProcessors.Where
(x => x.Name == MediaProcessorName)
.ToList()
.First();
}
いわゆる資産-プロセッサの入力または出力パラメータとして使用されるエンティティの説明を作成することも必要です。 このオブジェクトには、使用するストレージアカウントへのリンク、処理を目的としたファイルへのリンクなどが保存されます。 そのようなオブジェクトを作成します。 入力パラメーター、つまり、必要な形式でのエンコードを目的としたファイルへのリンクを保存します。
private const string InputAssetName = "MediaServices_InputAsset";
private readonly IAsset _inputAsset;
public MediaServicesClient()
{
...
_inputAsset = CreateInputAsset();
}
private IAsset CreateInputAsset()
{
return _mediaContext.Assets.Create(InputAssetName, AssetCreationOptions.None);
}
すべてのエンコードタスク(タスク)は、ジョブの一部として実行されます。 したがって、このようなオブジェクトを作成する必要があります。
private const string JobName = "MediaServices_Job";
private readonly IJob _job;
_job = CreateEncodingJob();
private IJob CreateEncodingJob()
{
return _mediaContext.Jobs.Create(JobName);
}
最後に、作成したすべてのエンティティを接続する必要があります。 あるビデオを別のビデオにトランスコードするための適切なタスクを作成します。 これを行うには、コーディングのジョブを開始する直前に呼び出される別のメソッドを宣言します。
private const string PresetName = "H264 Broadband SD 16x9";
private void CreateTask()
{
var task = _job.Tasks.AddNew(
TaskName,
_mediaProcessor,
PresetName,
TaskOptions.ProtectedConfiguration);
task.InputAssets.Add(_inputAsset);
task.OutputAssets.AddNew(OutputAssetName, AssetCreationOptions.None);
}
ここで、プリセットという名前に注意を払う必要があります。 これは、ビデオをどのフォーマットにトランスコードするかを示しています。 すべての可能なオプションのリストは
ここにあります 。 条件に応じて、元のビデオを480p形式でエンコードします。
したがって、さまざまな形式でエンコードするためのいくつかのタスク(タスク)を作成することで、1080pでのショットなど、1つのソースファイルを使用できます。
そのため、Windows Azure Media Servicesの操作に固有のすべてのメソッドを実装しました。 IVideoConverterインターフェイスの実装に移りましょう。
Windows Azure Media Servicesはクラウドで実行されるため、エンコード操作を開始する前に必要なファイルをリポジトリにアップロードする必要があります。 UploadFileメソッドは、これをインターフェイスで実行します。 実際の実装:
public void UploadFile(string localFile)
{
var fileName = Path.GetFileName(localFile);
var assetFile = _inputAsset.AssetFiles.Create(fileName);
assetFile.Upload(localFile);
}
ファイル名がリポジトリ内のオブジェクトにアクセスするためのキーになると想定しています。 つまり、すべてのオブジェクトはルートストレージコンテナーに格納されます。 入力パラメーターにAssetを使用して、新しいオブジェクト(リポジトリー内のファイルの名前)へのリンクを追加し、実際には、AssetFileオブジェクトのUploadメソッドを使用してこのファイルを直接リポジトリーにアップロードします。
したがって、リポジトリからファイルをアップロードする方法は同様です。
public void DownloadFile(string localFile)
{
var outputAsset = _job.OutputMediaAssets.Single();
var outputFile = outputAsset.AssetFiles.ToList().Single(x => x.Name.Contains(".mp4"));
outputFile.Download(localFile);
}
出力パラメーター(実際には、出力Asset)が1つしかないため、Jobに対応するOutputMediaAssetsコレクションに、単一のオブジェクトへのリンクを取得します。
mp4拡張子の出力ファイルに加えて、Assetにはエンコードプロセスに関するメタデータファイルが含まれています。 mp4ファイルをダウンロードする必要があります。 実際、これはオブジェクトのAssetFileに対応するDownloadメソッドを使用して行うことです。
次に、コーディングを開始し、その実行結果を待つメソッドを実装します。
public void WaitForConversionToComplete()
{
_job.StateChanged += JobOnStateChanged;
_job.Submit();
_job.GetExecutionProgressTask(CancellationToken.None).Wait();
}
Jobオブジェクトは、関連するイベントを使用して、状態の変化を通知します。 このイベントを購読する:
private void JobOnStateChanged(object sender, JobStateChangedEventArgs state)
{
switch (state.CurrentState)
{
case JobState.Finished:
{
Console.WriteLine("Conversion complete!");
break;
}
case JobState.Queued:
case JobState.Scheduled:
case JobState.Processing:
{
Console.WriteLine("Conversion in progress...");
break;
}
case JobState.Canceled:
case JobState.Canceling:
case JobState.Error:
{
Console.WriteLine("An error has been occured during the job execution!");
break;
}
}
}
次に、Submitメソッドを実行してこの処理ジョブを送信します。 そして、タスクが完了するまで待ちます。
したがって、満たされていない唯一のメソッドはConvertです。 このメソッドは基本的に、以前に実装されたメソッドを適切な順序で呼び出すだけです。 その実装:
public void Convert(string sourceFile, string destinationFile)
{
Console.WriteLine("Uploading the source file...");
UploadFile(sourceFile);
Console.WriteLine("Creating processing task...");
CreateTask();
Console.WriteLine("Starting conversion...");
WaitForConversionToComplete();
Console.WriteLine("Downloading converted file...");
DownloadFile(destinationFile);
}
ご覧のとおり、すべてが非常に簡単です。
- ファイルをアップロードしました。
- コーディングタスクを作成しました。
- 実行のためにタスクを送信し、結果を待ちました。
- 結果のファイルをダウンロードします。
その結果、コンソールアプリケーションでConvertメソッドを呼び出すと、次の結果が得られます。

ソースファイルと受信ファイルを比較します。

これで、Windows Azure Media Servicesを操作するためのクライアントの実装が完了しました。 来年、Amazon Elastic Transcoderと連携するクライアントを作成します。 切り替えないでください! すべての成功した週と今後の予定!
続行するには...