ক্লিপ, ভিডিও ইফেক্ট প্রয়োগ এবং এক্সপোর্ট অপ্টিমাইজ করুন। keywords_public: Media3, ট্রান্সফরমার, ট্রান্সকোড, ভিডিও এডিটিং, ট্রিমিং, অডিও প্রসেসিং, অ্যান্ড্রয়েড মিডিয়া
ফর্ম্যাটের মধ্যে ট্রান্সকোড করুন
ট্রান্সফরমার তৈরি করার সময় আপনি যে আউটপুট অডিও এবং ভিডিও ফর্ম্যাট তৈরি করতে চান তা নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি দেখায় কিভাবে ট্রান্সফরমারকে H.264/AVC ভিডিও এবং AAC অডিও আউটপুট করার জন্য কনফিগার করতে হয়:
কোটলিন
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();
যদি ইনপুট মিডিয়া ফর্ম্যাটটি ইতিমধ্যেই অডিও বা ভিডিওর কনফিগারেশনের সাথে মিলে যায়, তাহলে ট্রান্সফরমার স্বয়ংক্রিয়ভাবে ট্রান্সমাক্সিং -এ স্যুইচ করে, অর্থাৎ, সংকুচিত নমুনাগুলিকে ইনপুট কন্টেইনার থেকে আউটপুট কন্টেইনারে পরিবর্তন ছাড়াই অনুলিপি করে। এটি একই ফর্ম্যাটে ডিকোডিং এবং পুনঃএনকোডিংয়ের গণনামূলক খরচ এবং সম্ভাব্য মানের ক্ষতি এড়ায়।
অডিও বা ভিডিও সরান
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 মাধ্যমে ট্রান্সফরমারকে সরবরাহ করা এনকোডারটির ইনপুট ফর্ম্যাটের সাথে সামঞ্জস্যপূর্ণ একটি স্তর এবং প্রোফাইল থাকতে হবে।
এই অপ্টিমাইজেশনটি শুধুমাত্র একক-অ্যাসেট MP4 ইনপুটের সাথে কাজ করে, কোনও প্রভাব ছাড়াই, কোনও অপ ভিডিও প্রভাব এবং ঘূর্ণন ছাড়া যা 90 ডিগ্রি দ্বারা বিভাজ্য। যদি অপ্টিমাইজেশন ব্যর্থ হয়, তাহলে ট্রান্সফরমার স্বয়ংক্রিয়ভাবে স্বাভাবিক রপ্তানিতে ফিরে আসে এবং 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 কনস্ট্রাক্টর প্রয়োগের জন্য অডিও এবং ভিডিও ইফেক্টের একটি তালিকা গ্রহণ করে। অভ্যন্তরীণভাবে, ট্রান্সফর্মারের ইফেক্টস ফ্রেমওয়ার্ক ভিডিও ইফেক্টের তালিকাকে GL শেডার প্রোগ্রামের একটি ক্রমানুসারে রূপান্তরিত করে যা ক্রমানুসারে প্রয়োগ করা হয়। কিছু ক্ষেত্রে, ইফেক্টস ফ্রেমওয়ার্ক একটি শেডার প্রোগ্রামের মাধ্যমে একাধিক ইফেক্ট প্রয়োগ করতে সক্ষম। উদাহরণস্বরূপ, একটি শেডার প্রোগ্রাম একাধিক পরপর ম্যাট্রিক্স রূপান্তর প্রয়োগ করতে পারে, যা দক্ষতা এবং গুণমান উন্নত করে।
ExoPlayer.setVideoEffects ব্যবহার করে ExoPlayer-এ ভিডিও ইফেক্ট প্রিভিউ করার জন্যও সমর্থিত। এই API কীভাবে ব্যবহার করবেন তার একটি উদাহরণের জন্য, ইফেক্ট ডেমো অ্যাপটি দেখুন।
ডেমো অ্যাপটিতে কাস্টম ভিডিও ইফেক্টের উদাহরণ রয়েছে।
ছবি ইনপুট
ট্রান্সফরমার ইমেজ ইনপুটগুলিকে স্ট্যাটিক ভিডিও ক্লিপ হিসেবে বিবেচনা করে সমর্থন করে। একটি ইমেজকে ইনপুট সোর্স হিসেবে কনফিগার করতে, এই পদক্ষেপগুলি অনুসরণ করুন:
MediaItem.Builderব্যবহার করে একটিMediaItemতৈরি করুন।setImageDurationMsকল করে আউটপুট ভিডিওতে ছবির প্রদর্শনের সময়কাল নির্দিষ্ট করুন।MediaItemমোড়ানো একটিEditedMediaItemতৈরি করুন।EditedMediaItem.Builder#setFrameRateব্যবহার করে তৈরি ভিডিও স্ট্রিমের জন্য লক্ষ্য ফ্রেম রেট নির্দিষ্ট করুন।
নিচের উদাহরণটি দেখায় যে কীভাবে প্রতি সেকেন্ডে 30 ফ্রেম গতিতে 5-সেকেন্ডের ভিডিও তৈরি করার জন্য একটি চিত্র ইনপুট কনফিগার করতে হয়:
কোটলিন
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(); EditedMediaItem editedImageItem = new EditedMediaItem.Builder(imageMediaItem) .setFrameRate(30) // 30 frames per second .build();
অডিও সম্পাদনা
অডিও ইফেক্টগুলি raw (PCM) অডিওতে AudioProcessor ইনস্ট্যান্সের একটি ক্রম প্রয়োগ করে বাস্তবায়িত হয়। ExoPlayer DefaultAudioSink.Builder এ অডিও প্রসেসর পাস করা সমর্থন করে, যা অডিও সম্পাদনাগুলির পূর্বরূপ দেখার অনুমতি দেয়।