ভিডিও ফ্রেম এক্সট্র্যাক্ট করা

FrameExtractor ক্লাস MediaItem থেকে ডিকোড করা ফ্রেম এক্সট্র্যাক্ট করার একটি কার্যকর উপায় প্রদান করে।

সাধারণ ব্যবহারের মধ্যে এগুলি অন্তর্ভুক্ত:

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

এক নজরে

FrameExtractor ব্যবহার করার জন্য দুটি ধাপ অনুসরণ করতে হয়:

  1. এক্সট্র্যাক্টর তৈরি করুন: FrameExtractor.Builder ব্যবহার করে একটি ইনস্ট্যান্স তৈরি করুন। আপনি যে Context এবং MediaItem পরীক্ষা করতে চান সেগুলি বিল্ডারে পাঠান। এছাড়াও, আপনি Builder উন্নত সেটিংসের জন্য কনফিগারেশন পদ্ধতি চেইন করতে পারবেন।
  2. ফ্রেম এক্সট্র্যাক্ট করা: নির্দিষ্ট টাইমস্ট্যাম্পে ফ্রেম এক্সট্র্যাক্ট করতে getFrame() কল করুন অথবা একটি রেপ্রেজেন্টেটিভ থাম্বনেলের জন্য অনুরোধ করতে getThumbnail() কল করুন। এইসব মেথড অ্যাসিঙ্ক্রোনাস এবং একটি ListenableFuture রিটার্ন করে। তাই, জটিল ডিকোডিংয়ের কাজ মূল থ্রেডকে ব্লক করে না।

Kotlin

suspend fun extractFrames(context: Context, mediaItem: MediaItem) {
  try {
    // 1. Build the frame extractor.
    // `FrameExtractor` implements `AutoCloseable`, so wrap it in
    // a Kotlin `.use` block, which calls `close()` automatically.
    FrameExtractor.Builder(context, mediaItem).build().use { extractor ->
      // 2. Extract frames asynchronously.
      val frame = extractor.getFrame(5000L).await()
      val thumbnail = extractor.thumbnail.await()
      handleFrame(frame, thumbnail)
    }
  } catch (e: Exception) {
    handleFailure(e)
  }
}

জাভা

public void extractFrames(Context context, MediaItem mediaItem) {
  // 1. Build the frame extractor.
  // `FrameExtractor` implements `AutoCloseable`, so use try-with-resources
  // so that the resources are automatically released.
  try (FrameExtractor frameExtractor = new FrameExtractor.Builder(context, mediaItem).build()) {
    // 2. Extract frames asynchronously.
    ListenableFuture<FrameExtractor.Frame> frameFuture = frameExtractor.getFrame(5000L);
    ListenableFuture<FrameExtractor.Frame> thumbnailFuture = frameExtractor.getThumbnail();

    ListenableFuture<List<Object>> allFutures = Futures.allAsList(frameFuture, thumbnailFuture);
    Futures.addCallback(
        allFutures,
        new FutureCallback<List<Object>>() {
          @Override
          public void onSuccess(List<Object> result) {
            handleFrame(Futures.getUnchecked(frameFuture), Futures.getUnchecked(thumbnailFuture));
          }

          @Override
          public void onFailure(Throwable t) {
            handleFailure(t);
          }
        },
        directExecutor());
  }
}