Transformer
সাথে শুরু করা নিম্নলিখিত পদক্ষেপগুলি নিয়ে গঠিত:
- আপনার প্রকল্পে নির্ভরতা হিসাবে Media3 ট্রান্সফরমার যোগ করুন।
- একটি
EditedMediaItem
তৈরি করুন যা মিডিয়ার প্রতিনিধিত্ব করে প্রক্রিয়া করতে এবং এটিতে প্রয়োগ করতে সম্পাদনা করুন৷ - একটি
Transformer
তৈরি করুন, প্রয়োজনীয় আউটপুট বর্ণনা করে এবং সমাপ্তি এবং ত্রুটির ঘটনাগুলির জন্য একটি শ্রোতা। - রপ্তানি অপারেশন শুরু করুন, সম্পাদনা করতে
EditedMediaItem
এ পাস করুন এবং একটি আউটপুট পাথ। রপ্তানির সময়, আপনি বর্তমান অগ্রগতি জিজ্ঞাসা করতে পারেন বা অপারেশন বাতিল করতে পারেন। - রপ্তানি শেষ হলে, প্রয়োজন অনুযায়ী আউটপুট পরিচালনা করুন। উদাহরণস্বরূপ, আপনি অন্য অ্যাপে আউটপুট ভাগ করতে পারেন বা এটি একটি সার্ভারে আপলোড করতে পারেন।
এই ধাপগুলি সম্পর্কে আরও বিস্তারিত জানতে পড়ুন এবং সম্পূর্ণ উদাহরণের জন্য ট্রান্সফরমার ডেমো অ্যাপে TransformerActivity
দেখুন।
নির্ভরতা হিসাবে Media3 ট্রান্সফরমার যোগ করুন
ট্রান্সফরমার ব্যবহার শুরু করার সবচেয়ে সহজ উপায় হল আপনার অ্যাপ মডিউলের build.gradle
ফাইলে লাইব্রেরিতে gradle নির্ভরতা যোগ করা:
কোটলিন
implementation("androidx.media3:media3-transformer:1.5.0") implementation("androidx.media3:media3-effect:1.5.0") implementation("androidx.media3:media3-common:1.5.0")
গ্রোভি
implementation "androidx.media3:media3-transformer:1.5.0" implementation "androidx.media3:media3-effect:1.5.0" implementation "androidx.media3:media3-common:1.5.0"
যেখানে 1.5.0 আপনার পছন্দের সংস্করণ। রিলিজ নোটের সাথে পরামর্শ করে সর্বশেষ সংস্করণটি পাওয়া যাবে।
উপলব্ধ লাইব্রেরি মডিউল সম্পর্কে আরও তথ্য Google Maven AndroidX Media3 পৃষ্ঠায় পাওয়া যাবে।
জাভা 8 সমর্থন চালু করুন
যদি ইতিমধ্যে সক্ষম না করা থাকে, তাহলে আপনাকে android
বিভাগে নিম্নলিখিত যোগ করে ট্রান্সফরমারের উপর নির্ভরশীল সমস্ত build.gradle
ফাইলে Java 8 সমর্থন চালু করতে হবে:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
একটি রূপান্তর শুরু করুন
একটি ইনপুট ফাইলের জন্য অডিও মুছে ফেলার জন্য একটি EditedMediaItem
তৈরি করার একটি উদাহরণ, তারপর H.265/HEVC ভিডিও রপ্তানি করার জন্য একটি Transformer
ইনস্ট্যান্স তৈরি এবং কনফিগার করার, ফলাফলটিকে outputPath
এ আউটপুট করার উদাহরণ।
কোটলিন
val inputMediaItem = MediaItem.fromUri("path_to_input_file") val editedMediaItem = EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build() val transformer = Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build() transformer.start(editedMediaItem, outputPath)
জাভা
MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file"); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build(); Transformer transformer = new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build(); transformer.start(editedMediaItem, outputPath);
মিডিয়া আইটেম সম্পর্কে আরও তথ্যের জন্য, ExoPlayer মিডিয়া আইটেম পৃষ্ঠাটি দেখুন। ইনপুট একটি প্রগতিশীল বা একটি অভিযোজিত স্ট্রীম হতে পারে, কিন্তু আউটপুট সবসময় একটি প্রগতিশীল স্ট্রীম হয়। অভিযোজিত ইনপুটগুলির জন্য, সর্বোচ্চ-রেজোলিউশনের ট্র্যাকগুলি সর্বদা রূপান্তরের জন্য নির্বাচন করা হয়। ইনপুটটি ExoPlayer দ্বারা সমর্থিত যেকোনো ধারক বিন্যাসের হতে পারে, তবে আউটপুটটি সর্বদা একটি MP4 ফাইল।
আপনি একই Transformer
দৃষ্টান্তে ক্রমানুসারে একাধিক রপ্তানি ক্রিয়াকলাপ সম্পাদন করতে পারেন, তবে একই উদাহরণ সহ সমসাময়িক রপ্তানি সমর্থিত নয়।
থ্রেডিং একটি নোট
ট্রান্সফরমার দৃষ্টান্ত একটি একক অ্যাপ্লিকেশন থ্রেড থেকে অ্যাক্সেস করা আবশ্যক, এবং শ্রোতা পদ্ধতি একই থ্রেডে কল করা হয়। বেশিরভাগ ক্ষেত্রে, অ্যাপ্লিকেশন থ্রেডটি শুধুমাত্র অ্যাপ্লিকেশনের প্রধান থ্রেড হতে পারে। অভ্যন্তরীণভাবে, ট্রান্সফরমার পটভূমিতে তার কাজ করে এবং অ্যাপ্লিকেশন থ্রেডে শ্রোতা পদ্ধতিতে তার কলগুলি পোস্ট করে।
ঘটনা শুনুন
start
পদ্ধতিটি অ্যাসিঙ্ক্রোনাস। এটি অবিলম্বে ফিরে আসে এবং অ্যাপটি Transformer
নির্মাতার কাছে শ্রোতার মাধ্যমে ইভেন্টগুলির বিষয়ে অবহিত হয়।
কোটলিন
val transformerListener: Transformer.Listener = object : Transformer.Listener { override fun onCompleted(composition: Composition, result: ExportResult) { playOutput() } override fun onError(composition: Composition, result: ExportResult, exception: ExportException) { displayError(exception) } }
জাভা
Transformer.Listener transformerListener = new Transformer.Listener() { @Override public void onCompleted(Composition composition, ExportResult result) { playOutput(); } @Override public void onError(Composition composition, ExportResult result, ExportException exception) { displayError(exception); } };
ExportResult
আউটপুট ফাইল সম্পর্কে তথ্য অন্তর্ভুক্ত করে, ফাইলের আকার এবং অডিও এবং ভিডিওর গড় বিটরেট সহ প্রযোজ্য।
অগ্রগতি আপডেট পান
একটি রূপান্তরের বর্তমান অগ্রগতি অনুসন্ধান করতে Transformer.getProgress
কল করুন। প্রত্যাবর্তিত মান অগ্রগতির অবস্থা নির্দেশ করে। যদি অগ্রগতির অবস্থা PROGRESS_STATE_AVAILABLE
হয়, তাহলে প্রদত্ত ProgressHolder
বর্তমান অগ্রগতি শতাংশের সাথে আপডেট করা হয়। নিম্নলিখিত উদাহরণ দেখায় কিভাবে পর্যায়ক্রমে একটি রূপান্তরের অগ্রগতি অনুসন্ধান করতে হয়, যেখানে একটি অগ্রগতি বার আপডেট করতে updateProgressInUi
পদ্ধতি প্রয়োগ করা যেতে পারে।
কোটলিন
transformer.start(inputMediaItem, outputPath) val progressHolder = ProgressHolder() mainHandler.post( object : Runnable { override fun run() { val progressState: @ProgressState Int = transformer.getProgress(progressHolder) updateProgressInUi(progressState, progressHolder) if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */this, /* delayMillis= */500) } } } )
জাভা
transformer.start(inputMediaItem, outputPath); ProgressHolder progressHolder = new ProgressHolder(); mainHandler.post( new Runnable() { @Override public void run() { @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder); updateProgressInUi(progressState, progressHolder); if (progressState != PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500); } } });
একটি রূপান্তর বাতিল করুন
ব্যবহারকারী যদি রপ্তানি প্রবাহ থেকে ফিরে যেতে পছন্দ করেন, তাহলে Transformer.cancel
দিয়ে রপ্তানি কার্যক্রম বাতিল করুন। হার্ডওয়্যার ভিডিও কোডেকগুলির মতো সংস্থানগুলি সীমিত, বিশেষত নিম্ন-প্রান্তের ডিভাইসগুলিতে, তাই আউটপুটের প্রয়োজন না হলে সংস্থানগুলি খালি করতে এটি করা গুরুত্বপূর্ণ৷
Transformer
সাথে শুরু করা নিম্নলিখিত পদক্ষেপগুলি নিয়ে গঠিত:
- আপনার প্রকল্পে নির্ভরতা হিসাবে Media3 ট্রান্সফরমার যোগ করুন।
- একটি
EditedMediaItem
তৈরি করুন যা মিডিয়ার প্রতিনিধিত্ব করে প্রক্রিয়া করতে এবং এটিতে প্রয়োগ করতে সম্পাদনা করুন৷ - একটি
Transformer
তৈরি করুন, প্রয়োজনীয় আউটপুট বর্ণনা করে এবং সমাপ্তি এবং ত্রুটির ঘটনাগুলির জন্য একটি শ্রোতা। - রপ্তানি অপারেশন শুরু করুন, সম্পাদনা করতে
EditedMediaItem
এ পাস করুন এবং একটি আউটপুট পাথ। রপ্তানির সময়, আপনি বর্তমান অগ্রগতি জিজ্ঞাসা করতে পারেন বা অপারেশন বাতিল করতে পারেন। - রপ্তানি শেষ হলে, প্রয়োজন অনুযায়ী আউটপুট পরিচালনা করুন। উদাহরণস্বরূপ, আপনি অন্য অ্যাপে আউটপুট ভাগ করতে পারেন বা এটি একটি সার্ভারে আপলোড করতে পারেন।
এই ধাপগুলি সম্পর্কে আরও বিস্তারিত জানতে পড়ুন এবং সম্পূর্ণ উদাহরণের জন্য ট্রান্সফরমার ডেমো অ্যাপে TransformerActivity
দেখুন।
নির্ভরতা হিসাবে Media3 ট্রান্সফরমার যোগ করুন
ট্রান্সফরমার ব্যবহার শুরু করার সবচেয়ে সহজ উপায় হল আপনার অ্যাপ মডিউলের build.gradle
ফাইলে লাইব্রেরিতে gradle নির্ভরতা যোগ করা:
কোটলিন
implementation("androidx.media3:media3-transformer:1.5.0") implementation("androidx.media3:media3-effect:1.5.0") implementation("androidx.media3:media3-common:1.5.0")
গ্রোভি
implementation "androidx.media3:media3-transformer:1.5.0" implementation "androidx.media3:media3-effect:1.5.0" implementation "androidx.media3:media3-common:1.5.0"
যেখানে 1.5.0 আপনার পছন্দের সংস্করণ। রিলিজ নোটের সাথে পরামর্শ করে সর্বশেষ সংস্করণটি পাওয়া যাবে।
উপলব্ধ লাইব্রেরি মডিউল সম্পর্কে আরও তথ্য Google Maven AndroidX Media3 পৃষ্ঠায় পাওয়া যাবে।
জাভা 8 সমর্থন চালু করুন
যদি ইতিমধ্যে সক্ষম না করা থাকে, তাহলে আপনাকে android
বিভাগে নিম্নলিখিত যোগ করে ট্রান্সফরমারের উপর নির্ভরশীল সমস্ত build.gradle
ফাইলে Java 8 সমর্থন চালু করতে হবে:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
একটি রূপান্তর শুরু করুন
একটি ইনপুট ফাইলের জন্য অডিও মুছে ফেলার জন্য একটি EditedMediaItem
তৈরি করার একটি উদাহরণ, তারপর H.265/HEVC ভিডিও রপ্তানি করার জন্য একটি Transformer
ইনস্ট্যান্স তৈরি এবং কনফিগার করার, ফলাফলটিকে outputPath
এ আউটপুট করার উদাহরণ।
কোটলিন
val inputMediaItem = MediaItem.fromUri("path_to_input_file") val editedMediaItem = EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build() val transformer = Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build() transformer.start(editedMediaItem, outputPath)
জাভা
MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file"); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build(); Transformer transformer = new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build(); transformer.start(editedMediaItem, outputPath);
মিডিয়া আইটেম সম্পর্কে আরও তথ্যের জন্য, ExoPlayer মিডিয়া আইটেম পৃষ্ঠাটি দেখুন। ইনপুট একটি প্রগতিশীল বা একটি অভিযোজিত স্ট্রীম হতে পারে, কিন্তু আউটপুট সবসময় একটি প্রগতিশীল স্ট্রীম হয়। অভিযোজিত ইনপুটগুলির জন্য, সর্বোচ্চ-রেজোলিউশনের ট্র্যাকগুলি সর্বদা রূপান্তরের জন্য নির্বাচন করা হয়। ইনপুটটি ExoPlayer দ্বারা সমর্থিত যেকোনো ধারক বিন্যাসের হতে পারে, তবে আউটপুটটি সর্বদা একটি MP4 ফাইল।
আপনি একই Transformer
দৃষ্টান্তে ক্রমানুসারে একাধিক রপ্তানি ক্রিয়াকলাপ সম্পাদন করতে পারেন, তবে একই উদাহরণ সহ সমসাময়িক রপ্তানি সমর্থিত নয়।
থ্রেডিং একটি নোট
ট্রান্সফরমার দৃষ্টান্ত একটি একক অ্যাপ্লিকেশন থ্রেড থেকে অ্যাক্সেস করা আবশ্যক, এবং শ্রোতা পদ্ধতি একই থ্রেডে কল করা হয়। বেশিরভাগ ক্ষেত্রে, অ্যাপ্লিকেশন থ্রেডটি শুধুমাত্র অ্যাপ্লিকেশনের প্রধান থ্রেড হতে পারে। অভ্যন্তরীণভাবে, ট্রান্সফরমার পটভূমিতে তার কাজ করে এবং অ্যাপ্লিকেশন থ্রেডে শ্রোতা পদ্ধতিতে তার কলগুলি পোস্ট করে।
ঘটনা শুনুন
start
পদ্ধতিটি অ্যাসিঙ্ক্রোনাস। এটি অবিলম্বে ফিরে আসে এবং অ্যাপটি Transformer
নির্মাতার কাছে শ্রোতার মাধ্যমে ইভেন্টগুলির বিষয়ে অবহিত হয়।
কোটলিন
val transformerListener: Transformer.Listener = object : Transformer.Listener { override fun onCompleted(composition: Composition, result: ExportResult) { playOutput() } override fun onError(composition: Composition, result: ExportResult, exception: ExportException) { displayError(exception) } }
জাভা
Transformer.Listener transformerListener = new Transformer.Listener() { @Override public void onCompleted(Composition composition, ExportResult result) { playOutput(); } @Override public void onError(Composition composition, ExportResult result, ExportException exception) { displayError(exception); } };
ExportResult
আউটপুট ফাইল সম্পর্কে তথ্য অন্তর্ভুক্ত করে, ফাইলের আকার এবং অডিও এবং ভিডিওর গড় বিটরেট সহ প্রযোজ্য।
অগ্রগতি আপডেট পান
একটি রূপান্তরের বর্তমান অগ্রগতি অনুসন্ধান করতে Transformer.getProgress
কল করুন। প্রত্যাবর্তিত মান অগ্রগতির অবস্থা নির্দেশ করে। যদি অগ্রগতির অবস্থা PROGRESS_STATE_AVAILABLE
হয়, তাহলে প্রদত্ত ProgressHolder
বর্তমান অগ্রগতি শতাংশের সাথে আপডেট করা হয়। নিম্নলিখিত উদাহরণ দেখায় কিভাবে পর্যায়ক্রমে একটি রূপান্তরের অগ্রগতি অনুসন্ধান করতে হয়, যেখানে একটি অগ্রগতি বার আপডেট করতে updateProgressInUi
পদ্ধতি প্রয়োগ করা যেতে পারে।
কোটলিন
transformer.start(inputMediaItem, outputPath) val progressHolder = ProgressHolder() mainHandler.post( object : Runnable { override fun run() { val progressState: @ProgressState Int = transformer.getProgress(progressHolder) updateProgressInUi(progressState, progressHolder) if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */this, /* delayMillis= */500) } } } )
জাভা
transformer.start(inputMediaItem, outputPath); ProgressHolder progressHolder = new ProgressHolder(); mainHandler.post( new Runnable() { @Override public void run() { @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder); updateProgressInUi(progressState, progressHolder); if (progressState != PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500); } } });
একটি রূপান্তর বাতিল করুন
ব্যবহারকারী যদি রপ্তানি প্রবাহ থেকে ফিরে যেতে পছন্দ করেন, তাহলে Transformer.cancel
দিয়ে রপ্তানি কার্যক্রম বাতিল করুন। হার্ডওয়্যার ভিডিও কোডেকগুলির মতো সংস্থানগুলি সীমিত, বিশেষত নিম্ন-প্রান্তের ডিভাইসগুলিতে, তাই আউটপুটের প্রয়োজন না হলে সংস্থানগুলি খালি করতে এটি করা গুরুত্বপূর্ণ৷