Поделиться через


Azure Media Services 向け Hyperlapse のパブリック プレビューを発表

このポストは、5 月 14 日に投稿された Announcing Hyperlapse for Azure Media Services の翻訳です。

この 5 年の間に、ドローン カメラやアクション カメラといった動画を撮影するための新しいデバイスの普及が進み、私たちを取り巻く環境は大きく変化してきました。レンズやカメラのハードウェアの小型化が進んだこと、そしてソーシャル メディアやマルチメディアで動画共有機能が浸透してきたことに伴い、動画撮影を楽しむ世界中のアマチュア カメラマンの活躍の場が増えてきました。今ではスポーツをしている姿をプレーヤーの目線から高フレームレートで手軽に撮影することが可能になり、カメラで撮影しながらスキーをしたり、以前では考えられなかったような映像をカメラに収めて、すぐに世界中に公開することができます。

しかし、このテクノロジの進化によって新たな課題も生まれています。たとえば、ニュース配信会社が多数のドローンを使って大規模なイベントのようすを撮影する場合、長くて退屈なものになりがちな映像をどうすれば見応えのある作品に仕上げることができるのか、ということや、山を駆け下りるマウンテンバイクの動きをとらえた 15 分間の映像を、どうすれば皆に見てもらえるような、シェアしてもらえるようなすばらしい映像につくり上げることができるのか、といったようなことです。

この数か月間、マイクロソフトはこの課題に応えるために、Microsoft Research のスタッフと緊密に連携を図り、取り組みを進めてきました。そしてその答えとして、Microsoft Hyperlapse を Azure Media Services クラウド サービス向けに提供することに決定しました。これにより今回、Hyperlapse が Azure Media Services に向けにパブリック プレビューとして無料提供されることになりました!

今回のリリースは、Hyperlapse Mobile および Hyperlapse Pro (英語) と併せて提供されます。これは、Microsoft Hyperlapse を開発者やメディア企業向けのサービスとして提供することに重点を置いているためです。Microsoft Hyperlapse は今回のリリースにより、世界中の Azure データセンターから提供されるようになりました。

 

Microsoft Hyperlapse とは

Microsoft Hyperlapse は、Microsoft Research が 20 年以上をかけてコンピューター ビジョンについて研究してきた成果から開発された動画加工ツールで、映像の安定化とタイムラプス機能を組み合わせて、長時間のコンテンツから美しい動画を手早く作成することができます。

たとえば、スノーボードのヘルメット カメラの映像をシェアしたい場合、Microsoft Hyperlapse を使用すれば、動画のぶれを軽減すると同時に、再生速度を上げてプレーヤーの動きをそのままスピードアップさせ、扱いやすいサイズのクリップに収めることができます。Microsoft Hyperlapse ならコンテンツを洗練させ、高度な手ぶれ機能を持つプロ向けのハードウェアやカメラで撮影したような印象に仕上げることができます。

Microsoft Hyperlapse を使うとどれほど滑らかな映像に仕上げることができるか、下の動画で実際にご覧ください (Azure Media Player (英語) を使用しています)。

ご覧のとおり、Microsoft Hyperlapse では、とても滑らかなタイムラプス動画を生成することができます。滑らかさに注目して通常のタイムラプス映像と Hyperlapse の動画を見比べると、従来のタイムラプス テクノロジではアマチュア カメラマンらしい画面のガタつきやぶれが非常に目立ちますが、Hyperlapse ではこの映像のように滑らかにすることができます。

Azure Media Services 向けの Hyperlapse は、Microsoft Hyperlapse テクノロジを Azure Media Services のメディア プロセッサに統合したものです。ぜひ Hyperlapse をお試しいただき、この優れたテクノロジとグローバルに展開する大規模な Azure クラウドの相乗効果によるメリットを存分にご活用ください。

Azure Media Services では、Hyperlapse のタスク処理を拡張可能なバッチ処理としてスケジュール設定し、仮想的にハードウェアをスケール アップしてジョブを必要な数だけ並列処理することができます。

 

パブリック プレビューは無料で提供

多くの皆様に Microsoft Hyperlapse を気軽にお試しいただけるように、パブリック プレビューはすべての Azure Media Services アカウント ユーザーに無料で提供します。

注: プレビュー期間中は、Hyperlapse ジョブの実行は 10,000 フレームまでの動画に制限されます。

使用を開始するには

今回公開された REST API や SDK (英語)、または Azure Media Services Explorer (英語) を使用すると、Hyperlapse テクノロジを簡単に Web やアプリと統合することが可能です。

C# プログラムと構成用 XML のサンプルを以下にご紹介しますので、初めて Hyperlapse ジョブを作成する際の参考としてお使いください。このコードでは、Azure Media Services C# SDK (英語)SDK 拡張機能 (英語) パッケージの両方が必要です (NuGet から入手可能)。

 

サンプル プログラム

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.Configuration;
using System.IO;
using System.Threading;
namespace MyFirstHyperlapseJob
{
    class Program
    {
        
