اخبار محصول

مدیا۳ ۱.۹.۰ - چه چیزهایی جدید است؟

مطالعه ۶ دقیقه‌ای
Kristina Simakova
مدیر مهندسی

مدیا۳ نسخه ۱.۹.۰ منتشر شد! علاوه بر رفع اشکالات معمول و بهبود عملکرد، آخرین نسخه شامل چهار ماژول جدید یا تا حد زیادی بازنویسی شده نیز هست:

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

تصویر.png

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

}
تصویر.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 گزارش می‌دهد.
  • قفل بیدارباش پیش‌فرض - مدیریت قفل بیدارباش قبلاً اختیاری بود، که منجر به موارد نادری می‌شد که در آن‌ها پیشرفت پخش هنگام اجرا در پس‌زمینه با تأخیر زیادی مواجه می‌شد. اکنون این ویژگی غیرفعال است، بنابراین لازم نیست نگران آن باشید و همچنین می‌توانید تمام مدیریت قفل بیدارباش دستی را در هنگام پخش حذف کنید.
  • تنظیم ساده‌شده برای منطق دکمه 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 یک جزء جدید در 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 با ما تماس بگیرید. مشتاقانه منتظر شنیدن نظرات شما هستیم!

    نوشته شده توسط:

    ادامه مطلب