রূপান্তর

ফরম্যাটের মধ্যে ট্রান্সকোড করুন

Transformer বিল্ড করার সময় আপনি যে আউটপুট অডিও এবং ভিডিও ফরম্যাটগুলো তৈরি করতে চান, তা নির্দিষ্ট করে দিতে পারেন। উদাহরণস্বরূপ, নিচের কোডটি দেখায় কিভাবে H.264/AVC ভিডিও এবং AAC অডিও আউটপুট করার জন্য Transformer কনফিগার করতে হয়:

কোটলিন

Transformer.Builder(context)
  .setVideoMimeType(MimeTypes.VIDEO_H264)
  .setAudioMimeType(MimeTypes.AUDIO_AAC)
  .build()

জাভা

new Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H264)
    .setAudioMimeType(MimeTypes.AUDIO_AAC)
    .build();

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

অডিও বা ভিডিও সরান

EditedMediaItem.Builder ব্যবহার করে অডিও বা ভিডিও অপসারণ করুন, উদাহরণস্বরূপ:

কোটলিন

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

জাভা

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();

একটি ক্লিপ ছেঁটে নিন।

ইনপুট মিডিয়া আইটেমে ক্লিপিং কনফিগারেশন সেট করার মাধ্যমে আপনি নির্দিষ্ট শুরু এবং শেষের টাইমস্ট্যাম্পের বাইরের যেকোনো মিডিয়া বাদ দিতে পারেন। উদাহরণস্বরূপ, শুধুমাত্র ১০ সেকেন্ড থেকে ২০ সেকেন্ডের মধ্যবর্তী মিডিয়া সম্বলিত একটি ক্লিপ তৈরি করতে:

কোটলিন

val inputMediaItem =
  MediaItem.Builder()
    .setUri(uri)
    .setClippingConfiguration(
      MediaItem.ClippingConfiguration.Builder()
        .setStartPositionMs(10_000)
        .setEndPositionMs(20_000)
        .build()
    )
    .build()

জাভা

MediaItem inputMediaItem =
    new MediaItem.Builder()
        .setUri(uri)
        .setClippingConfiguration(
            new MediaItem.ClippingConfiguration.Builder()
                .setStartPositionMs(10_000)
                .setEndPositionMs(20_000)
                .build())
        .build();

MP4 সম্পাদনা তালিকা

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

শুধুমাত্র ট্রিম করার সম্পাদনা উল্লেখযোগ্যভাবে দ্রুততর করতে, experimentalSetMp4EditListTrimEnabled(true) কল করুন।

কোটলিন

Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build()

জাভা

new Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build();
এটা মনে রাখা গুরুত্বপূর্ণ যে, সব মিডিয়া প্লেয়ার 'প্রি-রোল' পজিশন সমর্থন করে না। এর মানে হলো, যখন এই ধরনের কোনো প্লেয়ার ব্যবহার করা হয়, তখন এডিট লিস্টের কোনো তথ্য ভিন্ন কোনো শুরুর স্থান নির্দিষ্ট করে দিলেও, ফাইলটি এনকোড করা স্যাম্পলের একেবারে শুরু থেকে প্লেব্যাক শুরু করবে।

ট্রিম অপ্টিমাইজ করা

ভিডিওর শুরু অংশ ট্রিম করার ল্যাটেন্সি কমাতে, ট্রিম অপটিমাইজেশন চালু করুন।

কোটলিন

Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build()

জাভা

new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();

এটি ভিডিওর যতটা সম্ভব কম অংশ ডিকোড ও রি-এনকোড করে এবং তারপর রি-এনকোড করা ডেটা মূল ভিডিওর বাকি অংশের সাথে জুড়ে দিয়ে এক্সপোর্টের গতি বাড়ায়। এই অপটিমাইজেশনটি ইনপুট ফাইলের একটি অংশকে নতুন এনকোড করা আউটপুটের সাথে জুড়ে দেওয়ার ক্ষমতার উপর নির্ভর করে, যার অর্থ হলো এনকোডারের আউটপুট ফরম্যাট এবং ইনপুট ফরম্যাট অবশ্যই সামঞ্জস্যপূর্ণ হতে হবে। সুতরাং, উদাহরণস্বরূপ, যদি ফাইলটি মূলত ভিন্ন এনকোডার ইমপ্লিমেন্টেশনযুক্ত কোনো ডিভাইসে তৈরি হয়ে থাকে, তবে সম্ভবত এই অপটিমাইজেশনটি প্রয়োগ করা সম্ভব হবে না। অপটিমাইজেশনটি সফল হওয়ার জন্য, EncoderFactory এর মাধ্যমে Transformer-কে সরবরাহ করা এনকোডারটির লেভেল এবং প্রোফাইল অবশ্যই ইনপুট ফরম্যাটের সাথে সামঞ্জস্যপূর্ণ হতে হবে।

এই অপ্টিমাইজেশনটি শুধুমাত্র একক-অ্যাসেট MP4 ইনপুটের ক্ষেত্রে কাজ করে, যেখানে কোনো অপ ভিডিও এফেক্ট এবং ৯০ ডিগ্রি দ্বারা বিভাজ্য রোটেশন ছাড়া অন্য কোনো এফেক্ট থাকে না। যদি অপ্টিমাইজেশনটি ব্যর্থ হয়, Transformer স্বয়ংক্রিয়ভাবে সাধারণ এক্সপোর্টে ফিরে যায় এবং ExportResult.OptimizationResult এ অপ্টিমাইজেশনের ফলাফল রিপোর্ট করে।

