البرنامج التعليمي: البث المباشر باستخدام Media Services باستخدام .NET 7.0

شعار خدمات الوسائط الإصدار 3


تحذير

سيتم إيقاف Azure Media Services في 30 يونيو 2024. لمزيد من المعلومات، راجع دليل إيقاف AMS.

في Azure Media Services، تعالج ⁧⁩الأحداث المباشرة⁧⁩ محتوى البث المباشر. يوفر الحدث المباشر نقطة نهاية إدخال (عنوان URL) الذي تقدمه أنت بعد ذلك إلى أداة الترميز مباشرةً. يتلقى الحدث المباشر تدفقات الإدخال من الترميز المباشر باستخدام بروتوكولات RTMP/S أو Smooth Streaming ويجعلها متاحة للبث من خلال نقطة نهاية دفق واحدة أو أكثر. توفر الأحداث المباشرة أيضًا نقطة نهاية معاينة (عنوان URL معاينة) تستخدمها أنت في معاينة الدفق والتحقق من صحته قبل إجراء المزيد من المعالجة والتسليم.

يوضح هذا البرنامج التعليمي كيفية استخدام .NET 7.0 لإنشاء حدث مباشر تمريري . تعد الأحداث المباشرة التمريرية مفيدة عندما يكون لديك أداة ترميز قادرة على معدل البت المتعدد، وترميز GOP المتوافق في أماكن العمل. يمكن أن يكون طريقة لتقليل تكاليف السحابة. إذا كنت ترغب في تقليل النطاق الترددي وإرسال دفق معدل بت واحد إلى السحابة لترميز متعدد معدلات البت، يمكنك استخدام حدث مباشر تحويل الترميز مع الإعدادات المسبقة لترميز 720P أو 1080P.

في هذا البرنامج التعليمي، سوف تقوم بـ:

  • قم بتنزيل نموذج مشروع.
  • فحص التعليمات البرمجية التي تتولى البث المباشر.
  • شاهد الحدث باستخدام Azure Media Player على الموقع التجريبي لـMedia Player.
  • إعداد Event Grid لمراقبة الحدث المباشر.
  • تنظيف الموارد

المتطلبات الأساسية

تحتاج إلى العناصر التالية لإتمام البرنامج التعليمي:

تحتاج أيضا إلى هذه العناصر لبرنامج البث المباشر:

  • كاميرا أو جهاز (مثل الكمبيوتر المحمول) لاستخدامه في بث الحدث.
  • برنامج ترميز محلي يقوم بترميز دفق الكاميرا وإرساله إلى خدمة البث المباشر لخدمات الوسائط من خلال بروتوكول المراسلة Real-Time (RTMP/S). لمعرفة مزيد من المعلومات، راجع ⁧⁩الترميز المباشر المحلي الموصى به⁧⁩. يجب أن يكون الدفق بتنسيق RTMP/S أو Smooth Streaming. يفترض هذا النموذج أنك ستستخدم Open Broadcaster Software (OBS) Studio لبث RTMP/S إلى نقطة نهاية الاستيعاب. ⁧⁩تثبيت OBS Studio⁧⁩.
  • بدلا من ذلك، يمكنك تجربة التشغيل السريع OBS لاختبار العملية بأكملها باستخدام مدخل Microsoft Azure أولا.

لمراقبة الحدث المباشر باستخدام Event Grid و Event Hubs، يمكنك: 1. اتبع الخطوات الواردة في إنشاء أحداث Media Services ومراقبتها باستخدام Event Grid باستخدام مدخل Microsoft Azure أو 1. اتبع الخطوات بالقرب من نهاية هذا البرنامج التعليمي في قسم مراقبة الأحداث المباشرة باستخدام شبكة الأحداث ومراكز الأحداث من هذه المقالة.

تلميح

مراجعة ⁧⁩البث المباشر باستخدام Media Services v3⁧⁩ قبل المتابعة.

تحميل العينة وتكوينها

استنساخ مستودع GitHub الذي يحتوي على نموذج .NET للبث المباشر إلى الجهاز باستخدام الأمر التالي:

