SpatialExternalSurface হল একটি সাবস্পেস কম্পোজেবল যা Surface তৈরি ও
ম্যানেজ করে, যেখানে আপনার অ্যাপ ছবি বা ভিডিও-এর মতো কন্টেন্ট
ড্র করতে পারে। SpatialExternalSurface-এ ঘনদর্শনমূলক
বা মনোস্কোপিক কন্টেন্ট দেখা যায়।
ছবি বা ভিডিও কন্টেন্টের জন্য সারফেস যোগ করুন
এই উদাহরণে দেখানো হয়েছে যে কীভাবে Media3 Exoplayer এবং SpatialExternalSurface ব্যবহার করে পাশাপাশি ঘনদর্শনমূলক ভিডিও লোড করা যায়:
@OptIn(ExperimentalComposeApi::class) @Composable fun SpatialExternalSurfaceContent() { val context = LocalContext.current Subspace { SpatialExternalSurface( modifier = SubspaceModifier .width(1200.dp) // Default width is 400.dp if no width modifier is specified .height(676.dp), // Default height is 400.dp if no height modifier is specified // Use StereoMode.Mono, StereoMode.SideBySide, or StereoMode.TopBottom, depending // upon which type of content you are rendering: monoscopic content, side-by-side stereo // content, or top-bottom stereo content stereoMode = StereoMode.SideBySide, ) { val exoPlayer = remember { ExoPlayer.Builder(context).build() } val videoUri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) // Represents a side-by-side stereo video, where each frame contains a pair of // video frames arranged side-by-side. The frame on the left represents the left // eye view, and the frame on the right represents the right eye view. .path("sbs_video.mp4") .build() val mediaItem = MediaItem.fromUri(videoUri) // onSurfaceCreated is invoked only one time, when the Surface is created onSurfaceCreated { surface -> exoPlayer.setVideoSurface(surface) exoPlayer.setMediaItem(mediaItem) exoPlayer.prepare() exoPlayer.play() } // onSurfaceDestroyed is invoked when the SpatialExternalSurface composable and its // associated Surface are destroyed onSurfaceDestroyed { exoPlayer.release() } } } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- আপনি কোন ধরনের কন্টেন্ট রেন্ডার করছেন তার উপর নির্ভর করে
StereoMode-কেMono,SideBySideবাTopBottomহিসেবে সেট করুন:Mono: ছবি বা ভিডিও ফ্রেমে একটিই অভিন্ন ছবি থাকে যা দুই চোখেই দেখানো হয়।SideBySide: ছবি বা ভিডিও ফ্রেমে এক জোড়া ছবি বা ভিডিও ফ্রেম পাশাপাশি সাজানো থাকে, যেখানে বাঁদিকের ছবি বা ফ্রেম বাঁদিকের চোখের ভিউ এবং ডানদিকের ছবি বা ফ্রেম ডানদিকের চোখের ভিউ দেখায়।TopBottom: ছবি বা ভিডিও ফ্রেমে এক জোড়া ছবি বা ভিডিও ফ্রেম থাকে যা উল্লম্বভাবে স্ট্যাক করা থাকে, যেখানে উপরের ছবি বা ফ্রেমটি বাম চোখের ভিউ এবং নিচের ছবি বা ফ্রেমটি ডান চোখের ভিউ দেখায়।
SpatialExternalSurface-এ শুধু আয়তাকার সারফেস কাজ করে।- এই
Surfaceইনপুট ইভেন্ট ক্যাপচার করে না। - অ্যাপ্লিকেশন রেন্ডারিং বা ভিডিও ডিকোডিংয়ের সাথে
StereoModeপরিবর্তন সিঙ্ক্রোনাইজ করা সম্ভব নয়। - এই কম্পোজেবল অন্যান্য প্যানেলের সামনে রেন্ডার করতে পারে না, তাই লেআউটে অন্যান্য প্যানেল থাকলে
আপনার
MovePolicyব্যবহার করা উচিত নয়।
DRM-সুরক্ষিত ভিডিও কন্টেন্টের জন্য সারফেস যোগ করুন
এছাড়াও, SpatialExternalSurface-এ DRM-সুরক্ষিত ভিডিও স্ট্রিম
প্লেব্যাক করা যায়। এটি চালু করতে, আপনাকে অবশ্যই একটি সুরক্ষিত সারফেস তৈরি করতে হবে যা সুরক্ষিত গ্রাফিক্স বাফারে রেন্ডার করে। এটি কন্টেন্ট স্ক্রিন-রেকর্ড করা বা অসুরক্ষিত সিস্টেম কম্পোনেন্ট
দ্বারা অ্যাক্সেস করা থেকে আটকায়।
একটি নিরাপদ সারফেস তৈরি করতে, SpatialExternalSurfaceProtection প্যারামিটারটি
SpatialExternalSurfaceProtection.Protected-এ সেট করুন
SpatialExternalSurface কম্পোজেবলে। এছাড়াও, লাইসেন্স সার্ভার থেকে লাইসেন্স অধিগ্রহণ ম্যানেজ করার জন্য আপনাকে সঠিক DRM তথ্য সহ
Media3 Exoplayer কনফিগার করতে হবে।
নিচের উদাহরণে দেখানো হয়েছে যে DRM-সুরক্ষিত ভিডিও স্ট্রিম চালানোর জন্য কীভাবে SpatialExternalSurface এবং
ExoPlayer কনফিগার করতে হয়:
@OptIn(ExperimentalComposeApi::class) @Composable fun DrmSpatialVideoPlayer() { val context = LocalContext.current Subspace { SpatialExternalSurface( modifier = SubspaceModifier .width(1200.dp) .height(676.dp), stereoMode = StereoMode.SideBySide, surfaceProtection = SpatialExternalSurfaceProtection.Protected ) { val exoPlayer = remember { ExoPlayer.Builder(context).build() } // Define the URI for your DRM-protected content and license server. val videoUri = "https://your-content-provider.com/video.mpd" val drmLicenseUrl = "https://your-license-server.com/license" // Build a MediaItem with the necessary DRM configuration. val mediaItem = MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(drmLicenseUrl) .build() ) .build() onSurfaceCreated { surface -> // The created surface is secure and can be used by the player. exoPlayer.setVideoSurface(surface) exoPlayer.setMediaItem(mediaItem) exoPlayer.prepare() exoPlayer.play() } onSurfaceDestroyed { exoPlayer.release() } } } }
কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট
- সুরক্ষিত সারফেস:
SpatialExternalSurface-এsurfaceProtection = SpatialExternalSurfaceProtection.Protectedসেট করা প্রয়োজনীয় যাতে অন্তর্নিহিতSurface-এর ব্যাক-আপ DRM কন্টেন্টের জন্য উপযুক্ত সুরক্ষিত বাফার দ্বারা করা হয়। - DRM কনফিগারেশন: আপনাকে অবশ্যই DRM স্কিম (যেমন,
C.WIDEVINE_UUID) এবং আপনার লাইসেন্স সার্ভারের URI সহMediaItemকনফিগার করতে হবে। ExoPlayer এই তথ্য ব্যবহার করে DRM সেশন ম্যানেজ করে। - সুরক্ষিত কন্টেন্ট: সুরক্ষিত সারফেসে রেন্ডার করার সময়, ভিডিও কন্টেন্ট ডিকোড করা হয় এবং সুরক্ষিত পাথে দেখানো হয়, যা কন্টেন্ট লাইসেন্সিংয়ের প্রয়োজনীয়তা পূরণ করতে সাহায্য করে। এছাড়াও, এটি স্ক্রিন ক্যাপচারে কন্টেন্ট দেখানো আটকায়।