Media3 1.9.0 منتشر شد! علاوهبر رفع اشکالهای معمول و بهبود عملکرد، جدیدترین نسخه پخش همچنین حاوی چهار ماژول جدید یا تا حد زیادی بازنویسیشده است:
media3-inspector- استخراج فراداده و قابهای خارج از بازپخشmedia3-ui-compose-material3- Build a basic Material3 Compose Media UI in just a few stepsmedia3-cast- Automatically handle transitions between Cast and local playbacksmedia3-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 را هم بهتر کردهایم. این 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 برای پیشنمایش همزمان
نسخه ۱.۹.۰ CompositionPlayer را تحت حاشیهنویسی جدید @ExperimentalApi معرفی میکند. حاشیهنویسی نشان میدهد که این ویژگی برای آزمایش دردسترس است، اما هنوز درحال توسعه است.
CompositionPlayer مؤلفه جدیدی در میاناهای برنامهسازی کاربردی ویرایش Media3 است که برای پیشنمایش همزمان ویرایشهای رسانه طراحی شده است. CompositionPlayer که براساس میانای آشنای Media3 Player ساخته شده است به کاربران امکان میدهد تغییرات خود را قبلاز نهایی کردن فرایند صادر کردن ببینند. این API از همان شیء 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 XR به شما امکان میدهد در هر لحظه در سراسر طیف برنامههای فضایی با کاربران ملاقات کنید. در «نشست توسعهدهندگان Android»، با راهاندازی XREAL AURA به نقطه عطف هیجانانگیزی رسیدیم.
Amy Zeppenfeld, Vinny DaSilva • ۳ دقیقه خواندن -
اخبار محصولدر عصر هوش مصنوعی، کاربران دیگر فقط در برنامهها ضربه نمیزنند، بلکه اهداف سطح بالا را بیان میکنند و انتظار دارند عاملهای هوش مصنوعی مانند Gemini گردشهای کاری چندمرحلهای را، گاهی در چندین برنامه در دستگاههایشان، تکمیل کنند.
Jingyu Shi • زمان خواندن: ۴ دقیقه -
اخبار محصولامروز در «نشست توسعهدهندگان Android»، دردسترس بودن گسترده بسیاری از ابزارها و میاناهای برنامهسازی کاربردی را اعلام میکنیم که برای رفع اصطکاک روزمره و ارائه انعطافپذیری بیشتر به شما برای ساختن برنامههای Android عالی طراحی شدهاند.
Matthew McCullough • زمان خواندن: ۴ دقیقه
جدیدترین اطلاعات آماری توسعه Android را بهصورت هفتگی در صندوق ورودیتان دریافت کنید.