git clone https://github.com/Azure-Samples/media-services-v3-dotnet.git

نموذج البث المباشر موجود في المجلد Live/LiveEventWithDVR .

افتح appsettings.json في مشروعك الذي تم تنزيله. استبدل القيم باسم الحساب ومعرف الاشتراك واسم مجموعة الموارد.

هام

يستخدم هذا النموذج لاحقة فريدة من نوعها لكل مورد. في حال إلغاء التصحيح أو إنهاء التطبيق دون تشغيله، فسوف ينتهي بك الأمر بالعديد من الأحداث المباشرة في حسابك. تأكد من إيقاف تشغيل الأحداث المباشرة. وإلا، ⁧⁩ستتحمل التكلفة⁧⁩!

ابدأ في استخدام واجهات برمجة تطبيقات خدمات الوسائط مع .NET SDK

Program.cs إنشاء مرجع إلى مورد حساب خدمات الوسائط، باستخدام الخيارات من appsettings.json:

var mediaServicesResourceId = MediaServicesAccountResource.CreateResourceIdentifier(
    subscriptionId: options.AZURE_SUBSCRIPTION_ID.ToString(),
    resourceGroupName: options.AZURE_RESOURCE_GROUP,
    accountName: options.AZURE_MEDIA_SERVICES_ACCOUNT_NAME);
var credential = new DefaultAzureCredential(includeInteractiveCredentials: true);
var armClient = new ArmClient(credential);
var mediaServicesAccount = armClient.GetMediaServicesAccountResource(mediaServicesResourceId);

إنشاء حدث مباشر

يوضح هذا القسم كيفية إنشاء نوع تمرير للحدث المباشر (تم تعيين LiveEventEncodingType إلى None). لمعرفة معلومات حول الأنواع المتوفرة، راجع ⁧⁩أنواع الأحداث المباشرة⁧⁩. إذا كنت ترغب في تقليل النطاق الترددي الإجمالي لاستيعابك، أو لم يكن لديك جهاز تبديل متعدد البتات محلي، يمكنك استخدام حدث تحويل ترميز مباشر لترميز سحابي معدل البت التكيفي 720 بكسل أو 1080 بكسل.

