مدیا۳ نسخه ۱.۹.۰ منتشر شد! علاوه بر رفع اشکالات معمول و بهبود عملکرد، آخرین نسخه شامل چهار ماژول جدید یا تا حد زیادی بازنویسی شده نیز هست:
-
media3-inspector- استخراج فرادادهها و فریمها خارج از پخش -
media3-ui-compose-material3- ساخت یک رابط کاربری سادهی رسانهای Material3 Compose تنها در چند مرحله -
media3-cast- به طور خودکار انتقال بین پخشهای Cast و محلی را مدیریت میکند -
media3-decoder-av1- پخش مداوم AV1 با رمزگشای افزونه بازنویسی شده بر اساس کتابخانه dav1d
ما همچنین بهبودهایی در ذخیرهسازی و مدیریت حافظه پنهان (caching) به PreloadManager اضافه کردیم و چندین سادهسازی جدید ExoPlayer ، Transformer و MediaSession ارائه دادیم.
این نسخه همچنین اولین دسترسی آزمایشی به CompositionPlayer را برای پیشنمایش ویرایشهای رسانهای در اختیار شما قرار میدهد.
برای کسب اطلاعات بیشتر ادامه مطلب را بخوانید، و مثل همیشه لطفاً برای مرور کلی تغییرات این نسخه، یادداشتهای کامل انتشار را بررسی کنید.
استخراج فرادادهها و فریمها خارج از پخش
موارد زیادی وجود دارد که میخواهید بدون شروع پخش، رسانه را بررسی کنید. برای مثال، ممکن است بخواهید تشخیص دهید که شامل چه فرمتهایی است یا مدت زمان آن چقدر است، یا تصاویر کوچک (thumbnails) را بازیابی کنید.
ماژول جدید media3-inspector تمام ابزارها را برای بازرسی رسانهها بدون پخش در یک مکان ترکیب میکند:
-
MetadataRetrieverبرای خواندن مدت زمان، قالب و ابردادههای استاتیک از یکMediaItem. -
FrameExtractorبرای دریافت فریمها یا تصاویر بندانگشتی از یک آیتم. -
MediaExtractorCompatبه عنوان جایگزینی مستقیم برای کلاس MediaExtractor پلتفرم اندروید، برای دریافت اطلاعات دقیق در مورد نمونههای موجود در فایل.
MetadataRetriever و FrameExtractor از یک الگوی سادهی AutoCloseable پیروی میکنند. برای جزئیات بیشتر، به صفحات راهنمای جدید ما نگاهی بیندازید.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}ساخت رابط کاربری اولیه Material3 Compose Media تنها در چند مرحله
در نسخههای قبلی، ما شروع به ارائه کد رابط بین عناصر رابط کاربری Compose و نمونه پخشکننده شما کردیم. با Media3 1.9.0، ماژول جدید media3-ui-compose-material3 را با دکمهها و عناصر محتوای کاملاً استایلبندیشده Material3 اضافه کردیم. این ماژولها به شما امکان میدهند تنها در چند مرحله یک رابط کاربری رسانهای بسازید، در حالی که تمام انعطافپذیری لازم برای سفارشیسازی سبک را فراهم میکنند. اگر ترجیح میدهید سبک رابط کاربری خودتان را بسازید، میتوانید از بلوکهای سازندهای استفاده کنید که تمام منطق بهروزرسانی و اتصال را انجام میدهند، بنابراین فقط باید روی طراحی عنصر رابط کاربری تمرکز کنید. لطفاً صفحات راهنمای گسترده ما را برای ماژولهای رابط کاربری Compose بررسی کنید.
ما همچنین هنوز روی اجزای 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 ) و پخش از راه دور Cast را مدیریت کند.
وقتی 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گزارش میدهد. - قفل بیدارباش پیشفرض - مدیریت قفل بیدارباش قبلاً اختیاری بود، که منجر به موارد نادری میشد که در آنها پیشرفت پخش هنگام اجرا در پسزمینه با تأخیر زیادی مواجه میشد. اکنون این ویژگی غیرفعال است، بنابراین لازم نیست نگران آن باشید و همچنین میتوانید تمام مدیریت قفل بیدارباش دستی را در هنگام پخش حذف کنید.
- تنظیم سادهشده برای منطق دکمه 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 یک جزء جدید در APIهای ویرایش Media3 است که برای پیشنمایش بلادرنگ ویرایشهای رسانهای طراحی شده است. CompositionPlayer که بر اساس رابط کاربری آشنای Media3 Player ساخته شده است، به کاربران این امکان را میدهد که قبل از شروع فرآیند خروجی، تغییرات خود را در عمل مشاهده کنند. این نرمافزار از همان شیء Composition که برای خروجی گرفتن به Transformer ارسال میکنید، استفاده میکند و با یکپارچهسازی مدل داده برای پیشنمایش و خروجی گرفتن، گردش کار ویرایش را سادهتر میکند.
ما شما را تشویق میکنیم که استفاده از CompositionPlayer را شروع کنید و بازخورد خود را به اشتراک بگذارید، و برای جزئیات بیشتر، منتظر پستها و بهروزرسانیهای بعدی مستندات باشید.
InAppMuxer به عنوان یک muxer پیشفرض در Transformer
ترنسفورمر اکنون از InAppMp4Muxer به عنوان muxer پیشفرض برای نوشتن فایلهای کانتینر رسانه استفاده میکند. InAppMp4Muxer به صورت داخلی به ماژول Media3 Muxer وابسته است و رفتار ثابتی را در تمام نسخههای API ارائه میدهد.
توجه داشته باشید که اگرچه Transformer دیگر به طور پیشفرض از MediaMuxer پلتفرم اندروید استفاده نمیکند، اما در صورت نیاز، همچنان میتوانید FrameworkMuxer.Factory از طریق setMuxerFactory ارائه دهید.
API های جدید تنظیم سرعت
نسخه ۱.۹.۰، APIهای تنظیم سرعت برای ویرایش رسانه را سادهتر میکند. ما متدهای جدیدی را مستقیماً در 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
در نسخه ۱.۹.۰، 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 با ما تماس بگیرید. مشتاقانه منتظر شنیدن نظرات شما هستیم!
ادامه مطلب

