Media3 1.9.0 منتشر شد! علاوهبر رفع اشکالهای معمول و بهبود عملکرد، جدیدترین نسخه پخش همچنین حاوی چهار ماژول جدید یا تا حد زیادی بازنویسیشده است:
media3-inspector- استخراج فراداده و قابهای خارج از بازپخشmedia3-ui-compose-material3- Build a basic Material3 Compose Media UI in just a few stepsmedia3-cast- بهطور خودکار انتقال بین Cast و بازپخشهای محلی را مدیریت میکندmedia3-decoder-av1- بازپخش AV1 سازگار با رمزگشای افزونه بازنویسیشده براساس کتابخانه dav1d
همچنین بهبودهایی در حافظه پنهان و مدیریت حافظه به PreloadManager اضافه کردیم و چندین سادهسازی جدید برای ExoPlayer، Transformer، و MediaSession ارائه کردیم.
این نسخه همچنین اولین دسترسی آزمایشی به CompositionPlayer را برای پیشدید ویرایشهای رسانه به شما میدهد.
برای کسب اطلاعات بیشتر، ادامه مطلب را بخوانید و مثل همیشه لطفاً برای دریافت نمای کلی جامعی از تغییرات این نسخه، یادداشتهای انتشار کامل را بررسی کنید.
استخراج فراداده و فریمها خارج از بازپخش
موارد زیادی وجود دارد که میخواهید رسانه را بدون شروع بازپخش بررسی کنید. برای مثال، ممکن است بخواهید تشخیص دهید که حاوی چه قالبهایی است یا مدت زمان آن چقدر است، یا ریزعکسها را بازیابی کنید.
ماژول جدید media3-inspector همه ابزارهای کمکی را برای بازرسی رسانه بدون بازپخش در یک مکان ترکیب میکند:
MetadataRetrieverبرای خواندن مدت، قالب، و فرادادههای ثابت ازMediaItem.FrameExtractorبرای دریافت قاب یا ریزعکس از یک مورد.MediaExtractorCompatبهعنوان جایگزین مستقیم کلاس MediaExtractor پلاتفرم Android، برای دریافت اطلاعات دقیق درباره نمونههای موجود در فایل.
MetadataRetriever و FrameExtractor از الگوی ساده AutoCloseable پیروی میکنند. برای جزئیات بیشتر، به صفحههای راهنمای جدید ما نگاهی بیندازید.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}ساختن یک رابط کاربری رسانه Compose پایه با Material3 در چند مرحله ساده
در نسخههای قبلی، ارائه کد اتصالدهنده بین عناصر میانای کاربر Compose و نمونه Player را شروع کردیم. با Media3 1.9.0، یک ماژول جدید media3-ui-compose-material3 با دکمهها و عناصر محتوای کاملاً سبکدار Material3 اضافه کردیم. این الگوها به شما امکان میدهند فقط در چند مرحله یک واسط کاربر رسانه بسازید و درعینحال انعطافپذیری کامل برای سفارشیسازی سبک را فراهم میکنند. اگر ترجیح میدهید سبک میانای کاربر خودتان را بسازید، میتوانید از بلوکهای ساختمانی استفاده کنید که منطق بهروزرسانی و اتصال را مدیریت میکنند، بنابراین فقط باید روی طراحی عنصر میانای کاربر تمرکز کنید. لطفاً صفحات راهنمای گسترده ما را برای ماژولهای Compose UI بررسی کنید.
همچنین همچنان درحال کار روی مؤلفههای Compose بیشتری هستیم، مثل نوار کاوش ازپیشساخته، جایگزینی کامل و آماده برای PlayerView، و همچنین ادغام زیرنویس و آگهی.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
میانای کاربر پخشکننده Compose ساده با عناصر آماده
انتقال بین Cast و بازپخشهای محلی را بهطور خودکار مدیریت کنید
CastPlayer در ماژول media3-cast بازنویسی شده است تا بهطور خودکار انتقال بین بازپخش محلی (برای مثال با ExoPlayer) و بازپخش ازراهدور «پخش محتوا» را مدیریت کند.
وقتی MediaSession را راهاندازی میکنید، کافی است CastPlayer را در اطراف ExoPlayer بسازید و MediaRouteButton را به میانای کاربر اضافه کنید و کار تمام است!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
ادغام CastPlayer جدید در برنامه نمایشی جلسه Media3
بازپخش AV1 سازگار با افزونه بازنویسیشده براساس dav1d
نسخه ۱.۹.۰ حاوی یک ماژول افزونه AV1 کاملاً بازنویسیشده براساس کتابخانه محبوب dav1d است.
همانند همه ماژولهای رمزگشای افزونه، لطفاً توجه داشته باشید که برای بستهبندی صحیح کد بومی مربوطه، به ساخت از منبع نیاز است. بستهبندی رمزگشا باعث سازگاری و پشتیبانی از قالب در همه دستگاهها میشود، اما چون رمزگشایی را در فرایند شما اجرا میکند، برای محتوایی که میتوانید به آن اعتماد کنید مناسبتر است.
ادغام کردن حافظه پنهان و مدیریت حافظه در PreloadManager
PreloadManager خود را نیز بهتر کردهایم. این ویژگی قبلاً به شما امکان میداد رسانه را خارج از بازپخش در حافظه پیشبارگیری کنید و سپس درصورت نیاز آن را بهطور یکپارچه به پخشکننده تحویل دهید. اگرچه عملکرد بسیار خوبی داشت، اما همچنان باید مراقب میبودید که با پیشبارگیری تصادفی بیشازحد، از محدودیتهای حافظه فراتر نروید. بنابراین با Media3 1.9.0، دو ویژگی اضافه کردیم که این کار را بسیار آسانتر و پایدارتر میکند:
- پشتیبانی از ذخیرهسازی در حافظه نهان – هنگام تعریف میزان پیشبارگیری، اکنون میتوانید
PreloadStatus.specifiedRangeCached(0, 5000)را بهعنوان حالت هدف برای موارد پیشبارگیریشده انتخاب کنید. با این کار، محدوده مشخصشده بهجای بار کردن دادهها در حافظه، به حافظه پنهان شما در دیسک اضافه میشود. با این کار، میتوانید طیف بسیار بزرگتری از موارد را برای پیشبارگیری ارائه دهید، زیرا مواردی که از مورد فعلی دورتر هستند دیگر نیازی به اشغال حافظه ندارند. توجه داشته باشید که این کار مستلزم تنظیمCacheدرDefaultPreloadManager.Builderاست. - مدیریت خودکار حافظه – همچنین میانای
LoadControlرا بهروزرسانی کردیم تا مورد پیشبارگیری را بهتر مدیریت کند، بنابراین اکنون میتوانید حد بالای حافظه صریحی را برای همه موارد پیشبارگیریشده در حافظه تنظیم کنید. این مقدار بهطور پیشفرض ۱۴۴ مگابایت است و میتوانید این محدودیت را درDefaultLoadControl.Builderپیکربندی کنید.DefaultPreloadManagerبهمحض رسیدن به حد مجاز، پیشبارگیری را بهطور خودکار متوقف میکند و درصورت نیاز، حافظه موارد با اولویت پایینتر را بهطور خودکار آزاد میکند.
به رفتارهای پیشفرض سادهشده جدید در ExoPlayer تکیه کنید
مثل همیشه، بهبودهای افزایشی زیادی نیز به ExoPlayer اضافه کردیم. برای نام بردن چند مورد:
- بیصدا و باصدا کردن – ما قبلاً روش
setVolumeرا داشتیم، اما اکنون روشهای راحتmuteوunmuteرا اضافه کردهایم تا بهراحتی صدای قبلی را بدون نیاز به پیگیری خودتان بازیابی کنید. - تشخیص گیر کردن پخشکننده – در برخی موارد نادر، پخشکننده ممکن است در حالت میانگیری یا پخش گیر کند و هیچ پیشرفتی نداشته باشد، مثلاً بهدلیل مشکلات کدک یا پیکربندیهای نادرست. کاربرانتان آزرده میشوند، اما شما هرگز این مشکلات را در تجزیهوتحلیلهایتان نمیبینید! برای واضحتر کردن این موضوع، اکنون پخشکننده وقتی وضعیت گیرکردن را تشخیص میدهد،
StuckPlayerExceptionرا گزارش میکند. - Wakelock بهطور پیشفرض – مدیریت قفل بیدارباش قبلاً اختیاری بود، که منجر به موارد حاشیهای میشد که بهسختی قابل شناسایی بودند و در آنها پیشرفت بازپخش هنگام اجرا در پسزمینه میتوانست بسیار تأخیر داشته باشد. اکنون این ویژگی بهصورت انصرافی است، بنابراین لازم نیست نگران آن باشید و همچنین میتوانید تمام مدیریت دستی قفل بیدار شدن را در اطراف بازپخش حذف کنید.
- تنظیم سادهشده برای منطق دکمه CC – تغییر
TrackSelectionParametersبه «روشن/خاموش کردن زیرنویس» بهطور شگفتانگیزی سخت بود، بنابراین یک گزینه بولی سادهselectTextByDefaultبرای این مورد استفاده اضافه کردیم.
ساده کردن اولویتهای دکمه رسانه در MediaSession
تاکنون، برای تعریف اولویتهایتان درباره اینکه کدام دکمهها باید در کشوی اعلان رسانه در Android Auto یا WearOS نشان داده شوند، لازم بود فرمانها و دکمههای سفارشی تعریف کنید، حتی اگر فقط میخواستید یک روش پخشکننده استاندارد را راهاندازی کنید.
Media3 1.9.0 عملکرد جدیدی دارد که این کار را بسیار سادهتر میکند – اکنون میتوانید اولویتهای دکمه رسانه خود را با یک فرمان پخشکننده استاندارد تعریف کنید، بدون اینکه نیازی به مدیریت فرمان سفارشی باشد.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
اولویتهای دکمه رسانه با دکمه جلو بردن سریع
CompositionPlayer برای پیشنمایش همزمان
نسخه ۱.۹.۰ CompositionPlayer را تحت حاشیهنویسی جدید @ExperimentalApi معرفی میکند. حاشیهنویسی نشان میدهد که این ویژگی برای آزمایش دردسترس است، اما هنوز درحال توسعه است.
CompositionPlayer مؤلفه جدیدی در میاناهای برنامهسازی کاربردی ویرایش Media3 است که برای پیشنمایش همزمان ویرایشهای رسانه طراحی شده است. CompositionPlayer که براساس میانای آشنای Media3 Player ساخته شده است به کاربران امکان میدهد تغییرات خود را قبلاز نهایی کردن فرایند صادر کردن ببینند. این روش از همان شیء Composition استفاده میکند که برای صادر کردن به Transformer ارسال میکنید، و با یکپارچه کردن مدل داده برای پیشنمایش و صادر کردن، گردش کار ویرایش را ساده میکند.
توصیه میکنیم استفاده از CompositionPlayer را شروع کنید و بازخوردتان را با ما درمیان بگذارید، و برای جزئیات بیشتر، منتظر پستها و بهروزرسانیهای آتی اسناد باشید.
InAppMuxer بهعنوان مالتیپلکسر پیشفرض در Transformer
Transformer اکنون از InAppMp4Muxer بهعنوان ترکیبکننده پیشفرض برای نوشتن فایلهای محفظه رسانه استفاده میکند. در داخل، InAppMp4Muxer به ماژول Media3 Muxer وابسته است و رفتار ثابتی را در همه نسخههای API ارائه میدهد.
توجه داشته باشید که اگرچه Transformer دیگر بهطور پیشفرض از MediaMuxer پلاتفرم Android استفاده نمیکند، اما اگر مورد استفاده شما به آن نیاز داشته باشد، همچنان میتوانید FrameworkMuxer.Factory را ازطریق setMuxerFactory ارائه دهید.
میاناهای برنامهسازی کاربردی جدید برای اصلاح سرعت
نسخه ۱.۹.۰ میاناهای برنامهسازی کاربردی تنظیم سرعت را برای ویرایش رسانه ساده میکند. روشهای جدیدی را مستقیماً در EditedMediaItem.Builder برای کنترل سرعت معرفی کردهایم که باعث میشود میانای برنامهسازی کاربردی شهودیتر شود. اکنون میتوانید سرعت کلیپ را با فراخوانی setSpeed(SpeedProvider provider) در EditedMediaItem.Builder تغییر دهید:
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()این رویکرد جدید جایگزین روش قبلی استفاده از Effects#createExperimentalSpeedChangingEffects() میشود که آن را منسوخ کردهایم و در نسخه پخش آتی برخواهیم داشت.
معرفی انواع قطعه برای EditedMediaItemSequence
در نسخه ۱.۹.۰، EditedMediaItemSequence باید نوع قطعههای خروجی موردنظر را درطول ایجاد توالی مشخص کند. این تغییر تضمین میکند که مدیریت قطعه در سراسر «ترکیببندی» صریحتر و قویتر باشد.
این کار ازطریق سازنده جدید EditedMediaItemSequence.Builder انجام میشود که مجموعهای از انواع قطعه (مثلاً C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO) را میپذیرد.
برای سادهسازی ایجاد، روشهای راحتی ایستا جدیدی اضافه کردهایم:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
توصیه میکنیم برای تعریف واضحتر و مطمئنتر توالی، به سازنده جدید یا روشهای راحتتر مهاجرت کنید.
نمونهای از ایجاد توالی فقط ویدیویی:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()اگر با اشکالی مواجه شدید یا اگر سؤال یا درخواست ویژگی دارید، لطفاً ازطریق Media3 issue Tracker با ما تماس بگیرید. مشتاقانه منتظر شنیدن از شما هستیم!
-
اخبار محصولبا شتاب گرفتن توسعه عاملگرا، مهندسی Android به مرز هیجانانگیز جدیدی میرسد: حرکت از تکمیل کد کمکی به سمت عاملهایی که تحت هدایت شما بهطور سرتاسری اجرا میشوند. در انتخاب و استفاده از مدلها و عاملها، آزادی و انعطافپذیری کامل دارید.
Jason Buchel • ۳ دقیقه خواندن -
اخبار محصولامروز، نحوه ورود به فصل بعدی چشمانداز «فراتر از یک فروشگاه» را همرسانی کردیم. از زبانه «شما»، که اکنون پایگاه شخصی بیشاز ۲۵۰ میلیون کاربر فعال ماهانه است، تا پلاتفرم بازی یکپارچه ما که بیشاز ۷۰۰ میلیون نمایه بازیکن را به هم متصل میکند، Google Play در هر جایی که کاربران باشند به آنها دسترسی دارد.
Paul Feng • ۳ دقیقه برای خواندن -
اخبار محصولبا Googlebook، خوشحالیم که به کاربران کمک میکنیم خودشان را بیان کنند و به این ابزارها دسترسی پیدا کنند.
Cyrus Stoller • ۲ دقیقه خواندن
جدیدترین اطلاعات آماری توسعه Android را بهصورت هفتگی در صندوق ورودیتان دریافت کنید.