قد ترغب في تحديد الأمور التالية عند إنشاء الحدث المباشر:

  • ⁩بروتوكول بث الحدث المباشر⁧⁩. حاليا، يتم دعم بروتوكولات RTMPS وS smooth Streaming. لا يمكنك تغيير خيار البروتوكول أثناء تشغيل الحدث المباشر. إذا كنت بحاجة إلى بروتوكولات مختلفة، فقم بإنشاء حدث مباشر منفصل لكل بروتوكول تدفق.

  • ⁩قيود IP على البث والمعاينة⁧⁩. يمكنك تحديد عناوين IP المسموح لها ببث فيديو لهذا الحدث المباشر. يمكن تحديد عناوين IP المسموح بها كأحد تلك الخيارات:

    • عنوان IP واحد (على سبيل المثال، 10.0.0.1 أو 2001:db8::1)

    • نطاق IP يستخدم عنوان IP وقناع شبكة فرعية لتوجيه Inter-Domain بلا فئة (CIDR) (على سبيل المثال، 10.0.0.1/22 أو 2001:db8::/48)

    • نطاق IP يستخدم عنوان IP وقناع شبكة فرعية عشرية منقطة (على سبيل المثال، 10.0.0.1 255.255.252.0)

      إذا لم يتم تحديد عناوين IP ولم يوجد تعريف للقاعدة، فلن يسمح بأي عنوان IP. للسماح بأي عنوان IP، قم بإنشاء قاعدة وتعيين 0.0.0.0/0 و ::/0. يجب أن تكون عناوين IP بأحد التنسيقات التالية: عناوين IPv4 أو IPv6 بأربعة أرقام أو نطاق عناوين CIDR. لمزيد من المعلومات، راجع تقييد الوصول إلى ترخيص DRM وتسليم مفتاح AES باستخدام قوائم السماح IP.

  • ⁩التشغيل التلقائي لحدث في أثناء إنشائه⁧⁩. عند تعيين التشغيل التلقائي إلى true، سيبدأ الحدث المباشر بعد الإنشاء. ما يعني أن الفوترة تبدأ بمجرد بدء تشغيل الحدث المباشر. ينبغي لك الاتصال مباشرةً ⁧Stop⁩ بمورد الحدث المباشر لإيقاف الفوترة الإضافية. لمعرفة مزيد من المعلومات، راجع ⁧⁩حالات الأحداث المباشرة والفوترة⁧⁩.

    تتوفر أوضاع الاستعداد لبدء الحدث المباشر في حالة «مخصصة» أقل تكلفة يجعل الانتقال إلى حالة تشغيل أسرع. إنه مفيد لحالات مثل التجمعات الساخنة التي تحتاج إلى تسليم القنوات بسرعة إلى الدفق.

  • ⁩اسم مضيف ثابت وGUID فريد⁧⁩. لكي يكون عنوان URL لاستيعابه تنبؤيا وأسهل في الصيانة في أداة ترميز مباشرة مستندة إلى الأجهزة، قم بتعيين الخاصية useStaticHostname إلى true. للحصول على معلومات مُفصلة، راجع عناوين URL الخاصة بالحدث المباشر.

    var liveEvent = await mediaServicesAccount.GetMediaLiveEvents().CreateOrUpdateAsync(
        WaitUntil.Completed,
        liveEventName,
        new MediaLiveEventData(mediaServicesAccount.Get().Value.Data.Location)
        {
            Description = "Sample Live Event from the .NET SDK sample",
            UseStaticHostname = true,
            // 1) Set up the input settings for the Live event...
            Input = new LiveEventInput(streamingProtocol: LiveEventInputProtocol.Rtmp)
            {
                StreamingProtocol = LiveEventInputProtocol.Rtmp,
                AccessToken = "acf7b6ef-8a37-425f-b8fc-51c2d6a5a86a", // used to make the ingest URL unique
                KeyFrameIntervalDuration = TimeSpan.FromSeconds(2),
                IPAllowedIPs =
                {
                    new IPRange
                    {
                        Name = "AllowAllIpV4Addresses",
                        Address = IPAddress.Parse("0.0.0.0"),
                        SubnetPrefixLength = 0
                    },
                    new IPRange
                    {
                        Name = "AllowAllIpV6Addresses",
                        Address = IPAddress.Parse("0::"),
                        SubnetPrefixLength = 0
                    }
                }
            },
            // 2) Set the live event to use pass-through or cloud encoding modes...
            Encoding = new LiveEventEncoding()
            {
                EncodingType = LiveEventEncodingType.PassthroughBasic
            },
            // 3) Set up the Preview endpoint for monitoring
            Preview = new LiveEventPreview
            {
                IPAllowedIPs =
                {
                    new IPRange()
                    {
                        Name = "AllowAllIpV4Addresses",
                        Address = IPAddress.Parse("0.0.0.0"),
                        SubnetPrefixLength = 0
                    },
                    new IPRange()
                    {
                        Name = "AllowAllIpV6Addresses",
                        Address = IPAddress.Parse("0::"),
                        SubnetPrefixLength = 0
                    }
                }
            },
            // 4) Set up more advanced options on the live event. Low Latency is the most common one. Set
            //    this to Default or Low Latency. When using Low Latency mode, you must configure the Azure
            //    Media Player to use the quick start heuristic profile or you won't notice the change. In
            //    the AMP player client side JS options, set -  heuristicProfile: "Low Latency Heuristic
            //    Profile". To use low latency optimally, you should tune your encoder settings down to 1
            //    second GOP size instead of 2 seconds.
            StreamOptions =
            {
                StreamOptionsFlag.LowLatency
            },
            // 5) Optionally enable live transcriptions if desired. This is only supported on
            //    PassthroughStandard, and the transcoding live event types. It is not supported on Basic
            //    pass-through type.
            // WARNING: This is extra cost, so please check pricing before enabling.
            //Transcriptions =
            //{
            //    new LiveEventTranscription
            //    {
            //        // The value should be in BCP-47 format (e.g: 'en-US'). See https://go.microsoft.com/fwlink/?linkid=2133742
            //        Language = "en-us",
            //        TrackName = "English" // set the name you want to appear in the output manifest
            //    }
            //}
        },
        autoStart: false);
    

