اخبار محصول

Media3 1.9.0 - تازه‌ها

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

Media3 1.9.0 منتشر شد! علاوه‌بر رفع اشکال‌های معمول و بهبود عملکرد، جدیدترین نسخه پخش همچنین حاوی چهار ماژول جدید یا تا حد زیادی بازنویسی‌شده است:

  • media3-inspector - استخراج فراداده و قاب‌های خارج از بازپخش
  • media3-ui-compose-material3 - Build a basic Material3 Compose Media UI in just a few steps
  • media3-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)
    }
  }
}

 

تصویر.png

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

}
تصویر.png

ادغام CastPlayer جدید در برنامه نمایشی جلسه Media3

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

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

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

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

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

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

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

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

نویسنده:
ادامه خواندن