আপনার অ্যাপে স্পেশিয়াল ভিডিও যোগ করা

প্রযোজ্য XR ডিভাইস
এইসব XR ডিভাইসের জন্য অভিজ্ঞতা তৈরি করতে এই নির্দেশিকা আপনাকে সাহায্য করে।
XR হেডসেট
ওয়্যারড XR গ্লাস

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

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

Jetpack SceneCore ব্যবহার করে পাশাপাশি ভিডিও চালানো

পাশাপাশি ভিডিওতে, প্রতিটি স্টেরিওস্কোপিক ফ্রেমকে দুটি ছবি হিসেবে দেখানো হয় যেগুলি একে অপরের পাশে অনুভূমিকভাবে সাজানো থাকে। উপর-নিচের ভিডিও ফ্রেমগুলি উল্লম্বভাবে একে অপরের পাশে সাজানো থাকে।

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

আপনি 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 কল করবেন, তখন আপনার MV-HEVC ফাইলটি stereoMode প্যারামিটারে লেফট বা রাইট প্রাইমারি হিসেবে নির্দিষ্ট করতে হবে।

// 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, Android-এর বিল্ট-ইন ডিজিটাল রাইটস ম্যানেজমেন্ট (DRM) ফ্রেমওয়ার্ক ব্যবহার করে এনক্রিপ্ট করা ভিডিও স্ট্রিম প্লেব্যাক করার সুবিধা দেয়। নিরাপদ ডিস্ট্রিবিউশন চালু করে এবং অননুমোদিত কপি বা প্লেব্যাক আটকে দিয়ে DRM আপনার কন্টেন্টকে সুরক্ষিত রাখে।

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

Jetpack SceneCore-এর মাধ্যমে DRM-সুরক্ষিত ভিডিও চালাতে, আপনাকে এগুলি করতে হবে:

  1. সুরক্ষিত সারফেসের অনুরোধ করতে SurfaceEntity কনফিগার করুন।
  2. কী এক্সচেঞ্জ ম্যানেজ করতে প্রয়োজনীয় DRM তথ্য সহ Media3 Exoplayer কনফিগার করুন।
  3. SurfaceEntity-এর সারফেসে প্লেয়ারের আউটপুট সেট করুন।

নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে DRM-সুরক্ষিত স্ট্রিম চালানোর জন্য 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)),
    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()

Android-এর মিডিয়া DRM ফ্রেমওয়ার্কের আরও বিস্তারিত ওভারভিউ পেতে, source.android.com-এ মিডিয়া DRM ডকুমেন্টেশন দেখুন।

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.

উন্নত SurfaceEntity কন্ট্রোল

ভিডিও ও ইমেজ রেন্ডারিংয়ের উপর আরও উন্নত কন্ট্রোলের জন্য, যেমন কাস্টম মেটেরিয়াল এফেক্ট প্রয়োগ করা, আপনি সরাসরি 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 ব্যবহার করে কীভাবে ভিডিও চালাতে হয় তা শিখতে আগ্রহী হন, তাহলে কীভাবে ছবি বা ভিডিও কন্টেন্টের জন্য একটি সারফেস যোগ করতে হয় তা জানুন।