اخبار محصول

‫Media3 1.9.0 - ویژگی‌های جدید

‫۶ دقیقه خواندن
دیدن نمایه Kristina Simakova
Kristina Simakova  مدیر مهندسی

‫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)
    }
  }
}

 

image.png

میانای کاربر پخش‌کننده 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()

}
image.png

یکپارچه‌سازی جدید CastPlayer در برنامه نمایشی جلسه Media3

بازپخش AV1 سازگار با افزونه بازنویسی‌شده براساس dav1d

نسخه 1.9.0 شامل یک واحد افزونه AV1 کاملاً بازنویسی‌شده براساس کتابخانه محبوب dav1d است. 

مانند همه واحدهای رمزگشای افزونه، لطفاً توجه داشته باشید که برای دسته‌بندی صحیح کد بومی مربوطه، نیاز به ساختن از منبع  دارد. ادغام یک کدبند، سازگاری و پشتیبانی از قالب را در همه دستگاه‌ها فراهم می‌کند، اما ازآنجایی‌که کدبندی را در فرایند شما اجرا می‌کند، برای محتوایی که می‌توانید به آن اعتماد کنید مناسب‌تر است. 

ادغام مدیریت حافظه و حافظه نهان در PreloadManager

ما PreloadManager خود را نیز بهبود بخشیده‌ایم. این API قبلاً به شما امکان می‌داد رسانه‌ها را خارج از بازپخش در حافظه پیش‌بارگذاری کنید و سپس درصورت نیاز، آن‌ها را به‌طور یکپارچه به پخش‌کننده تحویل دهید. اگرچه عملکرد بسیار خوبی داشت، اما همچنان باید مراقب می‌بودید که با پیش‌بار کردن تصادفی بیش‌ازحد، از محدودیت‌های حافظه فراتر نروید. بنابراین با Media3 1.9.0، دو ویژگی اضافه کردیم که این کار را بسیار آسان‌تر و پایدارتر می‌کند:

  1. پشتیبانی از حافظه نهان – هنگام تعریف میزان پیش‌بارگذاری، اکنون می‌توانید PreloadStatus.specifiedRangeCached(0, 5000) را به‌عنوان وضعیت هدف برای موارد پیش‌بارگذاری‌شده انتخاب کنید. با این کار، محدوده مشخص‌شده به‌جای بار کردن داده‌ها در حافظه، به حافظه نهان روی دیسک اضافه می‌شود. با این کار، می‌توانید محدوده بسیار بزرگ‌تری از موارد را برای پیش‌بارگذاری ارائه دهید، زیرا مواردی که دورتر از مورد فعلی هستند دیگر نیازی به اشغال حافظه ندارند. توجه داشته باشید که این کار مستلزم تنظیم Cache در DefaultPreloadManager.Builder است.
  2. مدیریت خودکار حافظه – همچنین رابط 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()
))
image.png

اولویت‌های دکمه رسانه با دکمه جلو بردن سریع

‫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 با ما تماس بگیرید. مشتاقانه منتظر شنیدن از شما هستیم!

ادامه خواندن