normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azure メディアサービス ネタ その4 〜Java SDK を利用した動画のアップロード〜

Scott Guthrie 氏のブログ Announcing Release of Windows Azure Media Services にて、Media Service 向けの Java SDK が公開された。今回は Java 版の SDK を利用してアップロードするまでの手順について簡単に紹介する。

pom.xml を記載する

まずは、Java の人なら言わずと知れた maven の設定ファイル pom.xml を以下のように記載する。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<name>Windows Azure Media Service Sample</name>
	<description>Sample for Microsoft Windows Azure Clients</description>
	<artifactId>windows-azure-media-service-sample-normalian</artifactId>
	<groupId>jp.co.sample</groupId>
	<version>0.9.1</version>
	<dependencies>
		<dependency>
			<groupId>com.microsoft.windowsazure</groupId>
			<artifactId>microsoft-windowsazure-api</artifactId>
			<version>0.4.0</version>
		</dependency>
	</dependencies>
</project>

name タグ、description タグ、artifactId タグ等の記載は環境に合わせて適宜変更してほしい。

mvn コマンドを実行する

次に、以下の様に maven のコマンド mvn を実行して Eclipse プロジェクトの設定を実施する(この際、必要な jar も取得される)。

>mvn eclipse:eclipse
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'eclipse'.
[INFO] ------------------------------------------------------------------------
(中略)
[INFO] Wrote Eclipse project for "windows-azure-media-service-sample-normalian" to C:\opt\workspace42\WAMediaService.
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Mon Feb 04 00:22:07 JST 2013
[INFO] Final Memory: 15M/220M
[INFO] ------------------------------------------------------------------------

BUILD SUCCESSFUL のメッセージが出ていれば設定完了だ。Eclipse環境変数 M2_REPO の設定も実施した後の Eclipse プロジェクトは以下の様になるので参考にしてほしい。

動画ファイルをアップロードするコードを記載する

以下のコードを参考に、動画をアップロードするコードを記載する。前回までの .NET 編におけるコードを既にご理解いただけている方なら特に解説は不要だろう。

package jp.co.sample.media;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.EnumSet;

import com.microsoft.windowsazure.services.core.Configuration;
import com.microsoft.windowsazure.services.core.ServiceException;
import com.microsoft.windowsazure.services.media.MediaConfiguration;
import com.microsoft.windowsazure.services.media.MediaContract;
import com.microsoft.windowsazure.services.media.MediaService;
import com.microsoft.windowsazure.services.media.WritableBlobContainerContract;
import com.microsoft.windowsazure.services.media.models.AccessPolicy;
import com.microsoft.windowsazure.services.media.models.AccessPolicyInfo;
import com.microsoft.windowsazure.services.media.models.AccessPolicyPermission;
import com.microsoft.windowsazure.services.media.models.Asset;
import com.microsoft.windowsazure.services.media.models.AssetFile;
import com.microsoft.windowsazure.services.media.models.AssetInfo;
import com.microsoft.windowsazure.services.media.models.Locator;
import com.microsoft.windowsazure.services.media.models.LocatorInfo;
import com.microsoft.windowsazure.services.media.models.LocatorType;

public class Main {
	private static MediaContract mediaService;
	private static AssetInfo asset;
	private static AccessPolicyInfo accessPolicy;
	private static LocatorInfo locator;
	private static WritableBlobContainerContract uploader;

	public static void main(String[] args) {
		System.out.println("---- Application start");
		try {
			// 以下は変更不要
			String mediaServiceUri = "https://media.windows.net/API/";
			String scope = "urn:WindowsAzureMediaServices";
			String oAuthUri = "https://wamsprodglobal001acs.accesscontrol.windows.net/v2/OAuth2-13";

			// Media Service のアカウント名とアクセスキーを設定
			String clientId = "<アカウント名>";
			String clientSecret = "<アクセスキー>";

			// MediaContract クラスを設定するための Configuration インスタンスを生成
			Configuration configuration = MediaConfiguration
					.configureWithOAuthAuthentication(mediaServiceUri,
							oAuthUri, clientId, clientSecret, scope);

			// MediaContract インスタンスの生成
			mediaService = MediaService.create(configuration);

			System.out.println("Application init end "
					+ mediaService.getClass());
			{
				// Asset の生成
				asset = mediaService
						.create(Asset.create().setAlternateId("altId")
								.setName("Asset from Java SDK"));
				System.out.println("Created asset with id: " + asset.getId());

				System.out.println("Application Asset end "
						+ mediaService.getClass());

				// 書き込みのアクセス権を15分間付与する
				accessPolicy = mediaService.create(AccessPolicy.create(
						"uploadAccessPolicy", 15.0,
						EnumSet.of(AccessPolicyPermission.WRITE)));
				System.out.println("Created access policy with id: "
						+ accessPolicy.getId());

				// アセットとアクセスポリシーを利用して、ロケータを作成
				locator = mediaService.create(Locator.create(
						accessPolicy.getId(), asset.getId(), LocatorType.SAS));
				System.out.println("Created locator with id: "
						+ locator.getId());

				// ロケータを利用して、ブロブのアップローダインスタンスを作成
				uploader = mediaService.createBlobWriter(locator);

				// ファイル名を記載する
				String fileName = "20120420_125710.mp4";

				// ローカルファイルの絶対パス
				InputStream input = new FileInputStream(new File("C:/Temp/"
						+ fileName));

				// ローカルファイルからアセットへの格納
				uploader.createBlockBlob(fileName, input);
				mediaService.action(AssetFile.createFileInfos(asset.getId()));

			}
		} catch (ServiceException se) {
			System.out.println("ServiceException encountered.");
			System.out.println(se.getMessage());
		} catch (Exception e) {
			System.out.println("Exception encountered.");
			System.out.println(e.getMessage());
		}
		System.out.println("---- Application end");
	}
}

実行結果

上記のアプリケーションを実行し、正常に終了した場合は、コンソールに以下のようなメッセージが出力される。

---- Application start
Application init end class com.microsoft.windowsazure.services.media.implementation.MediaExceptionProcessor
Created asset with id: nb:cid:UUID:df825dff-53b5-4c46-8b3b-058bdaf914c4
Application Asset end class com.microsoft.windowsazure.services.media.implementation.MediaExceptionProcessor
Created access policy with id: nb:pid:UUID:ef43b818-dde0-41c0-9ad3-3603650101f8
Created locator with id: nb:lid:UUID:6ce179f1-e14d-4af8-a91b-8ae7503380c8
asset-a8b3bf5e-84e1-4c75-8787-3dfc3160f7d1
---- Application end

アプリケーションの実行後、アップロードした動画が Media Servie 側に格納されているのが確認できる。