আমরা এই কার্যকারিতাটি যাচাই করছি এবং আশা করছি পরবর্তী কোনো সংস্করণে এটি পরীক্ষামূলক পর্যায় থেকে বেরিয়ে আসবে।

ভিডিও সম্পাদনা

EditedMediaItems ক্রমানুসারে প্রয়োগ করার জন্য অডিও প্রসেসর এবং ভিডিও ইফেক্টের তালিকা থাকে। লাইব্রেরিটিতে সাধারণ ব্যবহারের জন্য ভিডিও ইফেক্টের ইমপ্লিমেন্টেশন অন্তর্ভুক্ত রয়েছে, অথবা আপনি কাস্টম ইফেক্ট লিখে এডিটেড মিডিয়া আইটেম তৈরি করার সময় সেগুলো পাস করতে পারেন।

আপনি মিডিয়া রিস্কেল করতে পারেন, যা 4k বা 8k ভিডিওর মতো খুব উচ্চ রেজোলিউশনের ইনপুটের ক্ষেত্রে প্রসেসিং রিসোর্স বা ব্যান্ডউইথ বাঁচাতে সহায়ক হতে পারে। উদাহরণস্বরূপ, 480 পিক্সেল উচ্চতায় আনুপাতিকভাবে স্কেল করতে:

কোটলিন

EditedMediaItem.Builder(MediaItem.fromUri(uri))
  .setEffects(
    Effects(
      /* audioProcessors= */ listOf(),
      /* videoEffects= */ listOf(Presentation.createForHeight(480)),
    )
  )
  .build()

জাভা

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(
        new Effects(
            /* audioProcessors= */ ImmutableList.of(),
            /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480))))
    .build();

বিকল্পভাবে, আপনি একটি নির্দিষ্ট গুণক দ্বারা মাপজোখ করতে পারেন, যেমন—আকার অর্ধেক করার জন্য:

কোটলিন

val editedMediaItem =
  EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(
      Effects(
        /* audioProcessors= */ listOf(),
        /* videoEffects= */ listOf(
          ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()
        ),
      )
    )
    .build()

জাভা

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(
        new Effects(
            /* audioProcessors= */ ImmutableList.of(),
            /* videoEffects= */ ImmutableList.of(
                new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())))
    .build();

আপনি একইভাবে ঘূর্ণন কনফিগার করতে পারেন:

কোটলিন

EditedMediaItem.Builder(MediaItem.fromUri(uri))
  .setEffects(
    Effects(
      /* audioProcessors= */ listOf(),
      /* videoEffects= */ listOf(
        ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()
      ),
    )
  )
  .build()

জাভা

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(
        new Effects(
            /* audioProcessors= */ ImmutableList.of(),
            /* videoEffects= */ ImmutableList.of(
                new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build())))
    .build();

কাস্টম ভিডিও ইফেক্ট

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

ExoPlayer.setVideoEffects ব্যবহার করে ExoPlayer-এ ভিডিও ইফেক্টগুলোর প্রিভিউও দেখা যায়। এই API-টি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণের জন্য ইফেক্ট ডেমো অ্যাপটি দেখুন।

ডেমো অ্যাপটিতে কাস্টম ভিডিও ইফেক্টের উদাহরণ রয়েছে।

ইমেজ ইনপুট

ট্রান্সফর্মার ইমেজ ইনপুটকে স্থির ভিডিও ক্লিপ হিসেবে বিবেচনা করে সমর্থন করে। একটি ইমেজকে ইনপুট সোর্স হিসেবে কনফিগার করতে, এই ধাপগুলো অনুসরণ করুন:

  • MediaItem.Builder ব্যবহার করে একটি MediaItem তৈরি করুন। setImageDurationMs কল করে আউটপুট ভিডিওতে ছবির প্রদর্শনের সময়কাল নির্দিষ্ট করুন।

  • MediaItem ঘিরে একটি EditedMediaItem তৈরি করুন। EditedMediaItem.Builder#setFrameRate ব্যবহার করে তৈরি হওয়া ভিডিও স্ট্রিমের জন্য টার্গেট ফ্রেম রেট নির্দিষ্ট করুন।

নিম্নলিখিত উদাহরণটিতে দেখানো হয়েছে কীভাবে প্রতি সেকেন্ডে ৩০ ফ্রেমে একটি ৫-সেকেন্ডের ভিডিও তৈরি করার জন্য একটি ইমেজ ইনপুট কনফিগার করতে হয়:

কোটলিন

val imageMediaItem =
  MediaItem.Builder()
    .setUri(imageUri)
    .setImageDurationMs(5000) // 5 seconds
    .build()

val editedImageItem =
  EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build()

জাভা

MediaItem imageMediaItem =
    new MediaItem.Builder()
        .setUri(imageUri)
        .setImageDurationMs(5000) // 5 seconds
        .build();
new EditedMediaItem.Builder(imageMediaItem)
    .setFrameRate(30) // 30 frames per second
    .build();

অডিও সম্পাদনা

র (PCM) অডিওতে ধারাবাহিকভাবে AudioProcessor ইনস্ট্যান্স প্রয়োগ করে অডিও এফেক্টস বাস্তবায়ন করা হয়। ExoPlayer, DefaultAudioSink.Builder এ অডিও প্রসেসর পাস করা সমর্থন করে, যা অডিও সম্পাদনার প্রিভিউ দেখার সুযোগ দেয়।