الحصول على عناوين URL للبث

بعد إنشاء الحدث المباشر، يمكنك الحصول على عناوين URL التي ستقدمها إلى أداة التشفير المباشر. تستخدم أداة الترميز عناوين URL هذه لإدخال بث مباشر.

// Get the RTMP ingest URL. The endpoints is a collection of RTMP primary and secondary,
// and RTMPS primary and secondary URLs.
Console.WriteLine($"The RTMP ingest URL to enter into OBS Studio is:");
Console.WriteLine(liveEvent.Data.Input.Endpoints.First(x => x.Uri.Scheme == "rtmps").Uri);
Console.WriteLine("Make sure to enter a Stream Key into the OBS Studio settings. It can be");
Console.WriteLine("any value or you can repeat the accessToken used in the ingest URL path.");
Console.WriteLine();

الحصول على معاينة عنوان URL

استخدم ⁧previewEndpoint⁩ في المعاينة والتحقق من تلقي الإدخال من أداة الترميز.

هام

تأكد من تدفق الفيديو إلى عنوان URL للمعاينة قبل المتابعة.

// Use the previewEndpoint to preview and verify that the input from the encoder is actually
// being received The preview endpoint URL also support the addition of various format strings
// for HLS (format=m3u8-cmaf) and DASH (format=mpd-time-cmaf) for example. The default manifest
// is Smooth.
string previewEndpoint = liveEvent.Data.Preview.Endpoints.First().Uri.ToString();
Console.WriteLine($"The preview URL is:");
Console.WriteLine(previewEndpoint);
Console.WriteLine();
Console.WriteLine($"Open the live preview in your browser and use the Azure Media Player to monitor the preview playback:");
Console.WriteLine($"https://ampdemo.azureedge.net/?url={HttpUtility.UrlEncode(previewEndpoint)}&heuristicprofile=lowlatency");
Console.WriteLine();
Console.WriteLine("Start the live stream now, sending the input to the ingest URL and verify");
Console.WriteLine("that it is arriving with the preview URL.");
Console.WriteLine("IMPORTANT: Make sure that the video is flowing to the Preview URL before continuing!");
Console.WriteLine("Press enter to continue...");
Console.ReadLine();

إنشاء الأحداث المباشرة والمخرجات المباشرة وإدارتها

بعد دفق البث المباشر من أداة الترميز المحلية إلى الحدث المباشر، يمكنك بدء الحدث المباشر عن طريق إنشاء أصل وإخراج مباشر ومحدد موقع البث. يتم أرشفة الدفق وهو متاح للمشاهدين من خلال نقطة نهاية البث.

ستتعرف في القسم التالي على إنشاء الأصول والإنتاج المباشر.

إنشاء أصل

إنشاء أصل للإخراج المباشر من أجل استخدامه.

// Create an Asset for the Live Output to use. Think of this as the "tape" that will be recorded
// to. The asset entity points to a folder/container in your Azure Storage account
Console.Write($"Creating the output Asset '{assetName}'...".PadRight(60));
var asset = (await mediaServicesAccount.GetMediaAssets().CreateOrUpdateAsync(
    WaitUntil.Completed,
    assetName,
    new MediaAssetData
    {
        Description = "My video description"
    })).Value;
Console.WriteLine("Done");

إنشاء حدثًا مباشرًا

تبدأ المخرجات المباشرة عند إنشائها وتتوقف حال حذفها. عند حذف الإخراج المباشر، لن تحذف أصل الإخراج أو المحتوى في الأصل. يتوفر الأصل مع التسجيل للبث عند الطلب طالما أنه موجود وهناك محدد موقع دفق مرتبط به.

