내보내기(0) 인쇄
모두 확장

Media Services SDK for .NET을 사용하여 자산 제공

업데이트 날짜: 2014년 9월

이 항목에서는 클라이언트에 미디어 콘텐츠를 배달하는 데 가장 일반적으로 사용되는 세 가지 옵션을 소개합니다.

  • 다음 형식 중 하나로 적응 콘텐츠 스트리밍: MPEG DASH, Apple HLS(HTTP 라이브 스트리밍), 부드러운 스트리밍

    이 항목에서 설명하는 대로 스트리밍 URL을 생성한 후 다음과 같은 플레이어를 사용하여 URL을 테스트할 수 있습니다.

    부드러운 스트리밍 URL을 테스트하려면 smf.cloudapp.net/healthmonitor 플레이어를 사용합니다.

    MPEG DASH URL을 테스트하려면 dashif.org/reference/players/javascript/ 플레이어를 사용합니다.

    HLS URL을 테스트하려면 iOS 장치의 Safari 또는 3ivx-hls-player를 사용합니다.

  • 점진적으로 MP4 파일 다운로드

  • 로컬 컴퓨터에 자산 파일 다운로드

미디어 콘텐츠 제공과 관련된 개념 및 용어에 대한 자세한 내용은 콘텐츠 배달을 참조하세요.

