TextureView ব্যবহার করে ভিডিও প্লেব্যাক: সম্পূর্ণ গাইড
TextureView হলো একটি ভিউ যা হার্ডওয়্যার-ত্বরিত OpenGL রেন্ডারিং ব্যবহার করে ভিডিও বা ক্যামেরা প্রিভিউ দেখাতে পারে। এটি SurfaceView-এর চেয়ে বেশি ফ্লেক্সিবল (রোটেশন, আ্যালফা, স্কেলিং সম্ভব)।
পদক্ষেপ ১: প্রজেক্ট তৈরি করুন
Android Studio-তে নতুন প্রজেক্ট তৈরি করুন।
পদক্ষেপ ২: লেআউট XML (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp"
tools:context=".MainActivity">
<TextureView
android:id="@+id/textureView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
পদক্ষেপ ৩: অ্যাসেট ফোল্ডারে ভিডিও রাখুন
Project view-এ right-click → New → Folder → Assets Folder → `assets` ফোল্ডার তৈরি করুন। সেখানে `videoplayback.mp4` নামক ভিডিও ফাইলটি কপি করুন।
পদক্ষেপ ৪: MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.res.AssetFileDescriptor;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.view.Surface;
import android.view.TextureView;
import java.io.IOException;
public class MainActivity extends AppCompatActivity
implements TextureView.SurfaceTextureListener, MediaPlayer.OnVideoSizeChangedListener {
TextureView textureView;
private MediaPlayer mediaPlayer;
AssetFileDescriptor fileDescriptor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textureView = findViewById(R.id.textureView);
textureView.setSurfaceTextureListener(this);
mediaPlayer = new MediaPlayer();
try {
fileDescriptor = getAssets().openFd("videoplayback.mp4");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
Surface surface = new Surface(surfaceTexture);
try {
mediaPlayer.setSurface(surface);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mediaPlayer.setDataSource(fileDescriptor);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(mp -> mediaPlayer.start());
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}
@Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; }
@Override public void onSurfaceTextureUpdated(SurfaceTexture surface) {}
@Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
}
পদক্ষেপ ৫: Manifest ফাইল
সাধারণ ম্যানিফেস্ট যথেষ্ট, ইন্টারনেট পারমিশন দরকার নেই (লোকাল ফাইল)।
গুরুত্বপূর্ণ টিপস
- লাইফসাইকেল ম্যানেজমেন্ট: onPause/onDestroy-এ mediaPlayer.release() করুন
- এরর হ্যান্ডলিং: setOnErrorListener যোগ করুন
- বड़े ফাইল: Asset ফোল্ডারের পরিবর্তে raw ফোল্ডার বা স্ট্রিমিং URL ব্যবহার করুন
- ExoPlayer: প্রোডাকশন অ্যাপে MediaPlayer-এর বদলে ExoPlayer ব্যবহার করুন (DASH, HLS সাপোর্ট, ভালো পারফরম্যান্স)
TextureView vs SurfaceView
| ফিচার | TextureView | SurfaceView |
|---|---|---|
| রোটেশন/স্কেলিং | সমর্থন করে | সীমিত |
| আ্যালফা/ট্রান্সপারেন্সি | সমর্থন করে | না |
| পারফরম্যান্স | थোড়া কম | ভালো (ডেডিকেটেড সারফেস) |
| API লেভেল | API 14+ | API 1+ |