اخبار محصول
گردش کار و نیازهای هوش مصنوعی هر توسعهدهنده منحصر به فرد است و مهم است که بتوانید انتخاب کنید هوش مصنوعی چگونه به توسعه شما کمک میکند. در ژانویه، ما قابلیت انتخاب هر مدل هوش مصنوعی محلی یا از راه دور را برای تقویت عملکرد هوش مصنوعی در اندروید استودیو معرفی کردیم.
Matthew Warner • ۲ دقیقه مطالعه

اخبار محصول
اندروید استودیو پاندا ۳ اکنون پایدار و آماده استفاده در محیط تولید است. این نسخه به شما کنترل و سفارشیسازی بیشتری بر روی گردشهای کاری مبتنی بر هوش مصنوعی میدهد و ساخت برنامههای اندروید با کیفیت بالا را آسانتر از همیشه میکند.
Matt Dyor • ۳ دقیقه مطالعه

اخبار محصول
در گوگل، ما متعهد هستیم که توانمندترین مدلهای هوش مصنوعی را مستقیماً به دستگاههای اندرویدی موجود در جیب شما بیاوریم. امروز، مفتخریم که انتشار جدیدترین مدل متنباز پیشرفته خود را اعلام کنیم: Gemma 4.
Caren Chang , David Chou • ۳ دقیقه مطالعه
در جریان باشید
جدیدترین بینشهای توسعه اندروید را به صورت هفتگی در صندوق ورودی خود دریافت کنید.





