يوفر Brightcove دعمًا نشطًا لأحدث إصدار iOS SDK على أحدث إصدار عام لإصدارات iOS التالية:
يوفر Brightcove دعمًا سلبيًا لإصدارات iOS التالية:
تمت ترجمة Core SDK للغة العربية (ar)، والإنجليزية (en)، والفرنسية (fr)، والألمانية (de)، واليابانية (ja)، والكورية (ko)، والإسبانية (es)، والصينية المبسطة (zh-Hans) والتقليدية. الصينية (zh هانت). للحصول على فائدة الترجمة، يجب أيضًا ترجمة تطبيقك لنفس اللغة والإعدادات المحلية. راجع قسم الترجمة المخصصة للحصول على معلومات إضافية.
يتم إصدار جميع مكونات SDK - الإطارات الأساسية والمكونات الإضافية - بنفس رقم الإصدار. عند ترقية أي مكون واحد، قم بترقية جميع المكونات إلى نفس الإصدار.
بالنسبة للمشروعات التي تستخدم Xcode 12 على Apple Silicon M1 وUniversal Frameworks (.framework)، يتم إرجاع خطأ في البناء عند إنشاء المشروع لمحاكي Arm64.
*ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64*
لإنشاء محاكي Arm64، تأكد من إضافة arm64
إلى إعداد إنشاء "البنيات المستبعدة" Any iOS Simulator SDK
في علامة التبويب "إعدادات البناء" لهدف التطبيق الخاص بك.
يضيف الإصدار 6.10.0 من Brightcove Player SDK مواصفات فرعية للنواة وكل مكون إضافي لدعم XCFrameworks. القيمة الافتراضية لكل مواصفات فرعية هي /XCFramework
.
اسم بودسبيك | أسماء المواصفات الفرعية |
---|---|
Brightcove-Player-Core | Brightcove-Player-Core/Framework Brightcove-Player-Core/XCFramework |
Brightcove-Player-DAI | Brightcove-Player-DAI/Framework Brightcove-Player-DAI/XCFramework |
Brightcove-Player-FreeWheel | Brightcove-Player-FreeWheel/Framework Brightcove-Player-FreeWheel/XCFramework |
Brightcove-Player-GoogleCast | Brightcove-Player-GoogleCast/Framework Brightcove-Player-GoogleCast/XCFramework |
Brightcove-Player-IMA | Brightcove-Player-IMA/Framework Brightcove-Player-IMA/XCFramework |
Brightcove-Player-Omniture | Brightcove-Player-Omniture/Framework Brightcove-Player-Omniture/XCFramework |
Brightcove-Player-Pulse | Brightcove-Player-Pulse/Framework Brightcove-Player-Pulse/XCFramework |
Brightcove-Player-SSAI | Brightcove-Player-SSAI/Framework Brightcove-Player-SSAI/XCFramework |
Brightcove-Player-OpenMeasurement | - |
يقوم الإصدار 6.12.0 من Brightcove Player SDK بتحديث مواصفات podspecs Brightcove-Player-FreeWheel
و Brightcove-Player-Omniture
لتثبيت الإصدار الديناميكي من BrightcovePlayerSDK
.
اسم بودسبيك | نوع الإطار | التبعية |
---|---|---|
Brightcove-Player-Core | متحرك | - |
Brightcove-Player-DAI (متاح منذ 6.12.7) | متحرك | Brightcove-Player-Core |
Brightcove-Player-FreeWheel | متحرك | Brightcove-Player-Core لنظام iOS، Brightcove-Player-Core لنظام تشغيل tvOS |
Brightcove-Player-GoogleCast | ثابت | Brightcove-Player-Core |
Brightcove-Player-IMA | متحرك | Brightcove-Player-Core |
Brightcove-Player-Omniture | متحرك | Brightcove-Player-Core |
Brightcove-Player-Pulse | متحرك | Brightcove-Player-Core |
Brightcove-Player-SSAI | متحرك | Brightcove-Player-Core, Brightcove-Player-OpenMeasurement (فقط للقياس المفتوح) |
Brightcove-Player-OpenMeasurement (متوفر منذ 6.10.0) | متحرك | - |
تم دمج دعم مقاطع الفيديو المحمية بواسطة FairPlay في إطار عمل BrightcovePlayerSDK الأساسي. ارجع إلى دليل FairPlay للحصول على التفاصيل الكاملة حول استخدام FairPlay مع Brightcove Native Player SDK.
تم دمج دعم Sidecar Subtitles في إطار عمل BrightcovePlayerSDK الأساسي. للحصول على تفاصيل كاملة حول استخدام Sidecar Subtitles مع Brightcove Native Player SDK، راجع دليل Sidecar Subtitles.
منذ الإصدار 6.0.0، تسمح لك Brightcove Native Player SDK بتنزيل مقاطع فيديو HLS، بما في ذلك تلك المحمية بتشفير FairPlay، لتشغيلها لاحقًا، سواء عبر الإنترنت أو دون الاتصال بالإنترنت. راجع دليل مطور التطبيق للحصول على التفاصيل الكاملة:
دليل مطور تطبيقات iOS لتنزيل الفيديو وتشغيله دون الاتصال بالإنترنت باستخدام FairPlay
يوفر برنامج Brightcove Player SDK حزم التثبيت لنظامي التشغيل iOS وtvOS كمكتبات ديناميكية مجمعة كإطارات عمل وXCFrameworks. يتم دعم النشر على نظام التشغيل iOS 12.0 والإصدارات الأحدث.
يمكنك استخدام CocoaPods لإضافة Brightcove Player SDK إلى مشروعك. يمكنك العثور على أحدث إصدار من مواصفات Brightcove-Player-Core
هنا. يدعم podspec كلاً من iOS وtvOS.
عند استخدام Brightcove CocoaPods في مشروعك، أضف source 'https://github.com/brightcove/BrightcoveSpecs.git'
إلى بداية ملف Podfile الخاص بك.
اسم.
source ' https://github.com/CocoaPods/Specs '
source ' https://github.com/brightcove/BrightcoveSpecs.git '
platform :ios, ' 12.0 '
use_frameworks !
target ' MyVideoPlayer ' do
pod ' Brightcove-Player-Core '
end
يمكن تثبيت الإطار عن طريق إلحاق المواصفات الفرعية /Framework
بالجراب.
source ' https://github.com/CocoaPods/Specs '
source ' https://github.com/brightcove/BrightcoveSpecs.git '
platform :ios, ' 12.0 '
use_frameworks !
target ' MyVideoPlayer ' do
pod ' Brightcove-Player-Core/Framework '
end
عند تحديث التثبيت الخاص بك، من الجيد تحديث النسخة المحلية من مستودع BrightcoveSpecs الخاص بك بحيث يكون لديك أحدث مواصفات podspecs محليًا، تمامًا كما تفعل مع مستودع CococaPods الرئيسي الخاص بك. عادةً، إذا قمت بتشغيل pod update
في الوحدة الطرفية، فسيحدث هذا تلقائيًا، أو بدلاً من ذلك، يمكنك التحديث بشكل صريح باستخدام pod repo update
.
لإضافة Brightcove Player SDK إلى مشروعك يدويًا:
BrightcovePlayerSDK.framework
أو BrightcovePlayerSDK.xcframework
إلى مشروعك. تأكد من استخدام الإصدار المطابق لهدفك، iOS أو tvOS.BrightcovePlayerSDK.framework
/ BrightcovePlayerSDK.xcframework
bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. حدد "تشغيل البرنامج النصي فقط عند التثبيت". سيؤدي هذا إلى إزالة البنى غير الضرورية من الإصدار، وهو أمر مهم لتقديم متجر التطبيقات. لم تعد هذه الخطوة ضرورية عند استخدام XCFramework.bash ${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/BrightcovePlayerSDK.framework/strip-frameworks.sh
. حدد "تشغيل البرنامج النصي فقط عند التثبيت". سيؤدي هذا إلى إزالة البنى غير الضرورية من الإصدار، وهو أمر مهم لتقديم متجر التطبيقات.arm64
إلى إعداد إنشاء "البنيات المستبعدة" Any iOS Simulator SDK
.كمرجع، إليك جميع مكونات SDK وعناوين URL المقابلة لمساعدتك في تحديد موقع أحدث الإصدارات وتنزيلها:
عنصر | عنوان URL |
---|---|
Brightcove-Player-Core | https://github.com/brightcove/brightcove-player-sdk-ios/tags |
Brightcove-Player-DAI | https://github.com/brightcove/brightcove-player-sdk-ios-dai/tags |
Brightcove-Player-FreeWheel | https://github.com/brightcove/brightcove-player-sdk-ios-fw/tags |
Brightcove-Player-GoogleCast | https://github.com/brightcove/brightcove-player-sdk-ios-googlecast/tags |
Brightcove-Player-IMA | https://github.com/brightcove/brightcove-player-sdk-ios-ima/tags |
Brightcove-Player-Omniture | https://github.com/brightcove/brightcove-player-sdk-ios-omniture/tags |
Brightcove-Player-Pulse | https://github.com/brightcove/brightcove-player-sdk-ios-pulse/tags |
Brightcove-Player-SSAI | https://github.com/brightcove/brightcove-player-sdk-ios-ssai/tags |
لإضافة Brightcove Player SDK إلى مشروعك باستخدام Swift Package Manager:
https://github.com/brightcove/brightcove-player-sdk-ios.git
ملاحظة: يتم دعم XCFramework الديناميكي فقط لبرنامج Swift Package Manager.
يمكن استيراد Brightcove Player SDK لنظام iOS باستخدام:
import BrightcovePlayerSDK;
تشغيل الفيديو باستخدام Brightcove Player SDK لنظام iOS:
// ** Customize these values with your own account information **
let kAccountId = " ... "
let kPolicyKey = " ... "
let kVideoId = " ... "
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = sdkManager . createPlaybackController ( )
self . playbackController = playbackController // store this to a strong property
view . addSubview ( playbackController . view )
let playbackService = BCOVPlaybackService ( withAccountId : kAccountId ,
policyKey : kPolicyKey )
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : kVideoId
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
if let video {
self . playbackController ? . setVideos ( [ video ] )
self . playbackController ? . play ( )
}
}
تحتاج إلى منع تحرير وحدة التحكم تلقائيًا في نهاية الطريقة. إحدى الطرق الشائعة للقيام بذلك هي تخزين مرجع لوحدة التحكم في متغير مثيل قوي.
منذ الإصدار 5.1.0، تم دمج Brightcove PlayerUI بالكامل في إطار عمل Core SDK. يوفر PlayerUI مجموعة كاملة الميزات من عناصر التحكم للتشغيل والإعلان، بمجرد إخراجها من الصندوق.
تتميز واجهة PlayerUI بسرعة الإعداد، وتعرض عناصر التحكم في الإعلانات لـ SSAI وPulse وFreeWheel، ويمكن تخصيصها عن طريق إنشاء تخطيطاتك الخاصة.
اتبع الإرشادات أدناه لإعداد عناصر تحكم PlayerUI.
قم بإنشاء خاصية في UIViewController لتتبع ملف BCOVPUIPlayerView. سيحتوي BCOVPUIPlayerView على عرض وحدة التحكم في التشغيل وعرض عناصر التحكم.
// PlayerUI's Player View
var playerView : BCOVPUIPlayerView ?
قم بإنشاء BCOVPUIBasicControlView، ثم BCOVPUIPlayerView. هذا هو المكان الذي نربط فيه وحدة التحكم في التشغيل (وبالتالي جميع مقاطع الفيديو التي يتم تشغيلها) بعناصر التحكم.
// Create and configure Control View.
let controlView = BCOVPUIBasicControlView . withVODLayout ( )
playerView = BCOVPUIPlayerView ( playbackController : self . playbackController , options : nil )
// Add BCOVPUIPlayerView to your video view.
if let playerView {
videoView . addSubview ( playerView )
}
ستحتاج إلى إعداد التخطيط لعرض المشغل، ويمكنك القيام بذلك باستخدام التخطيط التلقائي أو أسلوب Springs & Struts الأقدم.
قم بتعيين عرض المشغل ليتوافق مع حاوية الفيديو من تخطيطك ( videoView
) عند تغيير حجمه.
playerView . frame = videoView . bounds
playerView . autoresizingMask = [ . flexibleHeight , . flexibleWidth ]
قم بتعيين translatesAutoresizingMaskIntoConstraints
في BCOVPUIPlayerView إلى false
.
playerView . translatesAutoresizingMaskIntoConstraints = false
ثم قم بإضافة القيود الخاصة بالتخطيط؛ ضبط نقاط التثبيت العلوية واليمنى واليسرى والسفلية لبرنامج BCOVPUIPlayerView الخاص بك لتساوي تلك الخاصة بـ videoView
NSLayoutConstraint . activate ( [
playerView . topAnchor . constraint ( equalTo : videoView . topAnchor ) ,
playerView . rightAnchor . constraint ( equalTo : videoView . rightAnchor ) ,
playerView . bottomAnchor . constraint ( equalTo : videoView . bottomAnchor ) ,
playerView . leftAnchor . constraint ( equalTo : videoView . leftAnchor )
] )
تسمح لك فئة BCOVPUIPlayerViewOptions
بتخصيص بعض سلوكيات BCOVPlayerUI عند التهيئة. يمكنك تخصيص ما يلي:
jumpBackInterval
الوقت بالثواني الذي سيرجع فيه اللاعب عند الضغط على زر القفز للخلف.
hideControlsInterval
الوقت بالثواني بعد حدث اللمس الأخير، قبل إخفاء عناصر التحكم.
hideControlsAnimationDuration
الوقت بالثواني الذي تستغرقه عناصر التحكم لتحريكها إلى مخفية.
showControlsAnimationDuration
الوقت بالثواني الذي يستغرقه تحريك عناصر التحكم لتكون مرئية.
إعداد learnMoreButtonBrowserStyle
الذي يحدد ما إذا كان النقر على زر "معرفة المزيد" الموجود على الإعلان سيعرض رابط النقر في متصفح خارجي (الإعداد الافتراضي) أو متصفح داخلي.
presentingViewController
الفئة الفرعية UIViewController المستخدمة لتقديم وحدات تحكم العرض الأخرى (مثل وحدة التحكم في عرض تحديد التسميات التوضيحية المغلقة).
automaticControlTypeSelection
ما إذا كنت تريد أن يقوم BCOVPUIPlayerView
باختيار نوع BCOVPUIBasicControlView
تلقائيًا بناءً على نوع الوسائط أم لا. عندما يتم تعيين هذه القيمة إلى true
، سيتم تجاهل الخاصية BCOVPUIBasicControlView
التي تم تمريرها إلى مُهيئ BCOVPUIPlayerView
.
فيديو + تيارات الصوت
basicControlViewWithVODLayout
basicControlViewWithLiveLayout
basicControlViewWithLiveDVRLayout
تيارات الصوت فقط
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
ملاحظة: يقوم automaticControlTypeSelection
باختيار التخطيطات من تلك التي يوفرها BCOVPlayerUI، وبالتالي، سيتم الكتابة فوق عناصر التحكم والتخطيطات المخصصة؛ automaticControlTypeSelection
وتخصيص واجهة المستخدم للمشغل غير متوافقين.
يمكن ضبط الخيارات باستخدام الطريقة التالية:
let manager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = manager . createPlaybackController ( )
let options = BCOVPUIPlayerViewOptions ( )
options . jumpBackInterval = 5
let playerView = BCOVPUIPlayerView ( playbackController : playbackController ,
options : options )
يتم توفير ثلاثة تخطيطات لدعم أنواع مختلفة من الفيديو:
BCOVPUIControlLayout basicVODControlLayout
هو تخطيط أساسي لتدفقات الفيديو العامة عند الطلب.
BCOVPUIControlLayout basicLiveControlLayout
هو تخطيط للفيديو المباشر.
BCOVPUIControlLayout basicLiveDVRControlLayout
هو تخطيط لدفق الفيديو المباشر مع عناصر تحكم DVR.
عادةً ما تقوم بتعيين تخطيط جديد على الفور بعد إنشاء BCOVPUIPlayerView
، ولكن يمكنك أيضًا تعيين تخطيط جديد في أي وقت. على سبيل المثال، يمكنك تعيين تخطيط VOD جديد مثل هذا:
playerView ? . controlsView . layout = BCOVPUIControlLayout . basicVOD ( )
بالإضافة إلى التخطيطات الافتراضية، يمكنك إنشاء تخطيطاتك المخصصة للغاية عن طريق إنشاء مثيل BCOVPUIControlLayout
جديد مع التصميم الخاص بك. ومع ذلك، لاحظ أن automaticControlTypeSelection
يختار التخطيطات من تلك التي يوفرها BCOVPlayerUI، وبالتالي، سيتم الكتابة فوق عناصر التحكم والتخطيطات المخصصة؛ automaticControlTypeSelection
وتخصيص واجهة المستخدم للمشغل غير متوافقين.
أولاً، قم بإنشاء عناصر التحكم التي ستدخل في تخطيطك باستخدام BCOVPUIBasicControlView layoutViewWithControlFromTag:width:elasticity:
. يتم حزم كل عنصر تحكم في BCOVPUILayoutView
الذي يحدد تباعد عنصر التحكم.
يمكنك تعيين width
كل طريقة عرض تخطيط إلى العرض الافتراضي (الذي يعتمد على نوع عنصر التحكم)، أو يمكنك تحديد العرض الخاص بك.
استخدم وسيطة elasticity
لتحديد مقدار تغيير عرض التخطيط الذي يحتوي على عنصر التحكم لملء شريط التحكم.
فيما يلي أمثلة لإنشاء مجموعة متنوعة من عناصر التحكم الأساسية.
// Create various standard layout views
// Standard play/pause button
let playbackLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonPlayback ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Standard jump back button
let jumpBackButtonLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonJumpBack ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Current time indicator
let currentTimeLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelCurrentTime ,
width : kBCOVPUILayoutUseDefaultValue
elasticity : 0.0 )
// Time separator - typically the '/' character
let timeSeparatorLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelTimeSeparator ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Video duration label
let durationLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . labelDuration ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// Slider bar used for seeking through the video
// The elasticity is set to 1 so that it can resize to fill available space
let progressLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . sliderProgress ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 1.0 )
// Closed caption button
// This button is initially hidden ('removed'), and will be shown
// if closed captions or audio tracks are available.
let closedCaptionLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonClosedCaption ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
closedCaptionLayoutView ? . isRemoved = true
// The full-screen button
let screenModeLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . buttonScreenMode ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
// AirPlay button
// This button is initially hidden ('removed'), and will be shown
// if AirPlay devices are available.
let externalRouteLayoutView = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewExternalRoute ,
width : kBCOVPUILayoutUseDefaultValue ,
elasticity : 0.0 )
externalRouteLayoutView ? . isRemoved = true
// Empty view - used as a spacer
let spacerLayoutView1 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 1.0 ,
elasticity : 1.0 )
// Empty view - used as a spacer
let spacerLayoutView2 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 1.0 ,
elasticity : 1.0 )
// Empty view - will have a custom UIImageView added as a subview
let logoLayoutView1 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 88.0 ,
elasticity : 1.0 )
// Empty view - will have a custom UIImageView added as a subview
let logoLayoutView2 = BCOVPUIBasicControlView . layoutViewWithControl ( from : BCOVPUIViewTag . viewEmpty ,
width : 36.0 ,
elasticity : 1.0 )
لاحظ أنه يمكنك أيضًا إنشاء طريقة عرض تخطيط فارغة، حيث يمكنك وضع طريقة العرض الخاصة بك (الشعار، التحكم، لا شيء، وما إلى ذلك). يوضح هذا الرمز كيفية وضع شعار UIImage
داخل logoLayoutView1 الذي أنشأناه أعلاه.
// Create logo image inside an image view for display in control bar.
let logoImage1 = UIImage ( named : " myLogo " )
let logoImageView1 = UIImageView ( image : logoImage1 )
logoImageView1 . autoresizingMask = [ . flexibleWidth , . flexibleHeight ]
logoImageView1 . contentMode = . scaleAspectFit
logoImageView1 . frame = logoLayoutView1 . frame
// Add image view to our empty layout view.
logoLayoutView1 . addSubview ( logoImageView1 )
الآن بعد أن تم تجميع العديد من عناصر التحكم في طرق عرض التخطيط، تم ترتيبها في صفائف، حيث يمثل كل منها سطرًا واحدًا من عناصر التحكم، أي شريط التحكم. لاحظ أنه يمكن أن يكون لديك تخطيطات مختلفة للاتجاهات الرأسية والأفقية، لذلك ستقوم عادةً بإعداد صفيفين مختلفين من أشرطة التحكم.
في التخطيط القياسي للاتجاه الأفقي، يتم ترتيب عناصر التحكم في صفيف واحد، ثم يتم تخزين هذا الصفيف في صفيف آخر يمثل مجموعة عناصر التحكم بأكملها.
let standardLayoutLine1 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
currentTimeLayoutView ,
timeSeparatorLayoutView ,
durationLayoutView ,
progressLayoutView ,
spacerLayoutView1 ,
logoLayoutView1 ,
spacerLayoutView2 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView
]
let standardLayoutLines = [ standardLayoutLine1 ]
في التخطيط المضغوط للاتجاه العمودي، يتم إنشاء مصفوفتين من عناصر التحكم، واحدة لكل سطر. يتم تجميع هذه المصفوفات في صفيف آخر يمثل التخطيط المضغوط.
لاحظ أنه يتم استخدام نفس الكائنات تمامًا لمعظم عناصر التحكم في كل تخطيط. عند الانتهاء من ذلك، والتبديل بين الاتجاهين الرأسي والأفقي، سيتم نقل الكائن إلى موضعه الجديد باستخدام الرسوم المتحركة السلسة.
let compactLayoutLine1 = [
currentTimeLayoutView ,
progressLayoutView ,
durationLayoutView
]
let compactLayoutLine2 = [
playbackLayoutView ,
jumpBackButtonLayoutView ,
spacerLayoutView1 ,
closedCaptionLayoutView ,
screenModeLayoutView ,
externalRouteLayoutView ,
logoLayoutView2
]
let compactLayoutLines = [
compactLayoutLine1 ,
compactLayoutLine2
]
أخيرًا، الآن بعد أن أصبح هناك تكوينان للتخطيط (أحدهما للعرض الكامل والآخر للعرض المضغوط)، يمكنك إنشاء كائن BCOVPUIControlLayout
جديد وتعيينه في عرض التحكم الخاص بالمشغل.
let customLayout = BCOVPUIControlLayout . init ( standardControls : standardLayoutLines ,
compactControls : compactLayoutLines )
playerView ? . controlsView . layout = customLayout
إذا كانت لديك عناصر تحكم تحتاج إلى إظهارها أو إخفائها بشكل متكرر، فيمكنك تعيين الخاصية removed
في طريقة عرض التخطيط لعنصر التحكم هذا. عندما تقوم بتغيير عناصر التحكم الخاصة بك، قم باستدعاء setNeedsLayout
على عنصر التحكم الخاص بـ playerView:
logoLayoutView1 ? . isRemoved = true
playerView ? . controlsView . setNeedsLayout ( )
يمكنك أيضًا تخصيص العديد من خصائص BCOVPUIControlLayout
العامة:
controlBarHeight
بتعيين حجم كل صف من عناصر التحكم.horizontalItemSpacing
بتعيين التباعد بين كل BCOVPUILayoutView
في كل شريط تحكم.compactLayoutMaximumWidth
مجموعة عناصر التحكم المستخدمة. إذا كان عرض التحكم أصغر من compactLayoutMaximumWidth
، فسيتم استخدام مجموعة التحكم المضغوطة، وإلا سيتم استخدام عناصر التحكم القياسية. لتغيير مجموعة عناصر التحكم التي يتم عرضها، يجب عليك إنشاء BCOVPUIControlLayout
جديد وتثبيته. يمكن تثبيت عناصر تحكم جديدة في أي وقت.
لمزيد من الأمثلة على تخصيص PlayerUI، يمكنك الاطلاع على نموذج التعليمات البرمجية في مجلد PlayerUI بمستودع BrightcoveOS GitHub:
https://github.com/BrightcoveOS/ios-player-samples
تشتمل مجموعة Brightcove Native Player SDK على عناصر تحكم مدمجة للتشغيل في نظام tvOS على Apple TV. للحصول على تفاصيل كاملة حول استخدام واجهة مستخدم TV Player المدمجة مع Brightcove Native Player SDK، راجع دليل مشغل التلفزيون الخاص بنا.
قم بتمكين وظيفة AirPlay عن طريق تعيين خاصية setAllowsExternalPlayback
في BCOVPlaybackController
على true
. سيتم عرض زر AirPlay في عناصر التحكم في التشغيل إذا تم العثور على أجهزة AirPlay على شبكتك.
حاليًا، IMA هو المكوّن الإضافي الوحيد للإعلان الذي يدعم AirPlay وذلك فقط عند استخدام إعلانات ما قبل التشغيل و/أو إعلانات ما بعد التشغيل. قد يؤدي استخدام AirPlay مع المكونات الإضافية للإعلان Pulse أو SSAI أو FreeWheel إلى سلوك غير متوقع.
إذا كنت تريد أيضًا دعم AirPlay 2 والسماح باختيار أجهزة متعددة لإخراج الصوت، فسيتعين عليك القيام ببعض الأشياء الإضافية. أولاً، ستحتاج إلى تكوين AVAudioSession بحيث يمكنك تعيين routeSharingPolicy
. على سبيل المثال:
do {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , mode : . moviePlayback , policy : . longFormVideo )
} catch {
print ( " Error setting AVAudioSession category " )
}
ستحتاج أيضًا إلى تكوين أمر تشغيل واحد على الأقل عبر MPRemoteCommandCenter
. على أقل تقدير، ستحتاج إلى تكوين كل من pauseCommand
و playCommand
. على سبيل المثال:
let center = MPRemoteCommandCenter . shared ( )
center . pauseCommand . addTarget { _ in
playbackController . pause ( )
return . success
}
center . playCommand . addTarget { _ in
playbackController . play ( )
return . success
}
ستستفيد الأجهزة من AVRoutePickerView
الذي يحتوي على طريقتين للتفويض. يتم تمرير أساليب التفويض هذه إلى BCOVPUIPlayerViewDelegate
. الطرق هي:
func routePickerViewDidEndPresentingRoutes ( _ routePickerView : AVRoutePickerView )
func routePickerViewWillBeginPresentingRoutes ( _ routePickerView : AVRoutePickerView )
يتوفر AVRouteDetector
المستخدم لاكتشاف مسارات AirPlay على كائن BCOVPUIBasicControlView
حتى تتمكن من تمكين خاصية routeDetectionEnabled
الخاصة به أو تعطيلها حسب الحاجة.
وفقًا لوثائق Apple: " يؤدي اكتشاف المسار إلى زيادة استهلاك الطاقة بشكل كبير ويجب إيقاف تشغيله عندما لا تعود هناك حاجة إليه. "
playerView ? . controlsView . routeDetector . isRouteDetectionEnabled = false
لمزيد من المعلومات حول دمج AirPlay 2 في تطبيقك، يرجى الاطلاع على الحصول على AirPlay 2 في وثائق تطبيقك.
يتضمن Native Player SDK دعمًا للعرض التفاعلي لمقاطع الفيديو الكروية بزاوية 360 درجة. يجب وضع علامة على مقاطع الفيديو بزاوية 360 درجة باستخدام خاصية حقل "العرض" التي تحتوي على القيمة "متساوي المستطيلات". سيتم تحميل مقاطع الفيديو هذه وتشغيلها بنفس طريقة تشغيل مقاطع الفيديو الأخرى، ولكن سيتم عرضها في CAMetalLayer بدلاً من AVPlayerLayer.
ملاحظة: "متساوي المستطيل" هو تنسيق العرض الوحيد المدعوم لمقاطع الفيديو المصدر بزاوية 360 درجة في الوقت الحالي.
تحتوي واجهة PlayerUI أيضًا على دعم مدمج للفيديو 360، مما يوفر إيماءات التحريك الافتراضية، واكتشاف الحركة الجيروسكوبية للعرض، وزر فيديو 360 جديد يظهر عند تشغيل أصل فيديو 360. يظهر هذا الزر فقط على أجهزة iPhone، ويتيح لك التبديل بين العرض العادي وعرض "نظارات الواقع الافتراضي"، حيث يتم تقسيم الشاشة إلى قسمين، مع عرض نفس المشهد لكل عين بحيث يمكن استخدام الجهاز في وضع الرأس. التكوين المثبت. على أجهزة iPad، لا توجد حاجة إلى زر Video 360 لأنه لا يوجد سوى وضع واحد للتشغيل: اكتشاف الحركة مع دعم إيماءات التحريك.
يعد دعم الفيديو 360 أمرًا بسيطًا مثل تشغيل الفيديو. عند اكتشاف خاصية حقل "العرض"، ستتعامل Native Player SDK تلقائيًا مع إعداد الفيديو وعرضه في Metal، وتثبيت زر Video 360 عندما يكون ذلك مناسبًا.
إذا كنت تقوم بتشغيل مقاطع فيديو بزاوية 360 درجة خارج Video Cloud، فتأكد من إضافة خاصية "projection" إلى كائن BCOVVideo
بالقيمة "equequrectangular".
لتوفير أفضل تجربة للمستخدم مع وضع نظارات الواقع الافتراضي، يجب عليك استخدام طريقة BCOVPUIPlayerViewDelegate
لاكتشاف متى يتم تمكين هذا الوضع. يتيح لك هذا إجبار الجهاز على الاتجاه الأفقي (نظرًا لأن هذا هو الاتجاه الوحيد المنطقي لعرض VR Goggles).
يوضح التعليمة البرمجية التالية كيف يمكنك التعامل مع تغيير الاتجاه القسري عند التبديل ذهابًا وإيابًا بين العرض العادي 360 ووضع نظارات الواقع الافتراضي.
// Set this to YES when displaying a VR goggles video
var landscapeOnly = false
// UIViewController override:
// Lets us control the orientation of the device
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
get {
if landscapeOnly {
return . landscape
}
return . all
}
}
// BCOVPUIPlayerViewDelegate method
func didSetVideo360NavigationMethod ( _ navigationMethod : BCOVPUIVideo360NavigationMethod ,
projectionStyle : BCOVVideo360ProjectionStyle ) {
switch projectionStyle {
case . normal :
print ( " BCOVVideo360ProjectionStyleNormal " )
landscapeOnly = false
case . vrGoggles :
print ( " BCOVPUIVideo360NavigationDeviceMotionTracking " )
landscapeOnly = true
let currentDeviceOrientation = UIDevice . current . orientation
switch currentDeviceOrientation {
case . landscapeLeft ,
. landscapeRight :
// all good
break
default :
// switch orientation
UIDevice . current . setValue ( UIInterfaceOrientation . landscapeLeft . rawValue , forKey : " orientation " )
break
}
break
default :
break
}
UIViewController . attemptRotationToDeviceOrientation ( )
}
ستقوم واجهة PlayerUI بتثبيت الإيماءات للتعامل مع التنقل حول الفيديو بنطاق 360 درجة، ولكن إذا كنت تستخدم عناصر التحكم الخاصة بك، فيمكنك تعيين معلمات العرض للكاميرا الافتراضية بنفسك. تتيح لك خاصية viewProjection
الخاصة ببروتوكول BCOVPlaybackController
إمكانية تعيين هذه المعلمات. الخاصية عبارة عن فئة BCOVVideo360ViewProjection
مع إعدادات الكاميرا الافتراضية الأساسية مثل pan
tilt
والتكبير/ zoom
. لتغيير الإعدادات، قم بإنشاء نسخة من المثيل الحالي، وقم بتغيير الإعدادات على المثيل الجديد، ثم قم بتعيينه مرة أخرى إلى خاصية viewProjection
.
نقطة الدخول إلى Brightcove Player SDK لنظام iOS هي كائن BCOVPlayerSDKManager
المفرد. يتولى هذا المدير تسجيل مكونات المكونات الإضافية وبعض مهام التدبير المنزلي الأخرى، ولكنه يعمل في المقام الأول كمصنع للكائنات. تحصل وحدة التحكم في عرض تطبيقك على مرجع للمدير، وتستخدمه لإنشاء BCOVPlaybackController
. تعرض خاصية view
الخاصة بوحدة التحكم في التشغيل واجهة مستخدم (UIView) تحتوي على كائن AVPlayerLayer الذي يعرض في النهاية محتوى الفيديو الخاص بك على الشاشة. تقبل وحدة التحكم في التشغيل أيضًا BCOVPlaybackControllerDelegate
، والذي يمكنك تنفيذه للرد على أحداث تشغيل الفيديو المختلفة.
توفر وحدة التحكم في التشغيل طرقًا وخصائص للتأثير على تشغيل الفيديو الحالي. ومع ذلك، داخليًا، تقوم وحدة التحكم في التشغيل بتفويض كائن BCOVPlaybackSession
. تقوم جلسات التشغيل بالعمل الفعلي لإعداد محتوى الفيديو وتشغيله، وتحتوي على بيانات تعريف الفيديو و AVPlayer
. تحتوي وحدة التحكم في التشغيل على آليات للتقدم من جلسة التشغيل الحالية إلى جلسة التشغيل التالية، إما تلقائيًا في نهاية الفيديو، أو يدويًا باستخدام استدعاء الأسلوب. بمجرد تقدم وحدة التحكم في التشغيل إلى جلسة جديدة، يتم تجاهل الجلسة السابقة ولا يمكن استخدامها مرة أخرى.
هناك عنصران آخران لوحدة التحكم في التشغيل: BCOVPlaybackSessionProvider
وقائمة BCOVPlaybackSessionConsumer
s. كما يوحي الاسم، يكون موفر جلسة التشغيل مسؤولاً عن إنشاء جلسات التشغيل وتسليمها إلى وحدة التحكم في التشغيل. تقوم وحدة التحكم في التشغيل بعد ذلك بتسليم الجلسة إلى كل مستهلكي جلسة التشغيل في القائمة. تم تصميم كل من واجهات برمجة تطبيقات موفر الجلسة ومستهلك الجلسة للاستخدام بواسطة مطوري المكونات الإضافية، ولم يتم تفصيلهما في هذا المستند.
بالإضافة إلى وظيفة التشغيل التي توفرها الفئات الموضحة أعلاه، هناك عدد قليل من فئات القيمة. يتم استخدامها للاحتفاظ بالبيانات الخاصة بـ Player SDK لنظام التشغيل iOS. يتم وصف كل منها بمزيد من التفصيل في القسم الخاص بها أدناه.
يوفر Brightcove Player SDK لنظام iOS طرق التشغيل والإيقاف المؤقت والبحث على BCOVPlaybackController
. من المهم استخدام هذه الأساليب بدلاً من استخدام ما يعادلها من AVPlayer. في تطبيقاتها الافتراضية، تقوم هذه الكائنات بإعادة توجيه المكالمات مباشرة إلى الطريقة المقابلة على AVPlayer. ومع ذلك، إذا كنت تستخدم المكونات الإضافية، فقد تتجاوز السلوك الافتراضي لإضافة وظيفة. على سبيل المثال، إذا كنت تستخدم مكونًا إضافيًا للإعلان، فقد يؤدي استدعاء playbackController.play()
للمرة الأولى إلى تشغيل إعلان مسبق قبل بدء المحتوى. لمعرفة المزيد حول كيفية تجاوز المكون الإضافي للسلوك الافتراضي، يرجى الرجوع إلى كل مكون إضافي README.md أو عن طريق التحقق من ملحق الفئة على BCOVSessionProviderExtension
الذي قد يضيفه المكون الإضافي.
قد يؤدي استدعاء التشغيل أو الإيقاف المؤقت أو البحث على AVPlayer مباشرةً إلى حدوث سلوك غير محدد.
لتعيين معدل تشغيل مخصص لـ AVPlayer، يمكنك استخدام خاصية playbackRate
على BCOVPlaybackController
. من المهم أن تقوم بتعيين معدل التشغيل باستخدام هذه الخاصية بدلاً من تعيينه مباشرة على AVPlayer.
ستؤدي محاولة تعيين playbackRate
إلى قيمة 0 أو أقل إلى تعيين القيمة على 1.0. إذا كان currentItem
الخاص بـ AVPlayer لا يدعم canPlaySlowForward
(للقيم الأقل من 1) أو canPlayFastForward
(للقيم الأكبر من 1)، فسيتم استخدام معدل التشغيل الافتراضي 1.0. لن يتأثر تشغيل الإعلان.
إذا تم تعيين قيمة مخصصة لـ playbackRate
فسيتم تعيين audioTimePitchAlgorithm
لكل AVPlayerItem
على AVAudioTimePitchAlgorithmTimeDomain
. وبدلاً من ذلك، يمكنك تعيين القيمة الخاصة بك لخوارزمية audioTimePitchAlgorithm
مثل هذا:
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didReceive lifecycleEvent : BCOVPlaybackSessionLifecycleEvent ) {
if lifecycleEvent . eventType == kBCOVPlaybackSessionLifecycleEventReady {
session . player . currentItem ? . audioTimePitchAlgorithm = . varispeed
}
}
يمكنك قراءة المزيد عن audioTimePitchAlgorithm
هنا.
منذ الإصدار 6.12.0، استخدمت iOS SDK AVQueuePlayer الذي يتعامل مع التحميل المسبق للفيديو التالي في قائمة الانتظار.
ومع ذلك، قد ترغب في الحصول على مزيد من التحكم في التحميل المسبق لمقاطع الفيديو القادمة في قائمة التشغيل. أحد الأساليب الممكنة هو التخزين المؤقت المزدوج لقائمة مقاطع الفيديو باستخدام وحدتي تحكم في التشغيل، على سبيل المثال:
playbackController1.setVideos([videos.firstObject])
)playbackController:didProgressTo:
طريقة تفويض وحدة التحكم في التشغيل لتحديد ما إذا كان الفيديو الحالي قد تقدم بدرجة كافية إلى حيث تريد بدء التحميل المسبق للفيديو التاليللحصول على مثال عملي، يمكنك تنزيل تطبيق نموذج VideoPreloading الخاص بنا من مستودع عينات المشغلات الخاص بنا.
ملاحظة: قد ترغب في أن تأخذ في الاعتبار حجم الذاكرة المتوفرة على جهاز العميل وسرعة اتصاله. إذا لم تكن متصلة بشبكة Wifi، فقد يؤثر التحميل المسبق للفيديو على موارد شبكة الفيديو الحالية.
يوفر برنامج Brightcove Player SDK لنظام iOS للعملاء القدرة على إرفاق عدة عناوين URL وأنواع التسليم ( BCOVSource
) بمقطع فيديو واحد ( BCOVVideo
). على سبيل المثال، إذا تم استرداد مقاطع الفيديو الخاصة بك بواسطة خدمة التشغيل، فقد يكون هناك مزيج من إصدارات HLS أو MP4 لمقطع فيديو واحد، إلى جانب إصدارات HTTP وHTTPS. يتم تحديد أي من هذه المصادر التي سيتم تحديدها من خلال حظر سياسة اختيار المصدر. ستحدد سياسة تحديد المصدر الافتراضية أول HLS BCOVSource
في كل BCOVVideo
، مع تفضيل مصادر HTTPS على HTTP.
يمكن تجاوز تحديد المصدر عن طريق إنشاء BCOVBasicSessionProviderOptions
واستخدامه لإنشاء BCOVBasicSessionProvider
. على سبيل المثال:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let options = BCOVBasicSessionProviderOptions ( )
options . sourceSelectionPolicy = < policy >
let provider = sdkManager . createBasicSessionProvider ( withOptions : options )
let playbackController = sdkManager . createPlaybackController ( withSessionProvider : provider , viewStrategy : nil )
إذا لم تنجح سياسة التحديد الافتراضية هذه معك، فهناك بعض البدائل لتحديد المصدر:
في حالة استرداد مقاطع الفيديو من Video Cloud عبر خدمة التشغيل، قبل الاتصال بـ playbackController.setVideos()
، استخدم طريقة التحديث في BCOVVideo
لتحتوي فقط على المصدر الذي تريده (راجع قسم "القيم" لمزيد من المعلومات).
يمكنك استخدام الأسلوب المساعد [BCOVBasicSourceSelectionPolicy sourceSelectionHLSWithScheme:scheme]
لإنشاء سياسة تفضل نظامًا محددًا. هذه هي الطريقة المستخدمة لإنشاء سياسة اختيار المصدر الافتراضية التي تفضل HTTPS.
كما هو الحال مع تحديث كائن الفيديو، يمكنك أيضًا تنفيذ كتلة تحديد المصدر الخاصة بك.
options . sourceSelectionPolicy = { ( video : BCOVVideo ? ) -> BCOVSource ? in
< Check video . sources for source >
< Return source >
}
يرجى العلم أن هناك قيودًا على متجر التطبيقات فيما يتعلق باستخدام مقاطع فيديو MP4. تحقق من أحدث معلومات مطور Apple للحصول على التفاصيل.
يوفر برنامج Brightcove Player SDK لنظام iOS طريقة لضبط معدل البت المفضل لمقطع الفيديو. يمكنك إنشاء كائن BCOVPreferredBitrateConfig الذي يحتوي على خيارات معدل البت المطلوبة، بالإضافة إلى بعض التكوينات لوحدة تحكم العرض التي تم إنشاؤها لعرض الخيارات.
عنوان القائمة اختياري. خيارات معدل البت هي مجموعة من NSDictionary حيث يحتوي كل قاموس على مفتاح واحد: زوج القيمة. سيتم استخدام المفتاح كاسم للخيار، والقيمة هي رقم NSNumber مع معدل البت لهذا الخيار بوحدة بت في الثانية (بت في الثانية). معدلات البت التي تدخلها هي قيم يمكن تعيينها لمعدلات البت لعمليات الترحيل السري لأصول الفيديو الخاصة بك. يمكنك معرفة المزيد حول عمليات الترحيل السري في Ingest Profiles Best Practices.
هنا مثال:
let bitrates = [
[ " Auto " : NSNumber ( 0 ) ] ,
[ " Setting 1 " : NSNumber ( 518100 ) ] ,
[ " Setting 2 " : NSNumber ( 2596000 ) ]
]
let options = BCOVPUIPlayerViewOptions ( )
options . preferredBitrateConfig = BCOVPreferredBitrateConfig ( menuTitle : " Select an Option " ,
andBitrateOptions : bitrates )
عندما يحدد المستخدم النهائي أحد الخيارات، سيتم تعيين خاصية PeakBitRate المفضلة لـ AVPlayerItem الحالي على قيمة الخيار. إذا كان الفيديو موجودًا في قائمة تشغيل، فسيتم أيضًا تعيين قيمة PeakBitRate المفضلة للفيديو التالي الذي يتم تشغيله.
بعد تعيين قيمة غير الصفر لـ FavoritePeakBitRate، قد لا تلاحظ اختلافًا في الجودة حتى يصل AVPlayer إلى نهاية ذاكرة التخزين المؤقت الحالية الخاصة به.
يمكنك أيضًا استخدام configWithMenuTitle:bitrateOptions:andIndexofInitialSelection:
المُهيئ الذي يوفر القدرة على تعيين فهرس القيمة الأولية المفضلة لديك. يجب أن يرتبط الفهرس بفهرس الخيار المطلوب في مصفوفة bitrateOptions
.
يمكنك أيضًا استخدام الأسلوب setPreferredPeakBitRate:
على كائن BCOVPlaybackController
الخاص بك لتعيين معدل البت المفضل برمجيًا للجلسات الحالية والمستقبلية.
ملاحظة: يجب منح المستخدمين النهائيين طريقة للعودة إلى القيمة الافتراضية (0) لـ FavoritePeakBitRate. يمكنك القيام بذلك عن طريق توفير خيار بقيمة معدل بت 0. إذا لم تقم بتوفير خيار معدل بت 0، فسيتم إلحاق خيار "تلقائي" بقائمة الخيارات الخاصة بك للمستخدم النهائي.
يرجى الاطلاع على وثائق Apple حول PreferredPeakBitRate لمزيد من المعلومات.
توفر Brightcove Player SDK لنظام iOS آليتين للحصول على معلومات التشغيل. توفر وحدة التحكم في التشغيل خاصية تفويض تقوم بتنفيذ BCOVPlaybackControllerDelegate
. يمكن للمفوض تنفيذ هذه الطرق الاختيارية ليتم إعلامه ببيانات تعريف التشغيل مثل التقدم وتغييرات المدة والأحداث الأخرى. إذا تم تثبيت مكون إضافي للإعلان، فقد يستخدم أيضًا هذا المفوض لتوفير معلومات حول تشغيل الإعلان. يوفر أسلوب تفويض حدث دورة الحياة أحداثًا للإشارة إلى التغييرات في حالة التشغيل. على سبيل المثال، عندما ينتقل اللاعب من حالة الإيقاف المؤقت إلى حالة التشغيل، سيتم استدعاء أسلوب تفويض حدث دورة الحياة باستخدام الحدث kBCOVPlaybackSessionLifecycleEventPlay
. يتم الإعلان عن أحداث دورة الحياة الافتراضية في BCOVPlaybackSession
. تضيف المكونات الإضافية التي تقدمها Brightcove أحداثًا إضافية لدورة الحياة يتم تحديدها في كل مكون إضافي.
تسمح وحدة التحكم في التشغيل بمندوب واحد. في كثير من الحالات، سيكون هذا كافيا لاسترجاع المعلومات؛ يمكن لتطبيقات المفوض نشر القيم والأحداث إلى أجزاء مختلفة من التطبيق حسب الضرورة. في الحالات التي تتطلب عدة مفوضين، كما هو الحال عند تطوير مكون إضافي، يوفر مفوضو BCOVPlaybackSessionConsumer
وظائف مكافئة لطرق BCOVPlaybackControllerDelegate
، بما في ذلك بيانات الإعلان.
فيما يلي مثال على كيفية استخدام المرء BCOVPlaybackSessionConsumer
لإنشاء مكون إضافي للتحليلات:
class XYZAnalytics : NSObject , BCOVPlaybackSessionConsumer {
func playbackSession ( _ session : BCOVPlaybackSession , didProgressTo progress : TimeInterval ) {
//react to progress event
}
}
لاستخدام البرنامج المساعد:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let controller = sdkManager . createPlaybackController ( )
let analytics = XYZAnalytics ( )
controller . add ( analytics )
عندما يختبر التطبيق انقطاع الشبكة ، قد يتوقف AVPlayer
الذي يستخدمه BCOVPlaybackController
عن محاولة التعافي إذا استمر الانقطاع لفترة طويلة. في حالة حدوث ذلك ، سيتم استدعاء طريقة مندوب دورة الحياة بحدث kBCOVPlaybackSessionLifecycleEventFailedToPlayToEndTime
. عندما يحدث هذا الحدث ، لن يسترد التشغيل تلقائيًا. من أجل التعافي من هذا الحدث ، ستحتاج إلى اكتشاف متى تتعافى الشبكة في رمز العميل الخاص بك.
بمجرد تحديد أن الشبكة قد استردادت ، يمكنك استخدام playbackController.resumeVideo(at:withAutoPlay:)
لإعادة تخصيص اللاعب. ستحتاج إلى تتبع المكان الذي تريد استئنافه. سيبذل اللاعب قصارى جهده لقمع أحداث دورة الحياة وأحداث التقدم ، من أجل منع الإعلانات من إعادة التشغيل أو من التحليلات التي تتداخل معها.
عند استدعاء playbackController.resumeVideo(at:withAutoPlay:)
، سيرسل اللاعب حدث دورة الحياة من نوع kBCOVPlaybackSessionLifecycleEventResumeBegin
. سيتم إرسال kBCOVPlaybackSessionLifecycleEventResumeComplete
إذا نجح هذا الإجراء ، وإلا سيتم إرسال kBCOVPlaybackSessionLifecycleEventResumeFail
.
يجب أن تنتظر قبل استدعاء playbackController.resumeVideo(at:withAutoPlay:)
للمرة الثانية حتى تتلقى إما kBCOVPlaybackSessionLifecycleEventResumeComplete
أو kBCOVPlaybackSessionLifecycleEventResumeFail
من المكالمة السابقة. قد ترغب في فرض حد لإعادة المحاولة ، قبل إعطاء المستخدم رسالة مفادها أن شبكتهم غير مستقرة للغاية.
عندما لا يزال AVPlayer
قادرًا على الوصول إلى الشبكة ، ولكن تتنزه الفيديو لأن الشبكة بطيئة للغاية ، سيتم استدعاء طريقة مندوب دورة الحياة بحدث kBCOVPlaybackSessionLifecycleEventPlaybackStalled
. عندما يكون التشغيل قادرًا على الاستئناف ، سيتم استدعاء طريقة مندوب دورة الحياة بحدث kBCOVPlaybackSessionLifecycleEventPlaybackRecovered
. تغطي هذه الأحداث فقط الحالة التي توقف فيها التشغيل العادي ولا يغطي التخزين المؤقت الذي يحدث أثناء البحث أو الحمل الأولي للفيديو.
عندما يتم تحميل الفيديو مبدئيًا ، عند حدوث البحث ، أو عندما يتم تنسيق الشبكة بسبب شبكة بطيئة ، سيتم استدعاء طريقة مندوب دورة الحياة بحدث kBCOVPlaybackSessionLifecycleEventPlaybackBufferEmpty
. عندما يكون التشغيل قادرًا على الاستئناف ، سيتم استدعاء طريقة مندوب دورة الحياة بحدث kBCOVPlaybackSessionLifecycleEventPlaybackLikelyToKeepUp
.
باستثناء ما تم توثيقه بشكل صريح على خلاف ذلك ، لم يتم تصميم أي من الفصول الدراسية في اللاعب SDK لنظام التشغيل iOS ليتم فئة فرعية. قد يؤدي إنشاء فئة فرعية من أي فئة من فئة SDK غير مصممة صراحة ليتم فئة فرعية ، وخاصة أي من فئات القيمة ، إلى سلوك غير متوقع.
المعروفة أيضًا باسم "كائنات النموذج" ، يتم استخدام هذه الفئات ( BCOVPlaylist
، BCOVVideo
، BCOVSource
، BCOVCuePoint
، BCOVCuePointCollection
) لتمثيل البيانات في SDK لاعب IOS. من الأهمية بمكان أن نفهم أن أنواع البيانات هذه تعامل كقيم ، بدلاً من الهويات . بهذا ، نعني أنه إذا كان لديك حالتان من فئة القيمة التي لها نفس البيانات بالضبط ، فإنها تمثل نفس الفكرة أو القيمة ، على الرغم من أنها كائنين مختلفين من الناحية الفنية على عناوين ذاكرة منفصلة. بمعنى آخر ، لا ينبغي على رمز SDK ولا رمز العميل استخدام مقارنات الهوية ("مساواة المؤشر") مع كائنات القيمة. بدلاً من ذلك ، تنفذ كل فئة من الفئة -isEqual:
وتوفر طريقة مساواة خاصة بالفئة ، يجب استخدام أي منهما بدلاً من ذلك.
هذا سيء:
if myVideo == session . video // Could lead to bugs!
هذه جيدة (ومكافئة وظيفيا):
if myVideo . isEqual ( session . video )
if myVideo . isEqual ( toVideo : session . video )
قد يقوم الداخلية للاعب SDK لنظام التشغيل iOS بأشياء مثل القيم المذكرة أو إجراء نسخ دفاعية ، لذلك فإن الاعتماد على عنوان المؤشر للتحقق من المساواة سوف ينتهي بك الأمر مما يسبب لك الألم.
جودة أخرى من فصول القيمة في اللاعب SDK لنظام التشغيل iOS هي أنها غير قابلة للتغيير . بمجرد أن يكون لديك مثيل للقيمة ، يجب ألا تحاول تخريب هذا الثبات بأي شكل من الأشكال ، حيث قد يؤدي إلى سلوك غير متوقع. إذا كنت ترغب في "تعديل" قيمة في الكود الخاص بك بطريقة ما ، فإن اللجوء الوحيد الخاص بك هو إنشاء قيمة جديدة. كملاءمة لمساعدة العملاء على الحصول على قيم "معدلة" ، تقدم كل فئة من فئات القيمة -update:
الطريقة التي تأخذ كتلة تتيح لك العمل على نسخة قابلة للتغيير من القيمة الأصلية.
فيما يلي مثال على استخدام هذه الطريقة لإنشاء إصدار "معدّل" من كائن فيديو موجود ، ولكن بخصائص مختلفة:
let video1 : BCOVVideo // (properties include a key "foo" whose value is "bar")
let video2 = video1 . update { ( mutableVideo : BCOVMutableVideo ) in
mutableVideo . properties = [ " foo " : " quux " ]
}
if let foo1 = video1 . properties [ " foo " ] ,
let foo2 = video2 . properties [ " foo " ] {
print ( " foo is ( foo1 ) " ) // prints "foo is bar"
print ( " foo is ( foo2 ) " ) // prints "foo is quux"
}
// Both video1 and video2 are still immutable objects:
video1 . properties = [ " foo " : " fail " ] // causes compiler error
video2 . properties = [ " foo " : " fail " ] // causes compiler error
كما ترون في المثال ، لم يتم تغيير video1
بواسطة استدعاء طريقة -update
. بدلاً من ذلك ، تقوم هذه الطريقة بإرجاع نسخة من video1
، باستثناء التعديلات التي تم إجراؤها في جسم الكتلة. يجب ألا تسمح أبدًا للنسخة القابلة للتغيير بالهروب من الكتلة (مثل تعيينها إلى متغير __block
) ، بدلاً من ذلك ، استخدم الكائن غير القابل للتغيير الذي تم إرجاعه بواسطة طريقة -update
بعد إجراء تعديلاتك.
يوفر فئة خدمة التشغيل ، BCOVPlaybackService
، وظائف لاسترداد أصول الفيديو الخاصة بك وعلم التشغيل عبر واجهة برمجة تطبيقات BrightCove ، بما في ذلك البيانات الوصفية الغنية مثل المسارات النصية والمعاينة والأعراف المصغرة. يوضح المثال التالي كيفية استرداد مقطع فيديو بمعرف الفيديو. تتوفر أيضًا طرق لاسترداد مقطع فيديو أو قائمة تشغيل مع معرف المرجع لهذا الفيديو.
[ 1 ] let kPolicyKey = " ... "
let kAccountId = " ... "
let kVideoId = " ... "
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = sdkManager . createPlaybackController ( )
self . playbackController = playbackController
view . addSubview ( playbackController . view )
let playbackService = BCOVPlaybackService ( withAccountId : kAccountId ,
policyKey : kPolicyKey )
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : kVideoId
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
if let video {
self . playbackController ? . setVideos ( [ video ] )
self . playbackController ? . play ( )
}
}
ملاحظة: إذا كنت تستخدم خدمة تفويض التشغيل ، فيرجى مراجعة قسم هذه القراءة المتعلقة بهذه الميزة.
لطرق BCOVPlaybackService
التي تُرجع قائمة تشغيل ، يمكنك طلب قائمة تشغيل جزئية ، أو "صفحات" من قائمة التشغيل من خلال تحديد معلمة الحد والإزاحة في قاموس المعلمات. يحدد الحد الأقصى لعدد مقاطع الفيديو التي سيتم إرجاعها ، وتحدد الإزاحة الفهرس في قائمة التشغيل التي سيتم فيها إرجاع مقاطع الفيديو.
على سبيل المثال ، إذا كان لديك قائمة تشغيل بها 100 مقطع فيديو ، فيمكنك طلب 6 مقاطع فيديو فقط تبدأ من الفيديو رقم 10 على النحو التالي:
let parameters = [
" limit " : 6 ,
" offset " : 10
]
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : kVideoId
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : parameters ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
if let video {
self . playbackController ? . setVideos ( [ video ] )
self . playbackController ? . play ( )
}
}
يتم إنشاء كائن BCOVPlaybackController
مع استراتيجية عرض ، والتي تتيح لك ، كعميل لـ SDK ، تحديد كائن UIVIEW الدقيق الذي يتم إرجاعه من خاصية عرض وحدة التحكم في التشغيل. هذا أمر مهم عند استخدام الإضافات التي تؤثر على عرض وحدة التحكم في التشغيل ، مثل المكون الإضافي الإعلاني الذي يتراكب عرض الفيديو باستخدام عرض إعلان. لن تحتاج العديد من التطبيقات إلى إنشاء استراتيجية عرض ، ويمكنها ببساطة تمرير nil
عند إنشاء وحدة تحكم تشغيل جديدة. سيؤدي ذلك إلى إنشاء عرض فيديو قياسي في وحدة تحكم التشغيل.
BCOVPlaybackControllerViewStrategy
Typedef الاسم المستعار (والوثائق) هذا توقيع الكتلة الأكثر تعقيدًا:
UIView *(^)(UIView *videoView, id playbackController);
يصف هذا التوقيع كتلة Objective-C التي تُرجع Uiview ويأخذ معلمتين: Uiview ووحدة تحكم التشغيل. قيمة الإرجاع هي كائن UIVIEW الذي ستشير إليه خاصية عرض وحدة تحكم التشغيل. المعلمة الأولى هي UIVIEW التي تحتوي على طبقة الفيديو ، وستعرض UIVIEW الفيديو. المعلمة الثانية هي كائن وحدة تحكم التشغيل التي تم تقديم استراتيجية العرض إليها ، ويمكن استخدام وحدة تحكم التشغيل لإضافة مستهلكي الجلسة اللازمة مثل عناصر التحكم في الفيديو أو عناصر التحكم في الإعلانات.
مثال على تطبيق استراتيجية العرض:
let viewStrategy = { ( videoView : UIView ? , playbackController : BCOVPlaybackController ? ) in
guard let videoView ,
let playbackController else {
return UIView ( )
}
// Create some custom controls for the video view,
// and compose both into a container view.
[ 1 ] let myControlsView = MyControlsView ( ) // Conforms to BCOVPlaybackSessionConsumer
[ 2 ] let controlsAndVideoView = UIView ( )
[ 3 ] controlsAndVideoView . addSubview ( videoView )
controlsAndVideoView . addSubview ( myControlsView )
// Compose the container with an advertising view
// into another container view.
[ 4 ] let adView = SomeAdPluginView ( ) // Conforms to BCOVPlaybackSessionConsumer
[ 5 ] let adAndVideoView = UIView ( )
[ 6 ] adAndVideoView . addSubview ( controlsAndVideoView )
adAndVideoView . addSubview ( adView )
[ 7 ] playbackController . add ( myControlsView )
playbackController . add ( adView )
// This container view will become `playbackController.view`.
return adAndVideoView
}
تقسيم الكود إلى خطوات: [1] قم بإنشاء عرض أدوات تحكم مخصصة يتوافق مع بروتوكول BCOVPlaybackSessionConsumer
. يسمح بروتوكول BCOVPlaybackSessionConsumer
بتلقي معلومات التشغيل الأساسية لكل مقطع فيديو بالإضافة إلى الإعلان. [2] قم بإنشاء طريقة عرض حاوية لعرض الفيديو وعناصر التحكم المخصصة. [3] أضف كإلقاء نظرة فرعية على حاوية الفيديو وعناصر التحكم المخصصة. يتكون التسلسل الهرمي بنفس الترتيب الذي تتم إضافة طرق العرض. [4] قم بإنشاء عرض عناصر التحكم في الإعلان يتوافق مع بروتوكول BCOVPlaybackSessionConsumer
. [5] قم بإنشاء طريقة عرض حاوية لعرض الفيديو وعناصر التحكم ، وعرض الإعلان. [6] أضف بمثابة عرض فرعي لحاوية الفيديو وعرض التحكم في الإعلان. [7] قم بتسجيل عرض عناصر التحكم المخصصة وعرض عناصر التحكم AD كمستهلكين للجلسة باستخدام كائن وحدة تحكم التشغيل التي يتم إرجاعها بواسطة الكتلة.
هناك تحذير واحد لاستخدام استراتيجية العرض: يجب ألا تصل إلى خاصية view
وحدة التحكم في التشغيل من داخل كتلة استراتيجية العرض. نظرًا لأنه يتم استدعاء الكتلة لأنه تم الوصول إلى خاصية view
وحدة التحكم في التشغيل لأول مرة ، فإن الوصول إلى خاصية view
مرة أخرى ضمن كتلة استراتيجية العرض سيؤدي إلى تعطل البرنامج.
بشكل افتراضي ، عند إرسال تطبيق iOS إلى الخلفية ، أو تم قفل الجهاز ، فإن iOS سيوقف أي فيديو يتم تشغيله. لتغيير هذا السلوك ، قم بتعيين خاصية allowsBackgroundAudioPlayback
لكائن BCOVPlaybackController
إلى true
. (القيمة الافتراضية false
، مما يشير إلى أن التشغيل سوف يتوقف في الخلفية.)
يجب عليك أيضًا اتباع الإرشادات التي حددتها Apple في سؤال وجواب تقني QA1668 لتعيين أوضاع الخلفية المناسبة وفئة جلسة الصوت لتطبيقك.
من المهم أن يتم فصل AVPlayerLayer
من AVPlayer
قبل تبديل التطبيق إلى الخلفية (ويعيد إعادة التثبيت عندما يعود التطبيق إلى المقدمة). سيتعامل لاعب BrightCove SDK من أجلك عندما يتم تعيين allowsBackgroundAudioPlayback
على true
.
أخيرًا ، عند تشغيل مقاطع الفيديو الخلفية (وخاصة عند استخدام قوائم التشغيل) ، يجب عليك استخدام واجهة برمجة تطبيقات iOS MPRemoteCommandCenter
لإعطاء التحكم في تشغيل المستخدم على شاشة القفل وفي مركز التحكم.
لتمكين الصورة في الصورة في التطبيق الخاص بك ، قم بتعيين خاصية showPictureInPictureButton
لكائن BCOVPUIPlayerViewOptions
إلى true
عند إنشاء كائن BCOVPUIPlayerView
الخاص بك. بعد ذلك ، سيتم عرض زر الصورة في الصورة في شريط عناصر التحكم على أي جهاز يدعمه.
لكي تعمل الصورة في الصورة بشكل صحيح ، ستحتاج إلى التأكد من تشغيل Audio, AirPlay, and Picture in Picture
في قسم Background Modes
في علامة التبويب إمكاناتك المستهدفة في مشروعك. يجب عليك أيضًا اتباع الإرشادات التي حددتها Apple في سؤال وجواب تقني QA1668 لتعيين أوضاع الخلفية المناسبة وفئة جلسة الصوت لتطبيقك.
يتم تمرير أساليب AVPictureInPictureControllerDelegate
عبر BCOVPUIPlayerViewDelegate
. هذه الطرق هي:
func pictureInPictureControllerDidStartPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerDidStopPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerWillStartPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func pictureInPictureControllerWillStopPicture ( inPicture pictureInPictureController : AVPictureInPictureController )
func picture ( _ pictureInPictureController : AVPictureInPictureController , failedToStartPictureInPictureWithError error : Error )
func picture ( _ pictureInPictureController : AVPictureInPictureController , restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler : ( Bool ) -> Void )
راجع وثائق AvPictureNpictureControllerDelegate لمزيد من المعلومات.
لتنفيذ سلوك الصور الخاص بك في الصورة ، اترك خاصية allowsBackgroundAudioPlayback
لـ BCOVPlaybackController
تم تعيينها على false
، والحفاظ على خاصية pictureInPictureActive
من BCOVPlaybackController
محدثة مع حالة الصورة في الصورة. إذا كنت تستخدم AVPictureInPictureController
، فيمكنك استخدام pictureInPictureControllerDidStartPicture(inPicture:)
و pictureInPictureControllerDidStopPicture(inPicture:)
تفويض طرق تحديث هذا العقار.
يمكنك قراءة المزيد عن تصوير الصورة في صورة Apple في صورة Apple في وثائق لاعب مخصص.
سيؤدي استخدام قائمة تشغيل من مقاطع الفيديو ذات التنسيقات المختلطة مع الصورة في الصورة إلى إغلاق نافذة الصورة في الصورة بين كل مقطع فيديو.
قدم iOS و iPados 14 سلوكًا تلقائيًا للصور في الصورة والذي يمكن تبديله/إيقاف تشغيله في Settings > General > Picture in Picture
. لكي تعمل هذه الميزة كما هو متوقع ، يجب أن تكون عرض اللاعب مساوياً لعرض الشاشة ويجب أن يكون للارتفاع نسبة ما لا يقل عن 0.57 إلى العرض (16: 9 أو أكبر). إذا كان عرض أو ارتفاع عرض المشغل أصغر من هذه القيم ، فقد لا يتم تشغيل الصورة في الصورة تلقائيًا عند دخول التطبيق إلى الخلفية.
هام: تعامل كل من الإضافات IMA و Freewheel و Pulse و SSAI بشكل مختلف. راجع قسم الصورة في الصورة في كل مكون إضافي ReadMe للحصول على معلومات إضافية.
يتيح Thumbnail البحث عن المستخدمين سحب رأس Playhead على طول الجدول الزمني وعرض الصور المصغرة كمعاينة للمحتوى المرتبط. يمنح ذلك المستخدمين القدرة على التنقل بسرعة في ملف الفيديو والعثور على المحتوى الذي يهتمون به.
يشار إلى هذه الميزة أيضًا من قبل Apple على أنها لعبة خدعة ، ويتم الإشارة إليها في مواصفات تأليف HLS الخاصة بها.
يتم تمكين هذه الميزة بشكل افتراضي. إذا كنت ترغب في تعطيل الصورة المصغرة التي تسعى للحصول عليها ، فيمكنك القيام بذلك عن طريق تعيين خاصية thumbnailSeekingEnabled
على BCOVPlaybackController
إلى false
.
playbackController . thumbnailSeekingEnabled = false
يمكنك تخصيص تخطيط معاينة Thumbnail من خلال استخدام طريقة مندوب مع BCOVPUIPlayerView
أو BCOVTVPlayerView
.
على iOS ، يمكنك ضبط الارتفاع والعرض والإزاحة الرأسية:
func setUpPlayerView ( ) {
let playerView = BCOVPUIPlayerView ( playbackController : nil )
playerView ? . delegate = self
...
}
// MARK: BCOVPUIPlayerViewDelegate
func playerViewShouldDisplayThumbnailPreview ( withRect playerView : BCOVPUIPlayerView ) -> CGRect {
let width : CGFloat = 100
let height : CGFloat = 56
let verticalOffset : CGFloat = - 60
var modifier : CGFloat = 1
if UIDevice . current . userInterfaceIdiom == . pad {
modifier = 2
}
return CGRect ( x : 0 , y : verticalOffset * modifier , width : width * modifier , height : height * modifier )
}
على TVOS ، يمكنك ضبط الارتفاع والعرض:
func setUpPlayerView ( ) {
let playerView = BCOVTVPlayerView ( options : nil )
playerView ? . delegate = self
...
}
// MARK: BCOVTVPlayerViewDelegate
func playerViewShouldDisplayThumbnailPreview ( withSize playerView : BCOVTVPlayerView ) -> CGSize {
var size = self . view . frame . size
size . width = size . width / 6
size . height = size . height / 6
return size
}
إذا كانت بناء كائن BCOVVideo
يدويًا ، يمكنك تعيين عنوان URL لاستخدامه في مصدر WebVTT Thumbnail:
if let url = URL ( string : " https://mydomain.com/master.m3u8 " ) {
var video = BCOVVideo . video ( withURL : url )
video = video . update ( { ( mutableVideo : BCOVMutableVideo ) in
mutableVideo . thumbnailVTTURL = URL ( string : " https://mydomain.com/thumbnail.webvtt " )
} )
}
تسعى Thumbnail المتاح فقط لمقاطع الفيديو على الإنترنت ؛ لا تدعم مقاطع الفيديو التي تم تنزيلها/غير متصل بهذه الميزة.
يمكنك إدخال bcovvideo إضافية ، بعد bcovvideo أخرى بالفعل في قائمة الانتظار ، في BCOVPlaybackController
عن طريق استدعاء insertVideo:afterVideoAtIndex:
.
على سبيل المثال:
// This will insert the new video after the first video in the queue
playbackController . insert ( videoToInsert , afterVideoAt : 0 )
هناك طريقتان مندوبان يمكنك استخدامه لتنبيهه من نجاح أو فشل الطلب.
func playbackController(_ controller: BCOVPlaybackController, didInsert video: BCOVVideo, at index: UInt)
func playbackController(_ controller: BCOVPlaybackController, failedToInsert video: BCOVVideo)
توافق الدفق العام (GSC) هي خدمة تحدد ما إذا كان التشغيل مسموحًا بجلسات التشغيل النشطة للمشاهد وحد التزامن مسبقًا. يتم طلب الخدمة من خلال خدمة ترخيص تشغيل Edge (EPA). يتم استخدام نفس JWT المستخدم لاسترداد الفيديو هنا ، وينبغي أن يتضمن مطالبة uid
، مطالبة climit
واختياريًا ، مطالبة sid
. يجب تمكين هذه الميزة في acccount الخاص بك.
لا يتم تمكين التزامن الدفق العام في SDK افتراضيًا. إذا كنت ترغب في تمكينها ، فقم بتعيين خاصية streamConcurrencyEnabled
من BCOVPlaybackController
إلى true
.
playbackController . streamConcurrencyEnabled = true
يمكن تضمين قيمة sid
في JWT أو إرسالها كخيار BCOVPlaybackController
، وكلاهما اختياري. قيمة sid
في JWT لها الأسبقية على خيار BCOVPlaybackController
.
playbackController . options [ kBCOVAuthHeartbeatPropertyKeySessionId ] = " sessionId "
تمت إضافة طريقة مندوب جديد إلى BCOVPlaybackControllerDelegate
لاسترداد الجلسات النشطة عند الوصول إلى حد التزامن.
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didReachMaxConcurrency sessions : [ AnyHashable : Any ] ) {
print ( " ( sessions ) " )
}
عادة ما يتم التعامل مع أخطاء التشغيل والإبلاغ عنها من خلال أحداث تشغيل الفيديو من وحدة تحكم التشغيل. إذا كنت بحاجة إلى حفر مشكلات أعمق وتتبع مشكلات مع مقاطع فيديو معينة أو جلسات تطبيق ، فيمكنك الاستفادة من معرف جلسة BrightCove Player SDK. معرف الجلسة هو خاصية لـ BCOVPlayerSDKManager
التي يمكنك استردادها مثل هذا:
let sdkSessionID = BCOVPlayerSDKManager . sharedManager ( ) . sessionID
معرف الجلسة هو سلسلة فريدة لا تتغير خلال دورة حياة التطبيق. تم الإبلاغ عن هذه السلسلة مع مختلف بيانات التحليلات الأخرى إلى خوادم مقاييس BrightCove. إذا كنت تواجه مشاكل مع مثيل تطبيق معين ، أو مقطع فيديو ، فيمكنك تسجيل معرف الجلسة وإرساله إلى خوادم الشركة الخاصة بك. بعد ذلك ، يمكنك إرسال معرف الجلسة ومعرف الفيديو وأي بيانات أخرى ذات صلة بمهندسي خدمة BrightCove للمساعدة في تشخيص أي مشكلات.
إذا كنت بحاجة إلى الجمع بين المكونات الإضافية SDK المشغل ، على سبيل المثال ، لإضافة ترجمات إلى مقطع فيديو محمي DRM والذي يلعب الإعلانات التي تديرها Google IMA ، يتم إنشاء BCOVSessionProviders
من كل مكون إضافي وتزويد بسلسلة وتستخدم السلسلة لبناء BCOVPlaybackController
.
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let imaSettings = IMASettings ( )
imaSettings . ppid = kIMAPublisherID
if let languageCode = NSLocale . current . languageCode {
imaSettings . language = languageCode
}
let renderSettings = IMAAdsRenderingSettings ( )
renderSettings . linkOpenerPresentingController = self
let adsRequestPolicy = BCOVIMAAdsRequestPolicy . videoPropertiesVMAPAdTagUrl ( )
// create the sidecar subtitles session provider. it has no upstream session provider.
let sidecarSessionProvider = sdkManager . createSidecarSubtitlesSessionProvider ( withUpstreamSessionProvider : nil )
// create a fairplay session provider with the sidecar session provider as its upstream session
let authProxy = BCOVFPSBrightcoveAuthProxy ( withPublisherId : nil ,
applicationId : nil )
let fairPlaySessionProvider = sdkManager . createFairPlaySessionProvider ( withAuthorizationProxy : authProxy ,
upstreamSessionProvider : sidecarSessionProvider )
// create the IMA session provider with an upstream sidecar subtitles session provider.
let imaSessionProvider = sdkManager . createIMASessionProvider ( with : imaSettings ,
adsRenderingSettings : renderSettings ,
adsRequestPolicy : adsRequestPolicy ,
adContainer : playerView ? . contentOverlayView ,
viewController : self ,
companionSlots : nil ,
upstreamSessionProvider : fairPlaySessionProvider )
يتحكم المطورون في حجم المخزن المؤقت للتشغيل الأمامي الذي يستخدمه AVPlayer
. يتم ذلك عن طريق تعيين خاصية preferredForwardBufferDuration
في فئة AVPlayerItem
.
بشكل افتراضي ، يقوم لاعب BrightCove الأصلي SDK بتعيين خاصية preferredForwardBufferDuration
بطريقة تعمل على تحسين النطاق الترددي العام دون التضحية بجودة التشغيل. يمكن تجاوز هذا السلوك بقيمك الخاصة.
يدفع الجميع إلى النطاق الترددي ، لذلك من المهم تقليل استهلاك النطاق الترددي دون التأثير على جودة التشغيل. جديد مع الإصدار 5.2.0 ، يدير اللاعب الأصلي BrightCove SDK حجم المخزن المؤقت لك ديناميكيًا مع تشغيل الفيديو.
قبل نظام التشغيل iOS 10 ، قام AVPlayer
بتجميع أكبر قدر ممكن من بيانات الفيديو ، وهو ما يصل إلى حوالي 50 ميغابايت. هذا أمر جيد بالنسبة لنموذج عرض الفيديو حيث يقوم المستخدم باختيار مقطع فيديو ثم يشاهده حتى النهاية ، ولكن العديد من التطبيقات الحديثة "Tease" مع Autoplay ، على أمل تأمين المشاركة بعد بضع ثوان. ينتقل الكثير من المستخدمين ببساطة إلى مقاطع فيديو مختلفة. مع التخزين المؤقت العدواني ، يمكنك أن ينتهي الأمر بعدة دقائق من الفيديو المخزنة التي يتم إلقاؤها مع كل انطباع بالفيديو.
يعالج SDK المشغل الأصلي BrightCove هذه المشكلة عن طريق بدء تشغيل الفيديو بمخزن مؤقت أساسي صغير ، ثم يزيده حيث يراقب المستخدم المزيد من الفيديو. بعد نقطة معينة ، يتم تحديد حجم المخزن المؤقت لأنه ليس عمليًا أو مفيدًا لجعله كبيرًا جدًا.
إذا كنت ترغب في الاحتفاظ بالسلوك الافتراضي لمشغل BrightCove الأصلي SDK ، ولكن قم بتعديل الحد الأدنى والحد الأقصى للقيم المستخدمة في أحجام المخزن المؤقت ، يمكنك القيام بما يلي عند إعداد BCOVPlaybackController
:
// Create mutable dictionary to hold new values
if var options = playbackController . options {
// Set new values in dictionary
options [ kBCOVBufferOptimizerMethodKey ] = BCOVBufferOptimizerMethod . default . rawValue
options [ kBCOVBufferOptimizerMinimumDurationKey ] = minValue
options [ kBCOVBufferOptimizerMaximumDurationKey ] = maxValue
// Set new dictionary in your playback controller
playbackController . options = options
}
يجب تعيين هذه الخيارات قبل استدعاء playbackController.setVideos()
.
قيم min
و max
:
AVPlayer
بتخفيض البيانات التي لا يتم عرضها مطلقًا.AVPlayerItem
التي تخبر AVPlayer
بتحديد حجم المخزن المؤقت الخاص بها.إذا كنت لا تريد أي تحسين مخزن مؤقت نشط في جلسة التشغيل الحالية ، فيمكنك استخدام نفس التقنية ، ولكن قم بتعيين طريقة التحسين على "لا شيء" على النحو التالي:
// Create mutable dictionary to hold new values
if var options = playbackController . options {
// Set new values in dictionary
options [ kBCOVBufferOptimizerMethodKey ] = BCOVBufferOptimizerMethod . none
// Set new dictionary in your playback controller
playbackController . options = options
}
مع الطريقة التي تم تعيينها على .none
، ستحافظ iOS على التحكم الكامل في حجم المخزن المؤقت الأمامي.
إذا كنت ترغب في تعيين حجم المخزن المؤقت الخاص بك للتشغيل ، قم أولاً بإيقاف تشغيل التحسين العازلة كما هو موضح في القسم السابق. بعد ذلك ، يمكنك تنفيذ طريقة مندوب BCOVPlaybackController
التالية:
func playbackController ( _ controller : BCOVPlaybackController , didAdvanceTo session : BCOVPlaybackSession ) {
if let currentItem = session . player . currentItem {
// Set your preferredForwardBufferDuration value here.
currentItem . preferredForwardBufferDuration = newPreferredForwardBufferDurationValue
}
}
إذا كنت ترغب في تغيير حجم المخزن المؤقت ديناميكيًا مع مرور الوقت ، فيمكنك تعيين session.player.currentItem.preferredForwardBufferDuration
في طريقة تفويض التقدم في BCOVPlaybackController
بطريقة مماثلة:
func playbackController ( _ controller : BCOVPlaybackController , playbackSession session : BCOVPlaybackSession , didProgressTo progress : TimeInterval ) {
if let currentItem = session . player . currentItem {
// Set your preferredForwardBufferDuration value here.
currentItem . preferredForwardBufferDuration = newPreferredForwardBufferDurationValue
}
}
ملاحظة: وضعت Apple على وجه التحديد "مفضلة" في preferredForwardBufferDuration
لأنه يمكنك تعيين أي قيمة تريدها ، ولكن بشكل عام ، سيستخدمها مشغل AVPlayer
فقط كمبدأ توجيهي. ضع في اعتبارك أيضًا أن وضعه على الصفر يعيد التحكم الكامل في حجم المخزن المؤقت إلى AVPlayer
.
يمكنك استخدام AvplayerviewController بدلاً من AvplayerLayer المستخدمة من قبل فئة BcovPlayBackSession. يتيح استخدام AvplayerviewController للاعب استخدام عناصر التحكم في iOS و TVOS Player الأصلية ، ولكن هناك قيود على هذا النهج (انظر أدناه).
لاستخدام AvplayerviewController ، يمكنك تعيين خاصية قاموس BcovPlayBackController تسمى kBCOVAVPlayerViewControllerCompatibilityKey
:
let sdkManager = BCOVPlayerSDKManager . sharedManager ( )
let playbackController = sdkManager . createPlaybackController ( )
if var mutableOptions = playbackController . options {
// To use the AVPlayerViewController
mutableOptions [ kBCOVAVPlayerViewControllerCompatibilityKey ] = true
// To use the BCOVPlaybackSession's AVPlayerLayer
// mutableOptions[kBCOVAVPlayerViewControllerCompatibilityKey] = false
playbackController . options = mutableOptions
}
القيمة الافتراضية لـ KBCovAvplayerViewControllerCiptibilityKey false
، مما يعني أن bcovplaybackController الذي تم إنشاؤه بدون هذه الخاصية القاموس المعيبة بشكل صريح سوف يستخدم AvplayerLayer من BcovplayBackSession بشكل افتراضي.
تكون الإضافات BrightCove IMA و Freewheel و Pulse و SSAI متوافقة مع AvplayerviewController. يمكنك استخدام contentOverlayView
من AvPlayerViewController للعرض لعرض الإعلانات (غير قابلة للتطبيق على SSAI).
قد ترغب في إخفاء/إظهار عناصر التحكم في تشغيل AvplayerViewController قبل وبعد تشغيل الإعلانات:
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didEnter adSequence : BCOVAdSequence ) {
avpvc . showsPlaybackControls = false
}
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didExitAdSequence adSequence : BCOVAdSequence ) {
avpvc . showsPlaybackControls = true
}
عند استخدام AvplayerviewController مع مكون الإضافي BrightCove IMA وإعلانات مع زر "معرفة المزيد" ستحتاج إلى إنشاء UIVIEW إضافي لاستخدامه كعرض حاوية الإعلان. هذا لأن contentOverlayView
من AvPlayerViewController ليس تفاعليًا ، لذا لن يكون لمحاولة النقر على زر "معرفة المزيد" أي تأثير. يمكنك استخدام playbackController:playbackSession:didEnterAdSequence:
و playbackController:playbackSession:didExitAdSequence:
تفويض طرق لإظهار وإخفاء عرض الحاوية الإعلانية.
إذا كنت تستخدم الإضافات IMA أو Freewheel أو Pulse أو SSAI على TVOS ، فسيتم إنشاء مجموعة من AVInterstitialTimeRange
لكل نقطة إعلانية ويتم تعيينها على interstitialTimeRanges
من AVPlayerItem
. بالنسبة إلى IMA و Freewheel و Pulse Plugins ، ستحتاج إلى إنشاء لفتة تشغيل/توقف مؤقت ، بحيث عندما يكون الإعلان نشطًا ، يمكنك التوقف بشكل صحيح واستئناف الإعلان وعدم التأثير على تشغيل الفيديو نفسه. هنا مثال:
func setUpAdPlayPauseGesture ( ) {
let playPauseGesture = UITapGestureRecognizer ( target : self , action : #selector ( playPauseAd ( _ : ) ) )
playPauseGesture . allowedPressTypes = [ NSNumber ( value : UIPress . PressType . playPause . rawValue ) ]
avpvc . view . addGestureRecognizer ( playPauseGesture )
self . playPauseGesture = playPauseGesture
}
@ objc
func playPauseAd ( _ gesture : UITapGestureRecognizer ) {
if insideAdSequence {
if adPlaying {
playbackController ? . resumeAd ( )
adPlaying = false
} else {
playbackController ? . pauseAd ( )
adPlaying = true
}
} else {
if avpvc . player ? . rate == 0 {
playbackController ? . play ( )
} else {
playbackController ? . pause ( )
}
}
}
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didEnterAdSequence adSequence : BCOVAdSequence ) {
insideAdSequence = true
}
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
didExitAdSequence adSequence : BCOVAdSequence ) {
insideAdSequence = false
}
لعرض تراكب AD ، مثل العد التنازلي ، يرجى الاطلاع على قسم دعم AvPlayerViewController في AD Plugin ReadMe الذي تستخدمه لبعض التوجيهات.
لاحظ أن توافق AVPlayerViewController
الخاص بـ SSAI خاص بـ TVOS بسبب توفر AVInterstitialTimeRange
. ستظل قادرًا على التشغيل على iOS ، لكن مدة الفيديو ستتضمن مدة جميع الإعلانات.
لدينا عينة مشاريع توضح استخدام AvplayerviewController مع BrightCove iOS SDK. يمكنك العثور على مشروع نموذج iOS هنا ومشروع عينة TVOS هنا.
عند استخدام AvplayerviewController ، ستقوم أحداث Video_engagement المرسلة إلى BrightCove Analytics Server بالإبلاغ عن 0 لـ Player_width و Player_height.
إذا كنت تستخدم خدمة ترخيص التشغيل ، فستحتاج إلى استخدام مفتاح تكوين تكوين BCOVPlaybackService.ConfigurationKeyAuthToken
.
// Video Request
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : videoID ,
BCOVPlaybackService . ConfigurationKeyAuthToken : authToken
]
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
...
}
// Playlist Request
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : playlistID ,
BCOVPlaybackService . ConfigurationKeyAuthToken : authToken
]
playbackService . findPlaylist ( withConfiguration : configuration ,
queryParameters : nil ) { ( playlist : BCOVPlaylist ? ,
jsonResponse : Any ? ,
error : Error ? ) in
...
}
ملاحظة: في حالة قوائم التشغيل ، يجب أن تستخدم جميع مقاطع الفيديو في قائمة التشغيل نفس الرمز المميز. في إصدار لاحق ، سيكون من الممكن تعيين رمز مختلف لكل مقطع فيديو في قائمة التشغيل. ستكون مسؤولاً عن الحفاظ على التعيين بين معرف الفيديو والرمز المميز.
يتم دعم التعليق الصوتي خارج الصندوق لعناصر التحكم في التشغيل. بشكل افتراضي ، إذا تم تمكين التعليق الصوتي ، فلن يتم عرض BCOVPLAYERUI CONTROL عرض تلقائيًا. سيؤدي استخدام إيماءة تنشيط التعليق الصوتي المزدوج على عرض وحدة تحكم التشغيل إلى تبديل رؤية عرض التحكم. هناك accessibilityHint
المرتبطة به على عرض وحدة تحكم التشغيل. يمكن تخصيص accessibilityLabel
لكل عنصر تحكم bcovplayerui داخل التطبيق الخاص بك.
لتغيير قيم accessibilityLabel
لأي من الأزرار في عرض التحكم ، يجب عليك تعيين كائن ليكون BCOVPUIButtonAccessibilityDelegate
مثل هذا:
playerView . controlsView . setButtonsAccessibilityDelegate ( self )
يجب أن يكون لديك هذا الكائن يتوافق مع بروتوكول BCOVPUIButtonAccessibilityDelegate
عن طريق تفعيل - (NSString *)accessibilityLabelForButton:(BCOVPUIButton *)button isPrimaryState:(BOOL)isPrimaryState
مماثلة لهذا:
func accessibilityLabel ( for button : BCOVPUIButton ,
isPrimaryState : Bool ) -> String ? {
switch button . tag {
case BCOVPUIViewTag . buttonPlayback . rawValue :
return isPrimaryState ? NSLocalizedString ( " Start Playback " , comment : " playback button " ) : NSLocalizedString ( " Pause Playback " , comment : " playback button " )
case BCOVPUIViewTag . buttonScreenMode . rawValue :
return isPrimaryState ? NSLocalizedString ( " Enter Fullscreen " , comment : " screenmode button " ) : NSLocalizedString ( " Exit Fullscreen " , comment : " screenmode button " )
case BCOVPUIViewTag . buttonJumpBack . rawValue :
return nil
case BCOVPUIViewTag . buttonClosedCaption . rawValue :
return nil
case BCOVPUIViewTag . buttonVideo360 . rawValue :
return nil
case BCOVPUIViewTag . buttonPreferredBitrate . rawValue :
return nil
default :
return nil
}
}
إذا تم إرجاع قيمة nil
، فسيتم استخدام القيمة الافتراضية.
يمكن إجراء ضبط accessibilityHint
على وحدة تحكم التشغيل على هذا النحو:
playbackController . view . accessibilityHint = " Double tap to show or hide controls "
وبالمثل ، يمكنك ضبط accessibilityLabel
على تسميات الوقت والمدة الحالية ، إلى جانب شريط التقدم ، مثل هذا:
playerView . controlsView . durationLabel . accessibilityLabelPrefix = " Total Time "
playerView . controlsView . currentTimeLabel . accessibilityLabelPrefix = " Current Time "
playerView . controlsView . progressSlider . accessibilityLabel = " Timeline "
يمكنك توفير توطحيات لغوية إضافية لا تدعم BrightCove iOS SDK خارج الصندوق.
+
" قسم "التوترات". لتحديد مجال الوكيل لخدمات التشغيل ، خوادم المقاييس وخوادم التحليلات في الصين ، قم بتعيين خاصية chinaProxyDomain
لـ BCOVGlobalConfiguration
Singleton على اسم مجال مؤهل تمامًا. على سبيل المثال:
BCOVGlobalConfiguration . sharedConfig . chinaProxyDomain = " host.mydomain.com "
تأكد من تعيين اسم مجال الوكيل قبل استخدام أي خدمات أخرى للاعب الأصلي SDK. ارجع إلى مرجع فئة BcovGlobalConfiguration للحصول على التفاصيل.
اعتمادًا على الطريقة التي تحتاج بها إلى تنفيذ تطبيقك عندما يتعلق الأمر بتشغيل الصوت ، يمكنك تكوين Avaudiosession لتناسب احتياجاتك المحددة. على سبيل المثال ، إذا كنت ترغب في دعم Airplay 2 وتجهيزات الصوت المتعددة ، انظر قسم AirPlay في هذا ReadMe.
يمكن تكوين Avaudiosession الأساسي مثل هذا:
var categoryError : NSError ?
var success : Bool
do {
// see https://developer.apple.com/documentation/avfoundation/avaudiosessioncategoryplayback
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback )
success = true
} catch let error as NSError {
categoryError = error
success = false
}
if !success {
// Handle error
}
يمكن إجراء هذا التكوين عادة في application:didFinishLaunchingWithOptions:
الطريقة. قد تكون هناك مواقف تحتاج فيها إلى تكوين Avaudiosession أكثر تطوراً ، على سبيل المثال إذا كنت ترغب في السماح للاستماع إلى الصوت من التطبيقات الأخرى عندما يتم كتم الصوت في التطبيق الخاص بك. في هذه الحالة ، يمكنك تكوين Avaudiosession في وحدة التحكم في العرض التي لديها إمكانية الوصول إلى Avplayer الحالي. على سبيل المثال:
func setUpAudioSession ( ) {
var categoryError : NSError ?
var success : Bool
do {
if let currentPlayer = currentPlayer {
// If the player is muted, then allow mixing.
// Ensure other apps can have their background audio
// active when this app is in foreground
if currentPlayer . isMuted {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , options : . mixWithOthers )
} else {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , options : AVAudioSession . CategoryOptions ( rawValue : 0 ) )
}
} else {
try AVAudioSession . sharedInstance ( ) . setCategory ( . playback , options : AVAudioSession . CategoryOptions ( rawValue : 0 ) )
}
success = true
} catch let error as NSError {
categoryError = error
success = false
}
if !success {
print ( " AppDelegate Debug - Error setting AVAudioSession category. Because of this, there may be no sound. ( categoryError! ) " )
}
}
يمكن العثور على رمز عينة في مشروع عينة VideoCloudBasicPlayer.
يمكنك قراءة المزيد عن Avaudiosession هنا.
يدعم BrightCove Player SDK تدفقات الصوت فقط ويتضمن بعض الميزات الصوتية فقط. إذا قمت بتكوين صورة ملصق للفيديو الخاص بك ، فسيتم عرض الصورة في contentOverlayView
من BCOVPUIPlayerView
. يمكنك ضبط UIViewContentMode
لعرض صورة الملصق باستخدام خاصية contentModeForPosterImage
على BCOVPUIPlayerViewOptions
، والقيمة الافتراضية هي UIViewContentModeScaleAspectFit
.
قد ترغب أيضًا في إبقاء عناصر تحكم اللاعب مرئية في جميع الأوقات ، في هذه الحالة ، يمكنك تمكين keepControlsVisible
على BCOVPUIPlayerViewOptions
.
إذا كنت لا ترغب في عرض صورة الملصق أو ببساطة تريد عرض تشغيل أكثر إحكاما ، فيمكنك ضبط ارتفاع طريقة عرض الوالدين BCOVPUIPlayerView
على ارتفاع 88 PT لتخطيط مضغوط (<450 PT) أو ارتفاع 44 نقطة ل تخطيط قياسي.
هناك ثلاثة تخطيطات BCOVPUIBasicControlView
التي تم تكوينها مسبقًا فقط يمكنك استخدامها إذا كنت لا تستخدم automaticControlTypeSelection
:
basicControlViewWithAODLayout
basicControlViewWithLiveAudioLayout
basicControlViewWithLiveDVRAudioLayout
يمكنك أيضًا إخطارك إذا كان دفق الصوت فقط أو فيديو+صوت مع playbackController:playbackSession:determinedMediaType
Method:
func playbackController ( _ controller : BCOVPlaybackController ,
playbackSession session : BCOVPlaybackSession ,
determinedMediaType mediaType : BCOVSourceMediaType ) {
switch mediaType {
case BCOVSourceMediaType . audio :
print ( " Source is Audio Only " )
case BCOVSourceMediaType . audioVideo :
print ( " Source is Audio and Video " )
default :
break
}
}
لدينا VideoCloudBasicPlayer دعم لعرض معلومات الوسائط على شاشة القفل ومركز التحكم وفوق البث. راجع فئة NowPlayingHandler
للحصول على تفاصيل التنفيذ.
يمثل المصد الفيديو رصيدًا قصيرًا ، عادة ما يكون 10 ثوانٍ أو أقل ، يتم تشغيله أمام جميع الوسائط الأخرى ويظهر عادة العلامة التجارية أو الشركة التي يمثلها مقطع الفيديو الخاص بك. سيطلب اللاعب المصد من واجهة برمجة تطبيقات التشغيل مثل أي فيديو آخر ، وإدخاله قبل الإعلانات والمحتوى.
المصدات هي ميزة على مستوى اللاعب ، مما يعني أن لاعبًا معينًا قد يرتبط فقط بمصد واحد. تشترك قوائم التشغيل في نفس الفيديو المصد. هناك طريقتان لتكوين مشغل لتشغيل فيديو المصد:
bumperID
. معرف الفيديو للعثور عليه. // Using `bumperID`
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : videoID ,
BCOVPlaybackService . ConfigurationKeyBumperID : bumperID
]
// Using `bumperReferenceID`
let configuration = [
BCOVPlaybackService . ConfigurationKeyAssetID : playlistID ,
BCOVPlaybackService . ConfigurationKeyBumperReferenceID : bumperReferenceID
]
// With a Video Request
playbackService . findVideo ( withConfiguration : configuration ,
queryParameters : nil ) { ( video : BCOVVideo ? ,
jsonResponse : Any ? ,
error : Error ? ) in
...
}
// With a Playlist Request
playbackService . findPlaylist ( withConfiguration : configuration ,
queryParameters : nil ) { ( playlist : BCOVPlaylist ? ,
jsonResponse : Any ? ,
error : Error ? ) in
...
}
يمكن تعريف حقل bumper_id
في الحقول المخصصة في Videocloud/Studio. يمكن استخدام bumper_id
بدون توقيعات محددة مسبقًا. يجب أن يكون bumper_id
معرف فيديو صالح.
ملاحظة: تم تمرير BumperId عبر الحقول المخصصة (حقل bumper_id
) الأسبقية على أي معرف في خدمة التشغيل.
يمكن إخفاء عناصر التحكم في التشغيل أثناء لعب المصد.
let options = BCOVPUIPlayerViewOptions ( )
options . automaticControlTypeSelection = true
options . showBumperControls = false
let playerView = BCOVPUIPlayerView ( playbackController : nil , options : options , controlsView : nil )
إذا تم تعيين خيار automaticControlTypeSelection
true
فإن تخطيط المصد سيتكيف مع المحتوى (الفيديو أو الصوت فقط). basicControlViewWithVODLayout
و basicControlViewWithAODLayout
تخطيطات مصممة للمصدات ، لا تتوفر تخطيطات Live
أو LiveDVR
. تتمتع أدوات التحكم في التشغيل بمظهر فريد عندما يكون المصد نشطًا:
يتم دمج دعم التفاعل في إطار Core BrightCovePlayersDK . للحصول على تفاصيل كاملة حول استخدام التفاعل مع SDK Native BrightCove ، راجع دليل التفاعل.
إذا تم تعبئة المحتوى على أنه MP4 ، فيمكنك لصق عنوان URL مباشرة في معظم متصفحات الويب ، ويجب أن يتم تشغيل الفيديو (أو تنزيله على نظام الملفات الخاص بك ، حيث يمكنك تشغيله محليًا). إذا تم تعبئة المحتوى كـ HLS ، فيمكنك استخدام مشغل QuickTime لاختباره: تحديد File -> Open Location…
ولصقه في عنوان قائمة التشغيل .m3u8
، ويجب تشغيل الفيديو.
هذا هو أحد الأعراض الشائعة لاستدعاء طريقة Uikit الرئيسية فقط أو Avfoundation من خيط غير مين. تُطلق على أساليب المندوب على BCOVPlaybackControllerDelegate
دائمًا الخيط الرئيسي.
تشير هذه الرسالة إلى أن سياسة اختيار المصدر الافتراضية لا يمكنها تحديد المصدر الذي سيتم اختياره. تختار السياسة الافتراضية المصدر الأول الذي يكون deliveryMethod
هو kBCOVSourceDeliveryHLS
("HLS"). إذا لم يتم العثور على مصدر HLS ، فإن سلوكه الاحتياطي سيختار المصدر الأول الذي يكون deliveryMethod
هو kBCOVSourceDeliveryMP4
("MP4"). في حالة عدم وجود مصدر مع deliveryMethod
من "HLS" أو "MP4" على الفيديو ، ستقوم السياسة باختيار المصدر الأول للفيديو (بغض النظر عن deliveryMethod
). إذا لم تكن راضيًا عن اختيارها ، فيمكنك استخدام -[BCOVPlayerSDKManager createBasicSessionProviderWithOptions:]
وتمرير في حالة من BCOVBasicSessionProviderOptions
مع مجموعة الممتلكات sourceSelectionPolicy
المخصصة للمصادر. عند إنشاء مقاطع فيديو ومصادر يدويًا ، تأكد من إنشاء المصادر باستخدام deliveryMethod
المناسب.
واجهة برمجة التطبيقات التي تتحكم في ما إذا كان التطبيق ينبعث من الصوت في تطبيقات iOS هو API Avaudiosession. تعتبر جلسة الصوت عالمية لتطبيق ما ، مما يعني أن تكوينه يؤثر على كل من الأصوات المنبعثة من قبل اللاعبين Avplays الذي أنشأه المشغل SDK ، بالإضافة إلى الأصوات الأخرى التي قد ينتجها التطبيق. نظرًا لأن المشغل SDK لا يمكن أن يعرف كيف يريد التطبيق تكوين جلسة الصوت لتلك الأصوات الأخرى ، فإنه لا يؤثر على جلسة الصوت على الإطلاق. هذا يعني أنه ما لم تقم بتكوين جلسة الصوت الخاصة بالتطبيق بشكل صريح ، فأنت ترث السلوك الافتراضي لقمع أي صوت عند كتم الجهاز ، بما في ذلك الصوت المنبعث من قبل Avplayers. To conform to Apple's recommendations regarding audio playback, you (the app developer) must configure the audio session according to your app's specific needs.
See our AVAudioSession Configuration section in this README for additional information.
If you have questions, need help or want to provide feedback, please use the Support Portal or contact your Account Manager. To receive notification of new SDK software releases, subscribe to the Brightcove Native Player SDKs Google Group.