        // 定数とグローバル変数を宣言
        private static CloudMediaContext _context = null;
        private static readonly string _accountName = {ACCOUNT_NAME};
        private static readonly string _accountKey = {ACCOUNT_KEY};
        private const string _mpName = "Azure Media Hyperlapse";
        private static readonly string _inputFile = {INPUT_FILE_PATH};   
        private static readonly string _outputFolder = {OUTPUT_FOLDER_PATH};
        private const string _hyperlapseConfiguration = {PATH_TO_CONFIG};
        static void Main(string[] args)
        {
            _context = new CloudMediaContext(_accountName, _accountKey);
            RunHyperlapseJob(_inputFile, _outputFolder, _hyperlapseConfiguration);
        }
        static void RunHyperlapseJob(string input, string output, string hyperConfig)
        {
            // 入力ファイルでアセットを作成
            IAsset asset = _context
                           .Assets
                           .CreateFromFile(input, AssetCreationOptions.None);
            
            // Azure Media Hyperlapse MP のインスタンスを取得
            IMediaProcessor mp = _context
                                 .MediaProcessors
                                 .GetLatestMediaProcessorByName(_mpName);
            
            // Hyperlapse とストリーミング用エンコードの 2 つのチェーン タスクを含むジョブを作成
            IJob job = _context
                       .Jobs
                       .Create(String.Format("Hyperlapse {0}", input));
            if (!String.IsNullOrEmpty(hyperConfig))
            {
                hyperConfig = File.ReadAllText(hyperConfig);
            }
            ITask hyperlapseTask = job.Tasks.AddNew("Hyperlapse task", 
                                                    mp,
                                                    hyperConfig, 
                                                    TaskOptions.None);
            hyperlapseTask.InputAssets.Add(asset);
            hyperlapseTask.OutputAssets.AddNew("Hyperlapse output", 
                                                AssetCreationOptions.None);
            job.Submit();
            // 進捗状況の表示と取得の各タスクを作成
                Task progressPrintTask = new Task(() =>
                {
                    IJob jobQuery = null;
                    do
                    {
                        var progressContext = _context;
                        jobQuery = progressContext.Jobs
                                                  .Where(j => j.Id == job.Id)
                                                  .First();
                        Console.WriteLine(string.Format("{0}\t{1}\t{2}", 
                                          DateTime.Now, 
                                          jobQuery.State, 
                                          jobQuery.Tasks[0].Progress));
                        Thread.Sleep(10000);
                    }
                    while (jobQuery.State != JobState.Finished &&
                           jobQuery.State != JobState.Error &&
                           jobQuery.State != JobState.Canceled);
                });
                progressPrintTask.Start();
                Task progressJobTask = job.GetExecutionProgressTask(
                                                     CancellationToken.None);
                progressJobTask.Wait();
                // ジョブの状態がエラーの場合、 
                // ジョブ進行状況のイベント処理メソッドにエラーが記録される。 
                // ここでエラー状態を確認し、必要な場合は終了する。
                if (job.State == JobState.Error)
                {
                    ErrorDetail error = job.Tasks.First().ErrorDetails.First();
                    Console.WriteLine(string.Format("Error: {0}. {1}", 
                                                    error.Code, 
                                                    error.Message));                    
                }
            DownloadAsset(job.OutputMediaAssets.First(), output);
        }
        static void DownloadAsset(IAsset asset, string outputDirectory)
        {
            foreach (IAssetFile file in asset.AssetFiles)
            {
                file.Download(Path.Combine(outputDirectory, file.Name));
            }
        }
        // ジョブの状態のイベント ハンドラー
        static void StateChanged(object sender, JobStateChangedEventArgs e)
        {
            Console.WriteLine("Job state changed event:");
            Console.WriteLine("  Previous state: " + e.PreviousState);
            Console.WriteLine("  Current state: " + e.CurrentState);
            switch (e.CurrentState)
            {
                case JobState.Finished:
                    Console.WriteLine();
                    Console.WriteLine("Job finished.");
                    break;
                case JobState.Canceling:
                case JobState.Queued:
                case JobState.Scheduled:
                case JobState.Processing:
                    Console.WriteLine("Please wait...\n");
                    break;
                case JobState.Canceled:
                    Console.WriteLine("Job is canceled.\n");
                    break;
                case JobState.Error:
                    Console.WriteLine("Job failed.\n");
                    break;
                default:
                    break;
            }
        }
    }
}

 

構成用 XML

 <?xml version="1.0" encoding="utf-16"?>
<Preset xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="https://www.w3.org/2001/XMLSchema" Version="1.0"
 xmlns="https://www.windowsazure.com/media/encoding/Preset/2014/03">
  <Sources>
    <Source StartFrame="0" NumFrames="10000">
      <InputFiles />
    </Source>
  </Sources>
  <Options>
    <Speed>12</Speed>
  </Options>
</Preset>

 

ご質問やご意見がある場合、または利用開始のサポートが必要な場合には、お気軽に amshyperlapse@microsoft.com までメールでご連絡ください。