জেটপ্যাক এক্সআর এসডিকে সমতল পৃষ্ঠে স্টেরিওস্কোপিক পাশাপাশি ভিডিও প্লেব্যাক সমর্থন করে। স্টেরিওস্কোপিক ভিডিওর ক্ষেত্রে, প্রতিটি ফ্রেমে একটি বাম-চোখ এবং একটি ডান-চোখের ছবি থাকে যা দর্শকদের গভীরতার অনুভূতি দেয় - যা স্টেরিওপসিস নামেও পরিচিত।
আপনি অন্যান্য ফর্ম ফ্যাক্টর ব্যবহার করে অ্যান্ড্রয়েড ডেভেলপমেন্টের জন্য ব্যবহৃত স্ট্যান্ডার্ড মিডিয়া এপিআই ব্যবহার করে অ্যান্ড্রয়েড এক্সআর অ্যাপে নন-স্টেরিওস্কোপিক 2D ভিডিও রেন্ডার করতে পারেন।
Jetpack SceneCore ব্যবহার করে পাশাপাশি ভিডিও চালান
পাশাপাশি ভিডিওর মাধ্যমে, প্রতিটি স্টেরিওস্কোপিক ফ্রেমকে দুটি চিত্র হিসেবে উপস্থাপন করা হয় যা একে অপরের সাথে অনুভূমিকভাবে সাজানো থাকে। উপরে এবং নীচের ভিডিও ফ্রেমগুলি একে অপরের সাথে উল্লম্বভাবে সাজানো থাকে।
পাশাপাশি ভিডিও কোনও কোডেক নয় বরং স্টেরিওস্কোপিক ফ্রেমগুলি সংগঠিত করার একটি উপায়, যার অর্থ এটি অ্যান্ড্রয়েড দ্বারা সমর্থিত যেকোনো কোডেকে এনকোড করা যেতে পারে।
আপনি Media3 Exoplayer ব্যবহার করে পাশাপাশি ভিডিও লোড করতে পারেন এবং তারপর নতুন SurfaceEntity ব্যবহার করে এটি রেন্ডার করতে পারেন। SurfaceEntity তৈরি করতে, SurfaceEntity.create কল করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে।
val stereoSurfaceEntity = SurfaceEntity.create( session = xrSession, stereoMode = SurfaceEntity.StereoMode.SIDE_BY_SIDE, pose = Pose(Vector3(0.0f, 0.0f, -1.5f)), shape = SurfaceEntity.Shape.Quad(FloatSize2d(1.0f, 1.0f)) ) val videoUri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .path("sbs_video.mp4") .build() val mediaItem = MediaItem.fromUri(videoUri) val exoPlayer = ExoPlayer.Builder(this).build() exoPlayer.setVideoSurface(stereoSurfaceEntity.getSurface()) exoPlayer.setMediaItem(mediaItem) exoPlayer.prepare() exoPlayer.play()
Jetpack SceneCore ব্যবহার করে MV-HEVC ভিডিও চালান
MV-HEVC কোডেক স্ট্যান্ডার্ডটি স্টেরিওস্কোপিক ভিডিওর জন্য অপ্টিমাইজ করা এবং ডিজাইন করা হয়েছে, যা আপনার অ্যাপটিকে দুর্দান্ত মানের সাথে দক্ষতার সাথে ইমারসিভ ভিডিও প্লেব্যাক করতে দেয়। MV-HEVC ফাইলগুলিতে একটি প্রাথমিক স্ট্রিম থাকে, সাধারণত বাম চোখ এবং অন্য চোখ দিয়ে একটি স্টেরিও স্ট্রিম থাকে।
পাশাপাশি ভিডিওর মতো, আপনি Media3 Exoplayer ব্যবহার করে এটি লোড করতে পারেন এবং SurfaceEntity ব্যবহার করে এটি রেন্ডার করতে পারেন। SurfaceEntity.create কল করার সময় stereoMode প্যারামিটারে আপনার MV-HEVC ফাইলটি বাম না ডান প্রাথমিক কিনা তা নির্দিষ্ট করতে হবে।
// Create the SurfaceEntity with the StereoMode corresponding to the MV-HEVC content val stereoSurfaceEntity = SurfaceEntity.create( session = xrSession, stereoMode = SurfaceEntity.StereoMode.MULTIVIEW_LEFT_PRIMARY, pose = Pose(Vector3(0.0f, 0.0f, -1.5f)), shape = SurfaceEntity.Shape.Quad(FloatSize2d(1.0f, 1.0f)) ) val videoUri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .path("mvhevc_video.mp4") .build() val mediaItem = MediaItem.fromUri(videoUri) val exoPlayer = ExoPlayer.Builder(this).build() exoPlayer.setVideoSurface(stereoSurfaceEntity.getSurface()) exoPlayer.setMediaItem(mediaItem) exoPlayer.prepare() exoPlayer.play()
জেটপ্যাক সিনকোর ব্যবহার করে DRM-সুরক্ষিত স্থানিক ভিডিও চালান
জেটপ্যাক এক্সআর এসডিকে অ্যান্ড্রয়েডের অন্তর্নির্মিত ডিজিটাল রাইটস ম্যানেজমেন্ট (ডিআরএম) ফ্রেমওয়ার্ক ব্যবহার করে এনক্রিপ্ট করা ভিডিও স্ট্রিমগুলির প্লেব্যাক সমর্থন করে। ডিআরএম নিরাপদ বিতরণ সক্ষম করে এবং অননুমোদিত অনুলিপি বা প্লেব্যাক প্রতিরোধ করে আপনার সামগ্রীকে সুরক্ষিত করে।
এই প্রক্রিয়ায় আপনার মিডিয়া প্লেয়ার অ্যাপ্লিকেশনটি ডিক্রিপশন কী পেতে একটি লাইসেন্স সার্ভারের সাথে যোগাযোগ করে। অ্যান্ড্রয়েডে, এই প্রক্রিয়াটি নিরাপদে পরিচালিত হয় এবং ডিক্রিপ্ট করা ভিডিও ফ্রেমগুলি একটি সুরক্ষিত গ্রাফিক্স বাফারে রেন্ডার করা হয় যা সিস্টেম বা অন্যান্য অ্যাপ্লিকেশন দ্বারা অ্যাক্সেস করা যায় না, যার ফলে স্ক্রিন ক্যাপচার প্রতিরোধ করা হয়।
Jetpack SceneCore দিয়ে DRM-সুরক্ষিত ভিডিও চালানোর জন্য, আপনাকে যা করতে হবে:
- একটি সুরক্ষিত পৃষ্ঠের অনুরোধ করতে
SurfaceEntityকনফিগার করুন। - কী এক্সচেঞ্জ পরিচালনা করার জন্য প্রয়োজনীয় DRM তথ্য সহ Media3 Exoplayer কনফিগার করুন।
- প্লেয়ারের আউটপুট
SurfaceEntityএর পৃষ্ঠে সেট করুন।
নিম্নলিখিত উদাহরণে দেখানো হয়েছে কিভাবে ExoPlayer কে DRM-সুরক্ষিত স্ট্রিম চালানোর জন্য কনফিগার করতে হয় এবং SurfaceEntity তে রেন্ডার করতে হয়:
// Create a SurfaceEntity with DRM content // 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" // Create the SurfaceEntity with the PROTECTED content security level. val protectedSurfaceEntity = SurfaceEntity.create( session = xrSession, stereoMode = SurfaceEntity.StereoMode.SIDE_BY_SIDE, pose = Pose(Vector3(0.0f, 0.0f, -1.5f)), shape = SurfaceEntity.Shape.Quad(FloatSize2d(1.0f, 1.0f)), surfaceProtection = SurfaceEntity.SurfaceProtection.PROTECTED ) // 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() // Initialize ExoPlayer and set the protected surface. val exoPlayer = ExoPlayer.Builder(this).build() exoPlayer.setVideoSurface(protectedSurfaceEntity.getSurface()) // Set the media item and start playback. exoPlayer.setMediaItem(mediaItem) exoPlayer.prepare() exoPlayer.play()
অ্যান্ড্রয়েডের মিডিয়া ডিআরএম ফ্রেমওয়ার্ক সম্পর্কে আরও বিস্তারিত জানতে, source.android.com-এ মিডিয়া ডিআরএম ডকুমেন্টেশন দেখুন।
জেটপ্যাক সিনকোর ব্যবহার করে ১৮০-ডিগ্রি এবং ৩৬০-ডিগ্রি ভিডিও চালান
SurfaceEntity গোলার্ধীয় পৃষ্ঠে ১৮০° ভিডিও এবং গোলাকার পৃষ্ঠে ৩৬০° ভিডিও প্লেব্যাক সমর্থন করে। radius প্যারামিটারটি ডিফল্টরূপে মিটারে সংশ্লিষ্ট পৃষ্ঠের রেডিয়াল আকারকে বোঝায়।
নিচের কোডটি দেখায় কিভাবে ১৮০° গোলার্ধ এবং ৩৬০° গোলকে প্লেব্যাকের জন্য SurfaceEntity সেট আপ করতে হয়। এই ক্যানভাস আকারগুলি ব্যবহার করার সময়, ব্যবহারকারীর মাথার ভঙ্গি ব্যবহার করে পৃষ্ঠটি স্থাপন করুন যাতে একটি নিমজ্জনকারী অভিজ্ঞতা প্রদান করা যায়।
// Set up the surface for playing a 180° video on a hemisphere. val hemisphereStereoSurfaceEntity = SurfaceEntity.create( session = xrSession, stereoMode = SurfaceEntity.StereoMode.SIDE_BY_SIDE, pose = xrSession.scene.spatialUser.head?.transformPoseTo( Pose.Identity, xrSession.scene.activitySpace )!!, shape = SurfaceEntity.Shape.Hemisphere(1.0f), ) // ... and use the surface for playing the media.
// Set up the surface for playing a 360° video on a sphere. val sphereStereoSurfaceEntity = SurfaceEntity.create( session = xrSession, stereoMode = SurfaceEntity.StereoMode.TOP_BOTTOM, pose = xrSession.scene.spatialUser.head?.transformPoseTo( Pose.Identity, xrSession.scene.activitySpace )!!, shape = SurfaceEntity.Shape.Sphere(1.0f), ) // ... and use the surface for playing the media.
উন্নত সারফেসএন্টিটি নিয়ন্ত্রণ
ভিডিও এবং চিত্র রেন্ডারিংয়ের উপর আরও উন্নত নিয়ন্ত্রণের জন্য, যেমন কাস্টম উপাদান প্রভাব প্রয়োগ করা, আপনি SceneCore লাইব্রেরি থেকে সরাসরি SurfaceEntity সাথে কাজ করতে পারেন।
নিম্নলিখিত বিভাগগুলিতে SurfaceEntity তে উপলব্ধ কিছু উন্নত বৈশিষ্ট্য বর্ণনা করা হয়েছে।
প্রান্তের পালক প্রয়োগ করুন
edgeFeatheringParams প্রোপার্টি সেট করে পৃষ্ঠের প্রান্তগুলিকে নরম করুন যাতে এটি পরিবেশের সাথে মিশে যায়।
// Create a SurfaceEntity. val surfaceEntity = SurfaceEntity.create( session = xrSession, pose = Pose(Vector3(0.0f, 0.0f, -1.5f)) ) // Feather the edges of the surface. surfaceEntity.edgeFeatheringParams = SurfaceEntity.EdgeFeatheringParams.RectangleFeather(0.1f, 0.1f)
একটি আলফা মাস্ক লাগান
অ-আয়তক্ষেত্রাকার পৃষ্ঠ তৈরি করতে অথবা স্বচ্ছতা প্রভাব যোগ করতে একটি আলফা মাস্ক প্রয়োগ করুন। প্রথমে, একটি সম্পদ থেকে একটি Texture লোড করুন, তারপর এটি primaryAlphaMaskTexture সম্পত্তিতে বরাদ্দ করুন:
// Create a SurfaceEntity. val surfaceEntity = SurfaceEntity.create( session = xrSession, pose = Pose(Vector3(0.0f, 0.0f, -1.5f)) ) // Load the texture in a coroutine scope. activity.lifecycleScope.launch { val alphaMaskTexture = Texture.create( xrSession, Paths.get("textures", "alpha_mask.png"), ) // Apply the alpha mask. surfaceEntity.primaryAlphaMaskTexture = alphaMaskTexture // To remove the mask, set the property to null. surfaceEntity.primaryAlphaMaskTexture = null }
XR এর জন্য Jetpack Compose ব্যবহার করে স্থানিক ভিডিও চালান
যদি আপনি XR এর জন্য Jetpack Compose ব্যবহার করে ভিডিও চালানো শিখতে আগ্রহী হন, তাহলে ছবি বা ভিডিও কন্টেন্টের জন্য একটি পৃষ্ঠ যোগ করার পদ্ধতি শিখুন।