জেটপ্যাক XR SDK সমতল পৃষ্ঠে স্টেরিওস্কোপিক পাশাপাশি ভিডিও প্লেব্যাক সমর্থন করে। স্টেরিওস্কোপিক ভিডিওর সাথে, দর্শকদের গভীরতার অনুভূতি দেওয়ার জন্য প্রতিটি ফ্রেমে একটি বাম-চোখ এবং একটি ডান-চোখের ছবি থাকে—যা স্টেরিওপসিস নামেও পরিচিত।
আপনি Android XR অ্যাপে নন-স্টেরিওস্কোপিক 2D ভিডিও রেন্ডার করতে পারেন যা অন্যান্য ফর্ম ফ্যাক্টরগুলিতে অ্যান্ড্রয়েড ডেভেলপমেন্টের জন্য ব্যবহৃত স্ট্যান্ডার্ড মিডিয়া APIs সহ।
Jetpack SceneCore ব্যবহার করে পাশাপাশি ভিডিও চালান
পাশাপাশি ভিডিওর সাথে, প্রতিটি স্টেরিওস্কোপিক ফ্রেম একে অপরের সংলগ্ন অনুভূমিকভাবে সাজানো দুটি চিত্র হিসাবে উপস্থাপন করা হয়। উপরের এবং নীচের ভিডিও ফ্রেমগুলি একে অপরের সংলগ্ন উল্লম্বভাবে সাজানো হয়।
পাশাপাশি ভিডিও একটি কোডেক নয় বরং স্টেরিওস্কোপিক ফ্রেমগুলিকে সংগঠিত করার একটি উপায়, যার মানে এটি Android দ্বারা সমর্থিত যেকোনো কোডেকে এনকোড করা যেতে পারে৷
আপনি Media3 Exoplayer ব্যবহার করে পাশাপাশি ভিডিও লোড করতে পারেন এবং তারপর নতুন SurfaceEntity
ব্যবহার করে রেন্ডার করতে পারেন। একটি SurfaceEntity
তৈরি করতে, SurfaceEntity.create
কল করুন, নিচের উদাহরণে দেখানো হয়েছে।
val stereoSurfaceEntity = SurfaceEntity.create( xrSession, SurfaceEntity.StereoMode.SIDE_BY_SIDE, Pose(Vector3(0.0f, 0.0f, -1.5f)), SurfaceEntity.CanvasShape.Quad(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( xrSession, SurfaceEntity.StereoMode.MULTIVIEW_LEFT_PRIMARY, Pose(Vector3(0.0f, 0.0f, -1.5f)), SurfaceEntity.CanvasShape.Quad(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()
Jetpack SceneCore ব্যবহার করে DRM-সুরক্ষিত স্থানিক ভিডিও চালান
জেটপ্যাক এক্সআর এসডিকে অ্যান্ড্রয়েডের বিল্ট-ইন ডিজিটাল রাইটস ম্যানেজমেন্ট (ডিআরএম) ফ্রেমওয়ার্ক ব্যবহার করে এনক্রিপ্ট করা ভিডিও স্ট্রিমগুলির প্লেব্যাক সমর্থন করে৷ DRM নিরাপদ বিতরণ সক্ষম করে এবং অননুমোদিত অনুলিপি বা প্লেব্যাক প্রতিরোধ করে আপনার সামগ্রীকে সুরক্ষিত করে।
প্রক্রিয়াটিতে আপনার মিডিয়া প্লেয়ার অ্যাপ্লিকেশনটি ডিক্রিপশন কী পেতে লাইসেন্স সার্ভারের সাথে যোগাযোগ করে। অ্যান্ড্রয়েডে, এই প্রক্রিয়াটি সুরক্ষিতভাবে পরিচালিত হয়, এবং ডিক্রিপ্ট করা ভিডিও ফ্রেমগুলি একটি সুরক্ষিত গ্রাফিক্স বাফারে রেন্ডার করা হয় যা সিস্টেম বা অন্যান্য অ্যাপ্লিকেশন দ্বারা অ্যাক্সেস করা যায় না, স্ক্রিন ক্যাপচার প্রতিরোধ করে৷
জেটপ্যাক সিনকোরের সাথে ডিআরএম-সুরক্ষিত ভিডিও চালাতে, আপনাকে এটি করতে হবে:
- সুরক্ষিত পৃষ্ঠের অনুরোধ করতে
SurfaceEntity
কনফিগার করুন। - কী এক্সচেঞ্জ পরিচালনা করতে প্রয়োজনীয় DRM তথ্য সহ Media3 Exoplayer কনফিগার করুন।
- প্লেয়ারের আউটপুট
SurfaceEntity
এর পৃষ্ঠে সেট করুন।
নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে একটি ডিআরএম-সুরক্ষিত স্ট্রিম চালানোর জন্য ExoPlayer কনফিগার করতে হয় এবং এটিকে একটি 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)), canvasShape = SurfaceEntity.CanvasShape.Quad(1.0f, 1.0f), contentSecurityLevel = SurfaceEntity.ContentSecurityLevel.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-এ মিডিয়া ডিআরএম ডকুমেন্টেশন দেখুন।
Jetpack SceneCore ব্যবহার করে 180-ডিগ্রী এবং 360-ডিগ্রী ভিডিও চালান
SurfaceEntity
অর্ধগোলাকার পৃষ্ঠে 180° ভিডিও এবং গোলাকার পৃষ্ঠে 360° ভিডিও প্লেব্যাক সমর্থন করে। radius
প্যারামিটার ডিফল্টভাবে মিটারে সংশ্লিষ্ট পৃষ্ঠের রেডিয়াল আকারকে বোঝায়।
নিম্নলিখিত কোডটি দেখায় কিভাবে একটি 180° গোলার্ধ এবং একটি 360° গোলকের প্লেব্যাকের জন্য SurfaceEntity
সেট আপ করতে হয়। এই ক্যানভাস আকারগুলি ব্যবহার করার সময়, একটি নিমগ্ন অভিজ্ঞতা প্রদানের জন্য ব্যবহারকারীর মাথার ভঙ্গিটি ব্যবহার করে পৃষ্ঠটি অবস্থান করুন৷
// Set up the surface for playing a 180° video on a hemisphere. val hemisphereStereoSurfaceEntity = SurfaceEntity.create( xrSession, SurfaceEntity.StereoMode.SIDE_BY_SIDE, xrSession.scene.spatialUser.head?.transformPoseTo( Pose.Identity, xrSession.scene.activitySpace )!!, SurfaceEntity.CanvasShape.Vr180Hemisphere(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( xrSession, SurfaceEntity.StereoMode.TOP_BOTTOM, xrSession.scene.spatialUser.head?.transformPoseTo( Pose.Identity, xrSession.scene.activitySpace )!!, SurfaceEntity.CanvasShape.Vr360Sphere(1.0f), ) // ... and use the surface for playing the media.
উন্নত সারফেস এন্টিটি নিয়ন্ত্রণ
ভিডিও এবং ইমেজ রেন্ডারিংয়ের উপর আরও উন্নত নিয়ন্ত্রণের জন্য, যেমন কাস্টম উপাদান প্রভাব প্রয়োগ করা, আপনি SceneCore লাইব্রেরি থেকে সরাসরি SurfaceEntity
সাথে কাজ করতে পারেন।
নিম্নলিখিত বিভাগগুলি SurfaceEntity
এ উপলব্ধ কিছু উন্নত বৈশিষ্ট্য বর্ণনা করে।
প্রান্ত পালক প্রয়োগ করুন
edgeFeather
সম্পত্তি সেট করে পরিবেশের সাথে মিশে যেতে সাহায্য করার জন্য পৃষ্ঠের প্রান্তগুলিকে নরম করুন।
// 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.edgeFeather = SurfaceEntity.EdgeFeatheringParams.SmoothFeather(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"), TextureSampler.create() ) // 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 ব্যবহার করে ভিডিও চালাতে শিখতে আগ্রহী হন, তাহলে ইমেজ বা ভিডিও বিষয়বস্তুর জন্য একটি সারফেস কিভাবে যোগ করবেন তা শিখুন।