Media3 نسخه 1.9.0 منتشر شد! علاوهبر رفع اشکالهای معمول و بهبود عملکرد، جدیدترین نسخه پخش حاوی چهار واحد جدید یا تا حد زیادی بازنویسیشده نیز هست:
media3-inspector- استخراج فراداده و قابهای خارج از بازپخشmedia3-ui-compose-material3- ساختن «میانای کاربر رسانه» Compose Material3 پایه در چند مرحلهmedia3-cast- بهطور خودکار انتقال بین «پخش محتوا» و بازپخشهای محلی را مدیریت میکند-
media3-decoder-av1- بازپخش سازگار AV1 با کدبند افزونه بازنویسیشده براساس کتابخانه dav1d
همچنین بهبودهایی در مدیریت حافظه و حافظه نهان به PreloadManager اضافه کردیم و چندین سادهسازی جدید در ExoPlayer، Transformer، و MediaSession ارائه دادیم.
این نسخه همچنین اولین دسترسی آزمایشی به CompositionPlayer را برای پیشدید کردن ویرایشهای رسانه به شما میدهد.
برای کسب اطلاعات بیشتر ادامه مطلب را بخوانید و مثل همیشه، لطفاً برای مشاهده نمای کلی جامع از تغییرات این نسخه پخش، یادداشتهای کامل نسخه پخش را بررسی کنید.
استخراج فراداده و قابها خارج از بازپخش
مواردی زیادی وجود دارد که میخواهید رسانه را بدون شروع بازپخش بررسی کنید. برای مثال، ممکن است بخواهید تشخیص دهید که چه قالبهایی دارد یا مدت آن چقدر است، یا ریزعکسها را بازیابی کنید.
واحد جدید media3-inspector همه ابزارهای کمکی را برای بازرسی رسانه بدون بازپخش در یک مکان ترکیب میکند:
-
MetadataRetrieverبرای خواندن مدت، قالب، و فرادادههای ثابت ازMediaItem. -
FrameExtractorبرای دریافت قابها یا ریزعکسها از یک مورد. MediaExtractorCompatبهعنوان جایگزینی مستقیم برای کلاس Android platform MediaExtractor، برای دریافت اطلاعات دقیق درباره نمونههای موجود در فایل.
MetadataRetriever و FrameExtractor از الگوی ساده AutoCloseable پیروی میکنند. برای جزئیات بیشتر، به صفحات راهنمای جدید ما نگاهی بیندازید.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}تنها در چند مرحله، «واسط کاربر رسانه» Compose پایه Material3 بسازید
در نسخههای قبلی، شروع به ارائه کد رابط بین عناصر «میانای کاربر Compose» و نمونه «پخشکننده» شما کردیم. با Media3 1.9.0، ما یک ماژول جدید media3-ui-compose-material3 با دکمهها و عناصر محتوای کاملاً سبکدار Material3 اضافه کردیم. این عناصر به شما امکان میدهند تنها در چند مرحله واسط کاربر رسانهای بسازید و درعینحال انعطافپذیری لازم برای سفارشیسازی سبک را فراهم میکنند. اگر ترجیح میدهید سبک واسط کاربر خودتان را بسازید، میتوانید از واحدهای سازنده استفاده کنید که از تمام منطق بهروزرسانی و اتصال مراقبت میکنند، بنابراین فقط باید روی طراحی عنصر واسط کاربر تمرکز کنید. لطفاً صفحههای راهنمای جامع ما را برای واحدهای واسط کاربر 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 ساده با عناصر آماده
انتقال بین «پخش محتوا» و بازپخشهای محلی را بهطور خودکار مدیریت میکند
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
نسخه 1.9.0 شامل یک واحد افزونه AV1 کاملاً بازنویسیشده براساس کتابخانه محبوب dav1d است.
مانند همه واحدهای رمزگشای افزونه، لطفاً توجه داشته باشید که برای دستهبندی صحیح کد بومی مربوطه، نیاز به ساختن از منبع دارد. ادغام یک کدبند، سازگاری و پشتیبانی از قالب را در همه دستگاهها فراهم میکند، اما ازآنجاییکه کدبندی را در فرایند شما اجرا میکند، برای محتوایی که میتوانید به آن اعتماد کنید مناسبتر است.
ادغام مدیریت حافظه و حافظه نهان در PreloadManager
ما PreloadManager خود را نیز بهبود بخشیدهایم. این API قبلاً به شما امکان میداد رسانهها را خارج از بازپخش در حافظه پیشبارگذاری کنید و سپس درصورت نیاز، آنها را بهطور یکپارچه به پخشکننده تحویل دهید. اگرچه عملکرد بسیار خوبی داشت، اما همچنان باید مراقب میبودید که با پیشبار کردن تصادفی بیشازحد، از محدودیتهای حافظه فراتر نروید. بنابراین با Media3 1.9.0، دو ویژگی اضافه کردیم که این کار را بسیار آسانتر و پایدارتر میکند:
- پشتیبانی از حافظه نهان – هنگام تعریف میزان پیشبارگذاری، اکنون میتوانید
PreloadStatus.specifiedRangeCached(0, 5000)را بهعنوان وضعیت هدف برای موارد پیشبارگذاریشده انتخاب کنید. با این کار، محدوده مشخصشده بهجای بار کردن دادهها در حافظه، به حافظه نهان روی دیسک اضافه میشود. با این کار، میتوانید محدوده بسیار بزرگتری از موارد را برای پیشبارگذاری ارائه دهید، زیرا مواردی که دورتر از مورد فعلی هستند دیگر نیازی به اشغال حافظه ندارند. توجه داشته باشید که این کار مستلزم تنظیمCacheدرDefaultPreloadManager.Builderاست. - مدیریت خودکار حافظه – همچنین رابط
LoadControlخود را بهروز کردیم تا بتواند مورد پیشبارگذاری را بهتر مدیریت کند، بنابراین اکنون میتوانید برای همه موارد پیشبارگذاریشده در حافظه، حد بالای حافظه صریحی تعیین کنید. بهطور پیشفرض ۱۴۴ مگابایت است و میتوانید این حد را درDefaultLoadControl.Builderپیکربندی کنید. وقتی به حد مجاز رسیدید،DefaultPreloadManagerبهطور خودکار پیشبار کردن را متوقف میکند و درصورت نیاز، حافظه موارد با اولویت پایینتر را بهطور خودکار آزاد میکند.
به رفتارهای پیشفرض سادهشده جدید در ExoPlayer تکیه کنید
مثل همیشه، بهبودهای افزایشی زیادی نیز به ExoPlayer اضافه کردیم. برای نام بردن از چند مورد:
- بیصدا کردن و روشن کردن صدا – قبلاً روش
setVolumeرا داشتیم، اما اکنون روشهای راحتترmuteوunmuteرا اضافه کردهایم تا بتوانید بدون اینکه خودتان صدا را پیگیری کنید، بهراحتی صدای قبلی را برگردانید. - تشخیص پخشکننده گیرکرده – در برخی موارد نادر، پخشکننده ممکن است بدون پیشرفت در وضعیت بافرینگ یا پخش گیر کند، برای مثال، بهدلیل مشکلات کدک یا پیکربندیهای نادرست. کاربرانتان آزرده خواهند شد، اما شما هرگز این مشکلات را در تجزیهوتحلیلهایتان نمیبینید! برای واضحتر کردن این موضوع، پخشکننده اکنون هنگام تشخیص وضعیت گیر کردن،
StuckPlayerExceptionرا گزارش میکند. - قفل بیداری بهطور پیشفرض – مدیریت قفل بیداری قبلاً اختیاری بود، که منجر به یافتن موارد حاشیهای دشوار میشد که در آن پیشرفت بازپخش هنگام اجرا در پسزمینه میتواند بسیار به تأخیر بیفتد. اکنون این ویژگی اختیاری است، بنابراین لازم نیست نگران آن باشید و همچنین میتوانید همه مدیریتهای دستی قفل بیداری را در اطراف بازپخش بردارید.
- تنظیم سادهشده برای منطق دکمه زیرنویس ناشنوایان – تغییر
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 برای پیشنمایش همزمان
نسخه 1.9.0 «ترکیبکننده» را تحت یک @ExperimentalApi حاشیهنویسی جدید معرفی میکند. این گزارمان نشان میدهد که برای آزمایش دردسترس است، اما هنوز درحال توسعه است.
CompositionPlayer جزء جدیدی در «میاناهای برنامهسازی کاربردی» ویرایش Media3 است که برای پیشنمایش همزمان ویرایشهای رسانه طراحی شده است. CompositionPlayer که براساس رابط آشنای Media3 Player ساخته شده است، به کاربران امکان میدهد تغییرات خود را قبلاز تعهد به فرایند برونبرد در عمل ببینند. این ویژگی از همان Composition شیئی استفاده میکند که برای صادر کردن به Transformer ارسال میکنید، و با یکپارچه کردن مدل داده برای پیشنمایش و صادر کردن، گردش کار ویرایش را ساده میکند.
به شما توصیه میکنیم از CompositionPlayer استفاده کنید و بازخوردتان را همرسانی کنید، و برای جزئیات بیشتر منتظر پستها و بهروزرسانیهای آتی اسناد باشید.
InAppMuxer بهعنوان یک ترکیبکننده پیشفرض در Transformer
اکنون Transformer از InAppMp4Muxer بهعنوان چندبرابرکننده پیشفرض برای نوشتن فایلهای محتوی رسانه استفاده میکند. در داخل، InAppMp4Muxer به واحد Media3 Muxer وابسته است و در همه نسخههای API رفتار یکسانی ارائه میدهد.
توجه داشته باشید که اگرچه Transformer دیگر بهطور پیشفرض از MediaMuxer پلاتفرم Android استفاده نمیکند، اما اگر مورد استفاده شما به آن نیاز دارد، همچنان میتوانید FrameworkMuxer.Factory را ازطریق setMuxerFactory ارائه دهید.
میاناهای برنامهسازی کاربردی جدید تنظیم سرعت
نسخه پخش 1.9.0 «میاناهای برنامهسازی کاربردی» تنظیمات سرعت را برای ویرایش رسانه سادهتر میکند. روشهای جدیدی را مستقیماً در EditedMediaItem.Builder برای کنترل سرعت معرفی کردهایم که باعث میشود API شهودیتر شود. اکنون میتوانید سرعت کلیپ را با فراخوانی 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
در نسخه پخش 1.9.0، 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 با ما تماس بگیرید. مشتاقانه منتظر شنیدن از شما هستیم!
-
اخبار محصولبهعنوان توسعهدهندگان Android، وقتی نوبت به انتخاب عاملها، مدلهای زبانی بزرگ، ابزارها، و میاناهای خط فرمان (CLI) میرسد که برای توسعه نرمافزار استفاده میکنید، گزینههای زیادی دارید. هدف ما این است که به شما کمک کنیم برنامههای Android زیبا و با کیفیت بالا بسازید، مهم نیست که چگونه میخواهید بسازید.
Simona Milanovic • ۴ دقیقه خواندن -
اخبار محصولدر Google Play، ما بهطور مداوم پلاتفرم اشتراک خود را گسترش میدهیم تا به شما کمک کنیم رشد کنید، با مدلهای کسبوکار جدید سازگار شوید، و دقیقاً در جایی که کاربران شما هستند با آنها ارتباط برقرار کنید.
Sheenam Mittal • ۴ دقیقه خواندن -
اخبار محصولسال گذشته، Android Studio برای هر مدل هوش مصنوعی باز شد. امروز، با معرفی پشتیبانی از انتخاب شما برای عاملهای کدنویسی، گام بعدی را برمیداریم.
Matthew Warner • ۳ دقیقه خواندن
هر هفته جدیدترین اطلاعات آماری توسعه Android را در صندوق ورودیتان دریافت کنید.