// Create the Live Output - think of this as the "tape recorder for the live event". Live
// outputs are optional, but are required if you want to archive the event to storage, use the
// asset for on-demand playback later, or if you want to enable cloud DVR time-shifting. We will
// use the asset created above for the "tape" to record to.
Console.Write($"Creating Live Output...".PadRight(60));
var liveOutput = (await liveEvent.GetMediaLiveOutputs().CreateOrUpdateAsync(
    WaitUntil.Completed,
    liveOutputName,
    new MediaLiveOutputData
    {
        AssetName = asset.Data.Name,
        // The HLS and DASH manifest file name. This is recommended to
        // set if you want a deterministic manifest path up front.
        // archive window can be set from 3 minutes to 25 hours.
        // Content that falls outside of ArchiveWindowLength is
        // continuously discarded from storage and is non-recoverable.
        // For a full event archive, set to the maximum, 25 hours.
        ManifestName = manifestName,
        ArchiveWindowLength = TimeSpan.FromHours(1)
    })).Value;
Console.WriteLine("Done");

إنشاء محدد موقع البث

ملاحظة

عند إنشاء حساب Media Services الخاص بك، تتم إضافة نقطة نهاية تدفق افتراضية إلى حسابك في الحالة المتوقفة. لبدء بث المحتوى الخاص بك والاستفادة من ⁧⁩التعبئة الديناميكية⁧⁩ والتشفير الديناميكي، ينبغي أن تكون نقطة النهاية المتدفقة التي تريد بث المحتوى منها في حالة التشغيل.

يمكنك نشر أصل عن طريق إنشاء محدد موقع دفق. يمكن عرض الحدث المباشر (حتى طول نافذة DVR) حتى انتهاء صلاحية محدد موقع البث أو حذفه، أيهما يأتي أولا. إنها الطريقة التي تجعل بها الفيديو متاحا لجمهورك المشاهد لمشاهدة البث المباشر عند الطلب. يمكن استخدام عنوان URL نفسه لمشاهدة الحدث المباشر أو نافذة DVR أو الأصل عند الطلب عند انتهاء الحدث المباشر وحذف الإخراج المباشر.

var streamingLocator = (await mediaServicesAccount.GetStreamingLocators().CreateOrUpdateAsync(
    WaitUntil.Completed,
    streamingLocatorName,
    new StreamingLocatorData
    {
        AssetName = asset.Data.Name,
        StreamingPolicyName = "Predefined_ClearStreamingOnly",
        Filters =
        {
            filter.Data.Name
        }
    })).Value;

شاهد الحدث

تشغيل التعليمات البرمجية. استخدم عناوين URL المتدفقة للإخراج لمشاهدة الحدث المباشر. انسخ عنوان URL لمحدد موقع البث. يمكنك استخدام مشغل وسائط من اختيارك. يمكنك استخدام موقع العرض التوضيحي ل Media Player لاختبار البث الخاص بك. أدخل عنوان URL في حقل URL وحدد Update player.

مراقبة الأحداث المباشرة باستخدام Event Grid ومراكز الأحداث

يمكن أن يستخدم نموذج المشروع شبكة الأحداث ومراكز الأحداث لمراقبة الحدث المباشر. يمكنك إعداد شبكة الأحداث واستخدامها باستخدام ما يلي