Warning경고
미디어 서비스에서는 스트리밍 콘텐츠의 URL 작성 시 IAssetFile.Name 속성의 값을 사용합니다(예: http://{WAMSAccount}.origin.mediaservices.windows.net/{GUID}/{IAssetFile.Name}/streamingParameters). 따라서 퍼센트 인코딩이 허용되지 않습니다. 이름 속성의 값에는 퍼센트 인코딩 예약 문자( !*'();:@ !*'();:@&=+$,/?%#[]")를 사용할 수 없으며, 파일 이름 확장명에 ‘.’를 하나만 사용할 수 있습니다.

다음 항목에서는 미디어 서비스 개발을 위한 설정 방법을 보여 줍니다.

  1. Media Services SDK for .NET에서 개발을 위한 설정

    이 항목의 코덱에서는 Azure 미디어 서비스 .NET SDK Extensions을 사용합니다. 미디어 서비스 .NET SDK Extensions는 코드를 단순화하고 미디어 서비스를 사용하여 더욱 쉽게 개발할 수 있도록 지원하는 일련의 확장 메서드 및 도우미 함수입니다.

  2. 미디어 서비스 SDK를 사용하여 미디어 서비스 연결

미디어 서비스 계정에 이미 저장되어 있으며 Assets 컬렉션을 통해 제공되는 자산을 배달(다운로드 또는 스트리밍)할 수 있습니다. 인코딩 또는 패키징 작업을 실행하면 생성되며 OutputMediaAssets 컬렉션을 통해 제공되는 자산을 다운로드하거나 스트리밍할 수도 있습니다. 이 항목의 예제에서는 작업의 출력 미디어 자산 액세스 및 배달 방법을 보여 줍니다.

이 섹션의 코드는 다음을 수행합니다.

  1. 새 자산을 만들고 로컬 디렉터리에서 중 2층 MP4 파일을 업로드합니다.

  2. 이전 단계에서 업로드한 중 2층 자산을 다중 비트 전송률 자산으로 트랜스코딩하는 단일 태스크가 포함된 작업을 준비합니다.

  3. 작업을 제출하고 완료될 때까지 기다립니다.

  4. 인코딩 작업에서 생성된 출력 자산을 가져옵니다.

  5. Origin Locator를 만들어 출력 자산을 게시합니다.

  6. 적응 스트리밍용 부드러운 스트리밍, HLS 및 MPEG-DASH URL을 생성합니다.

    적응 비트 전송률 MP4 파일 집합을 기반으로 콘텐츠를 스트리밍하려면 먼저 주문형 스트리밍 예약 단위를 하나 이상 구입해야 합니다. 자세한 내용은 동적 패키징를 참조하세요.

  7. 파일을 로컬 디렉터리에 다운로드하기 위한 점진적 다운로드에 사용되는 SAS 로케이터를 만듭니다.

    점진적으로 다운로드하려는 콘텐츠는 암호화할 수 없습니다.

  8. 자산의 각 MP4 파일에 대해 점진적 다운로드 URL을 생성합니다.

  9. 출력 자산을 로컬 폴더로 다운로드합니다.

note참고
이 샘플에서는 Azure 미디어 서비스 .NET SDK Extensions를 사용합니다.  SDK Extensions에는 다양한 정보가 포함되어 있습니다. 몇 가지 메서드의 구현 방법(예: GetSmoothStreamingUri(), GetHlsUri(), andGetMpegDashUri() 메서드가 스트리밍 URL을 작성하는 방법)을 확인하려는 경우 github(azure-sdk-for-media-services-extensions)의 코드를 찾아보면 됩니다.

입력 MP4 파일이 위치한 폴더를 가리키도록 코드를 업데이트해야 합니다.

private static readonly string _mediaFiles =
Path.GetFullPath(@"../..\Media");

private static readonly string _singleMP4File =
    Path.Combine(_mediaFiles, @"SingleMP4\BigBuckBunny.mp4");

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using Microsoft.WindowsAzure.MediaServices.Client;


namespace MediaServicesDeliveringContent 
{ 
    class Program 
    {
        private static readonly string _mediaFiles =
            Path.GetFullPath(@"../..\Media");

        private static readonly string _singleMP4File =
            Path.Combine(_mediaFiles, @"SingleMP4\BigBuckBunny.mp4");

        private static MediaServicesCredentials _cachedCredentials = null;
        private static CloudMediaContext _context = null;

        // Media Services account information.
        private static readonly string _mediaServicesAccountName =
            ConfigurationManager.AppSettings["MediaServicesAccountName"];
        private static readonly string _mediaServicesAccountKey =
            ConfigurationManager.AppSettings["MediaServicesAccountKey"];
        
        static void Main(string[] args) 
        {
            _cachedCredentials = new MediaServicesCredentials(_mediaServicesAccountName,
                                                                                _mediaServicesAccountKey);
            _context = new CloudMediaContext(_cachedCredentials); 

            Console.WriteLine("Creating new asset from local file..."); 
 
            // Create a new asset and upload a mezzanine file from a local path. 
            IAsset inputAsset = _context.Assets.CreateFromFile(
                _singleMP4File, 
                AssetCreationOptions.None, 
                (af, p) => 
                { 
                    Console.WriteLine("Uploading '{0}' - Progress: {1:0.##}%", af.Name, p.Progress); 
                }); 
 
            Console.WriteLine("Asset created."); 
 
            // Prepare a job with a single task to transcode the previous mezzanine asset 
            // into a multi-bitrate asset. 
            IJob job = _context.Jobs.CreateWithSingleTask( 
                MediaProcessorNames.AzureMediaEncoder, 
                MediaEncoderTaskPresetStrings.H264AdaptiveBitrateMP4Set720p, 
                inputAsset, 
                "Sample Adaptive Bitrate MP4", 
                AssetCreationOptions.None); 
 
            Console.WriteLine("Submitting transcoding job..."); 
 
            // Submit the job and wait until it is completed. 
            job.Submit(); 
            job = job.StartExecutionProgressTask( 
                j => 
                { 
                    Console.WriteLine("Job state: {0}", j.State); 
                    Console.WriteLine("Job progress: {0:0.##}%", j.GetOverallProgress()); 
                }, 
                CancellationToken.None).Result; 
 
            Console.WriteLine("Transcoding job finished."); 
             
            // The OutputMediaAssets[0] contains the first 
            // (and in this case the only) output asset 
            // produced by the encoding job.
            IAsset outputAsset = job.OutputMediaAssets[0]; 
 
            Console.WriteLine("Publishing output asset..."); 
 
            // Publish the output asset by creating an Origin locator.  
            // Define the Read only access policy and
            // specify that the asset can be accessed for 30 days.  
            _context.Locators.Create( 
                LocatorType.OnDemandOrigin, 
                outputAsset, 
                AccessPermissions.Read, 
                TimeSpan.FromDays(30));

            // Generate the Smooth Streaming, HLS and MPEG-DASH URLs for adaptive streaming.  
            Uri smoothStreamingUri = outputAsset.GetSmoothStreamingUri();
            Uri hlsUri = outputAsset.GetHlsUri();
            Uri mpegDashUri = outputAsset.GetMpegDashUri();

            // To stream your content based on the set of 
            // adaptive bitrate MP4 files, you must first get 
            // at least one On-demand Streaming reserved unit. 
            // For more information, see http://msdn.microsoft.com/en-us/library/jj889436.aspx.
            Console.WriteLine("Output is now available for adaptive streaming:");

            // Show the streaming URLs. 
            Console.WriteLine(smoothStreamingUri);
            Console.WriteLine(hlsUri);
            Console.WriteLine(mpegDashUri);
                
            //
            // Create a SAS locator that is used for progressive download
            // or to download files to a local directory.  
            // The content that you want to progressively download cannot be encrypted.
            _context.Locators.Create( 
                LocatorType.Sas, 
                outputAsset, 
                AccessPermissions.Read, 
                TimeSpan.FromDays(30)); 

            // Get all the MP4 files in the output asset.
            IEnumerable<IAssetFile> mp4AssetFiles = outputAsset
                    .AssetFiles
                    .ToList()
                    .Where(af => af.Name.EndsWith(".mp4", 
                        StringComparison.OrdinalIgnoreCase));

            // Generate the Progressive Download URLs for each MP4. 
            List<Uri> mp4ProgressiveDownloadUris = 
                mp4AssetFiles.Select(af => af.GetSasUri()).ToList();

            Console.WriteLine("You can progressively download the following MP4 files:");
            mp4ProgressiveDownloadUris.ForEach(uri => Console.WriteLine(uri)); 
 
             string outputFolder = Path.Combine(_mediaFiles, @"job-output");

            if (!Directory.Exists(outputFolder)) 
            { 
                Directory.CreateDirectory(outputFolder); 
            } 
 
            Console.WriteLine("Downloading output asset files to local folder..."); 
 
            // Download the output asset to a local folder. 
            outputAsset.DownloadToFolder( 
                outputFolder, 
                (af, p) => 
                { 
                    Console.WriteLine("Downloading '{0}' - Progress: {1:0.##}%", af.Name, p.Progress); 
                }); 
 
            Console.WriteLine("Downloaded files are located in '{0}'.", Path.GetFullPath(outputFolder)); 
        } 
    } 
} 

참고 항목

표시:
© 2014 Microsoft