আপনার অ্যাপে স্থানিক ভিডিও যোগ করুন

প্রযোজ্য এক্সআর ডিভাইস
এই নির্দেশিকা আপনাকে এই ধরনের এক্সআর ডিভাইসগুলির জন্য অভিজ্ঞতা তৈরি করতে সাহায্য করে।
এক্সআর হেডসেট
তারযুক্ত এক্সআর চশমা

Jetpack XR SDK সমতল পৃষ্ঠে স্টিরিওস্কোপিক পাশাপাশি ভিডিও প্লেব্যাক সমর্থন করে। স্টিরিওস্কোপিক ভিডিওতে, প্রতিটি ফ্রেমে একটি বাম-চোখের এবং একটি ডান-চোখের ছবি থাকে, যা দর্শকদের গভীরতার অনুভূতি দেয়—যা স্টিরিওপসিস নামেও পরিচিত।

অন্যান্য ফর্ম ফ্যাক্টরে অ্যান্ড্রয়েড ডেভেলপমেন্টের জন্য ব্যবহৃত স্ট্যান্ডার্ড মিডিয়া এপিআই ব্যবহার করে আপনি অ্যান্ড্রয়েড এক্সআর অ্যাপে নন-স্টিরিওস্কোপিক ২ডি ভিডিও রেন্ডার করতে পারেন।

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()

Jetpack SceneCore ব্যবহার করে DRM-সুরক্ষিত স্পেশিয়াল ভিডিও চালান।

Jetpack XR SDK, অ্যান্ড্রয়েডের অন্তর্নির্মিত ডিজিটাল রাইটস ম্যানেজমেন্ট (DRM) ফ্রেমওয়ার্ক ব্যবহার করে এনক্রিপ্টেড ভিডিও স্ট্রিম প্লেব্যাক সমর্থন করে। DRM নিরাপদ বিতরণ সক্ষম করে এবং অননুমোদিত অনুলিপি বা প্লেব্যাক প্রতিরোধ করে আপনার বিষয়বস্তুকে সুরক্ষিত রাখে।

এই প্রক্রিয়ায় আপনার মিডিয়া প্লেয়ার অ্যাপ্লিকেশনটি ডিক্রিপশন কী সংগ্রহ করার জন্য একটি লাইসেন্স সার্ভারের সাথে যোগাযোগ করে। অ্যান্ড্রয়েডে, এই প্রক্রিয়াটি নিরাপদে পরিচালিত হয় এবং ডিক্রিপ্ট করা ভিডিও ফ্রেমগুলো একটি সুরক্ষিত গ্রাফিক্স বাফারে রেন্ডার করা হয়, যা সিস্টেম বা অন্য কোনো অ্যাপ্লিকেশন অ্যাক্সেস করতে পারে না, ফলে স্ক্রিন ক্যাপচার প্রতিরোধ করা হয়।

Jetpack SceneCore দিয়ে DRM-সুরক্ষিত ভিডিও চালাতে হলে আপনাকে যা করতে হবে:

  1. একটি সুরক্ষিত পৃষ্ঠতলের জন্য অনুরোধ করতে SurfaceEntity কনফিগার করুন।
  2. কী এক্সচেঞ্জ পরিচালনা করার জন্য প্রয়োজনীয় ডিআরএম তথ্য দিয়ে মিডিয়া৩ এক্সোপ্লেয়ার কনফিগার করুন।
  3. প্লেয়ারের আউটপুট SurfaceEntity এর সারফেসে সেট করুন।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি DRM-সুরক্ষিত স্ট্রিম প্লে করতে এবং এটিকে একটি SurfaceEntity তে রেন্ডার করতে ExoPlayer কনফিগার করতে হয়:

// 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-এ থাকা মিডিয়া ডিআরএম ডকুমেন্টেশন দেখুন।

Jetpack SceneCore ব্যবহার করে ১৮০-ডিগ্রি এবং ৩৬০-ডিগ্রি ভিডিও চালান।

SurfaceEntity অর্ধগোলাকার পৃষ্ঠে ১৮০° ভিডিও এবং গোলাকার পৃষ্ঠে ৩৬০° ভিডিও প্লেব্যাক সমর্থন করে। ডিফল্টরূপে, radius প্যারামিটারটি সংশ্লিষ্ট পৃষ্ঠগুলির ব্যাসার্ধকে মিটারে নির্দেশ করে।

নিম্নলিখিত কোডটি দেখায় কিভাবে একটি ১৮০° অর্ধগোলক এবং একটি ৩৬০° গোলকে প্লেব্যাকের জন্য SurfaceEntity সেট আপ করতে হয়। এই ক্যানভাস আকারগুলি ব্যবহার করার সময়, একটি নিমগ্ন অভিজ্ঞতা প্রদানের জন্য ব্যবহারকারীর মাথার ভঙ্গি কাজে লাগিয়ে পৃষ্ঠটিকে স্থাপন করুন।

val devicePose = ArDevice.getInstance(xrSession).state.value.devicePose
val activitySpacePose = xrSession.scene.perceptionSpace.transformPoseTo(devicePose, xrSession.scene.activitySpace)

// 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 = activitySpacePose,
        shape = SurfaceEntity.Shape.Hemisphere(1.0f),
    )
// ... and use the surface for playing the media.

val devicePose = ArDevice.getInstance(xrSession).state.value.devicePose
val activitySpacePose = xrSession.scene.perceptionSpace.transformPoseTo(devicePose, xrSession.scene.activitySpace)
// Set up the surface for playing a 360° video on a sphere.
val sphereStereoSurfaceEntity =
    SurfaceEntity.create(
        session = xrSession,
        stereoMode = SurfaceEntity.StereoMode.TOP_BOTTOM,
        pose = activitySpacePose,
        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
}

Jetpack Composer for XR ব্যবহার করে স্থানিক ভিডিও চালান

আপনি যদি Jetpack Compose for XR ব্যবহার করে ভিডিও চালানো শিখতে আগ্রহী হন, তাহলে ছবি বা ভিডিও কন্টেন্টের জন্য কীভাবে একটি সারফেস যোগ করতে হয় তা শিখে নিন।