لتمكين المراقبة:

  1. استخدم مدخل Microsoft Azure لإنشاء مساحة اسم مراكز الأحداث ومراكز الأحداث
    1. ابحث عن "مراكز الأحداث" باستخدام مربع النص في أعلى مدخل Microsoft Azure.
    2. حدد Event Hub من القائمة، ثم اتبع الإرشادات لإنشاء مساحة اسم مراكز الأحداث.
    3. انتقل إلى مورد مساحة اسم مراكز الأحداث.
    4. حدد Event Hubs من قسم Entities في قائمة المدخل.
    5. إنشاء مراكز الأحداث في مساحة اسم مراكز الأحداث.
    6. انتقل إلى مورد مراكز الأحداث.
    7. حدد Access control ثم Add، ثم Add role assignment.
    8. حدد Azure Event Hubs Data Receiver ثم امنح حق الوصول إلى نفسك.
    9. حدد Access control ثم Add، ثم Add role assignment.
    10. حدد Azure Event Hubs Data Sender ثم امنحه إلى الهوية المدارة التي تم إنشاؤها لحساب Media Services.
  2. استخدم مدخل Microsoft Azure لإنشاء حساب Azure Storage.
    1. بعد إنشاء حساب التخزين، انتقل إلى مورد حساب التخزين.
    2. حدد Access control ثم Add، ثم Add role assignment.
    3. حدد Storage Blob Data Contributor ثم امنح هذا الوصول لنفسك.
  3. إنشاء اشتراك حدث
    1. انتقل إلى حساب Media Services.
    2. حدد الأحداث من قائمة المدخل.
    3. حدد ‎+ Event Subscription.
    4. أدخل اسم اشتراك واسم مقالة النظام.
    5. قم بتعيين Endpoint Type إلى Event Hub.
    6. تعيين مراكز الأحداث إلى مراكز الأحداث التي تم إنشاؤها مسبقا وتعيين الهوية المدارة إلى الهوية التي تم منحها مسبقا وصول المرسل إلى مراكز الأحداث
  4. تحديث الملف appsetttings.json.
    1. تعيين EVENT_HUB_NAMESPACE إلى الاسم الكامل لمساحة الاسم. يجب أن يكون مشابها ل myeventhub.servicebus.windows.net.
    2. تعيين EVENT_HUB_NAME.
    3. تعيين AZURE_STORAGE_ACCOUNT_NAME.

قم بتشغيل العينة مرة أخرى. مع تمكين تكامل مراكز الأحداث، تسجل العينة الأحداث عندما يتصل برنامج الترميز ويفصل عن الحدث المباشر. يتم أيضا تسجيل أحداث أخرى مختلفة.

بعد تشغيل العينة، احذف مراكز الأحداث وحساب التخزين إذا لم تعد هناك حاجة إليها.

نظف الموارد في حساب خدمات الوسائط

إذا انتهيت من تدفق الأحداث وأردت تنظيف الموارد المقدمة في وقت سابق، استخدم الإجراء التالي:

  1. إيقاف البث من أداة الترميز.
  2. أوقف الحدث المباشر. بعد إيقاف الحدث المباشر، لن تتحمل أي رسوم. عندما تحتاج إلى بدء تشغيله مرة أخرى، يمكن استخدام عنوان URL نفسه حتى لا تحتاج إلى إعادة تكوين أداة الترميز الخاصة بك.
  3. أوقف نقطة نهاية البث، إلا إذا كنت تريد الاستمرار في توفير أرشيف الحدث المباشر كتدفق عند الطلب. إذا كان الحدث المباشر في حالة توقف، فلن تتحمل أي رسوم.
if (liveOutput != null)
{
    Console.Write("Deleting the Live Output...".PadRight(60));
    await liveOutput.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (liveEvent?.Data.ResourceState == LiveEventResourceState.Running)
{
    Console.Write("Stopping the Live Event...".PadRight(60));
    await liveEvent.StopAsync(WaitUntil.Completed, new LiveEventActionContent() { RemoveOutputsOnStop = true });
    Console.WriteLine("Done");
}

if (liveEvent != null)
{
    Console.Write("Deleting the Live Event...".PadRight(60));
    await liveEvent.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (streamingLocator != null)
{
    Console.Write("Deleting the Streaming Locator...".PadRight(60));
    await streamingLocator.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (asset != null)
{
    Console.Write("Deleting the Asset...".PadRight(60));
    await asset.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

نظف الموارد المتبقية

إذا لم تعد بحاجة إلى خدمات الوسائط وحسابات التخزين التي قمت بإنشائها لهذا البرنامج التعليمي، فاحذف مجموعة الموارد التي قمت بإنشائها سابقا.

شغّل أمر CLI التالي:


az group delete --name amsResourceGroup

الحصول على التعليمات والدعم

يمكنك الاتصال بخدمات الوسائط بأسئلة أو اتباع تحديثاتنا بإحدى الطرق التالية: