Media3

Поддержка библиотек для работы с медиаконтентом.
Последнее обновление Основная версия Релиз-кандидат Бета-версия Альфа-версия
11 ноября 2026 г. 1.11.1 - 1.12.0-beta01 -

Объявление зависимостей

Чтобы добавить зависимость от Media3, необходимо добавить в проект репозиторий Google Maven. Подробную информацию можно найти в статье Репозиторий Google Maven.

Добавьте зависимости для нужных артефактов в файл build.gradle приложения или модуля:

Яркий

dependencies {
    def media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation "androidx.media3:media3-exoplayer:$media3_version"

    // For DASH playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // For HLS playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // For SmoothStreaming playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
    // For RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation "androidx.media3:media3-exoplayer-midi:$media3_version"
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-ima:$media3_version"

    // For loading data using the Cronet network stack
    implementation "androidx.media3:media3-datasource-cronet:$media3_version"
    // For loading data using the OkHttp network stack
    implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
    // For loading data using librtmp
    implementation "androidx.media3:media3-datasource-rtmp:$media3_version"

    // For building media playback UIs using Jetpack Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs using Jetpack Compose with Material Design 3
    implementation "androidx.media3:media3-ui-compose-material3:$media3_version"
    // For building media playback UIs using Views
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

    // For exposing and controlling media sessions
    implementation "androidx.media3:media3-session:$media3_version"

    // For extracting data from media containers
    implementation "androidx.media3:media3-extractor:$media3_version"

    // For inspecting media files
    implementation "androidx.media3:media3-inspector:$media3_version"
    // For extracting and processing video frames
    implementation "androidx.media3:media3-inspector-frame:$media3_version"

    // For integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"
    // For applying Lottie effects on video frames
    implementation "androidx.media3:media3-effect-lottie:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation("androidx.media3:media3-exoplayer:$media3_version")

    // For DASH playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-dash:$media3_version")
    // For HLS playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-hls:$media3_version")
    // For SmoothStreaming playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version")
    // For RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version")
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation("androidx.media3:media3-exoplayer-midi:$media3_version")
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-ima:$media3_version")

    // For loading data using the Cronet network stack
    implementation("androidx.media3:media3-datasource-cronet:$media3_version")
    // For loading data using the OkHttp network stack
    implementation("androidx.media3:media3-datasource-okhttp:$media3_version")
    // For loading data using librtmp
    implementation("androidx.media3:media3-datasource-rtmp:$media3_version")

    // For building media playback UIs using Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs using Views
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs using Jetpack Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

    // For exposing and controlling media sessions
    implementation("androidx.media3:media3-session:$media3_version")

    // For extracting data from media containers
    implementation("androidx.media3:media3-extractor:$media3_version")

    // For inspecting media files
    implementation("androidx.media3:media3-inspector:$media3_version")
    // For extracting and processing video frames
    implementation("androidx.media3:media3-inspector-frame:$media3_version")

    // For integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")
    // For applying Lottie effects on video frames
    implementation("androidx.media3:media3-effect-lottie:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

Подробнее о добавлении зависимостей сборки…

Отзыв

Ваши отзывы помогают нам улучшать Jetpack. В системе отслеживания ошибок Media3 можно найти ответы на вопросы, известные проблемы и запросы на добавление функций, а также сообщить о новых проблемах.

Версия 1.12.0

Версия 1.12.0-beta01

11 ноября 2026 г.

Версия 1.12.0-beta01 содержит следующие коммиты.

  • Общая библиотека:
    • Уменьшите C.DEFAULT_BUFFER_SEGMENT_SIZE с 65536 до 65520, чтобы каждое выделение буфера (включая заголовок объекта byte[]) помещалось на целых страницах ОС в пространстве больших объектов ART. Это позволит сократить использование памяти буфера выборки примерно на 6 % на устройствах со страницами размером 4 КиБ и примерно на 20 % на устройствах со страницами размером 16 КиБ.
    • Замените androidx.media3.common.util.NullableType на JSpecify org.jspecify.annotations.Nullable.
    • Удалите androidx.media3.common.util.UnknownNull и используйте аннотации JSpecify. Подклассы Kotlin RunnableFutureTask с типом результата, допускающим значение NULL (например, Void?), должны указывать аргумент типа, допускающий значение NULL (например, RunnableFutureTask<Void?, Exception>).
    • Добавьте AdViewProvider.getAdVideoView(), чтобы предоставить контейнер видео View, размер которого можно изменить во время воспроизведения объявления.
    • Строка кодека RFC 6381 mlpa сопоставляется с MimeTypes.AUDIO_TRUEHD в MimeTypes.getMediaMimeType. Это позволяет устранить проблему с отсутствием мультиплексированных аудиодорожек Dolby TrueHD при подготовке HLS без фрагментов (#3485).
    • Исправьте AdPlaybackState.withAdDurationsUs, чтобы скопировать переданный массив, и AdPlaybackState.fromAdPlaybackState, чтобы скопировать все поля массива групп объявлений. Это позволит предотвратить изменение экземпляра через сохраненные или общие массивы.
    • Исправлена ошибка IllegalStateException ("Доступ к проигрывателю осуществляется из неправильного потока"), которая возникала, когда Player.listen или Player.listenTo отменялись из потока, отличного от потока приложения проигрывателя (например, во время завершения теста интерфейса Compose) (#3005).
  • ExoPlayer:
    • Исправлена ошибка, из-за которой средство визуализации, включенное заранее для предстоящего медиапериода, могло начать визуализацию до перехода воспроизведения к этому периоду.
    • Подклассы Kotlin CompositeMediaSource, которые используют идентификаторы дочерних источников, допускающие значение NULL (например, Void?), должны указывать аргумент типа, допускающий значение NULL (например, CompositeMediaSource<Void?>).
    • Убедитесь, что в AdsMediaSource значение AdPlaybackState.removedAdGroupCount не уменьшается при обновлении AdPlaybackState.
    • Исправлена ошибка, из-за которой при переходе между медиапериодами, использующими разные средства визуализации, входящее средство визуализации могло быть преждевременно включено до того, как исходящее средство визуализации завершило визуализацию (например, при включенном Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION возникала ошибка IllegalStateException ("Включено несколько часов мультимедиа средства визуализации")).
    • Исправлена ошибка, из-за которой при переходе к объявлению с пользовательской скоростью воспроизведения мог задерживаться переход всех средств визуализации к периоду объявления, если включен параметр Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION.
    • Устранена проблема с предварительным прогревом средств визуализации при переходах между периодами воспроизведения медиаконтента и повторном выборе треков.
    • Добавьте MediaPeriod.supportsStreamPrerollFlags() (по умолчанию false), чтобы специальные реализации MediaPeriod могли сообщать о начальных разрывах с помощью SampleStream.getFlags(), возвращаясь к MediaPeriod.readDiscontinuity(), если это не поддерживается и включено Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION.
    • Исправлена ошибка, из-за которой при пропуске объявления, за которым следовало другое объявление из той же группы, регистрировалось событие DISCONTINUITY_REASON_AUTO_TRANSITION вместо DISCONTINUITY_REASON_SKIP или не регистрировалось ничего, если в AdsMediaSource использовалась отложенная подготовка источника контента.
  • Трансформер:
    • Добавлен CodecDB (androidx.media3.transformer.codecdb), который рекомендует конфигурации видеокодировщика (кодек, настройки кодировщика и битрейт) для текущего устройства на основе измеренных данных о качестве кодировщика.
  • Экстракторы:
    • ADTS: исправлена ошибка AdtsExtractor, из-за которой аудиоформат определялся по ложному слову синхронизации в полезной нагрузке частичного первого кадра. Это могло приводить к сбою или остановке воспроизведения прямых трансляций AAC, к которым пользователь присоединялся в середине кадра (#3464).
    • Исправлена ошибка ArrayIndexOutOfBoundsException в FragmentedMp4Extractor, возникавшая, когда фрагмент содержал поле trun без образцов (#3471).
    • ADTS: добавьте FLAG_DISABLE_ID3_METADATA в AdtsExtractor, чтобы данные ID3 в потоке не выводились как дорожка application/id3.
    • MP4. Исправлено непрерывное воспроизведение треков AAC, мультиплексор которых (например, FFmpeg) укорачивает последнюю запись stts, чтобы исключить заполнение кодировщика. Из-за этого заполнение определялось как 0 из списка редактирования elst, а конец последнего кадра воспроизводился (#3489).
    • Исправлено выделение больших буферов предварительного просмотра и OutOfMemoryError при сканировании поврежденных или немедийных файлов, начинающихся с ID3 (#3502).
  • Инспектор:
    • Исправлена ошибка, из-за которой отмена будущего, возвращенного MetadataRetriever.retrieveDurationUs(), не позволяла close() освободить базовый MediaSource (#3468).
    • Исправьте MediaExtractorCompat, чтобы возвращалось целое число MediaFormat.KEY_FRAME_RATE, соответствующее платформе MediaExtractor.
  • Аудио:
    • Исправлена ошибка, из-за которой буферизованная пропущенная тишина включалась в AudioSink.getCurrentPositionUs(boolean) и передавалась с помощью AudioSink.Listener.onSilenceSkipped() до того, как воспроизведение достигало пропущенной области (#3472).
    • Укажите происхождение кодека с помощью AudioTrack.Builder.setCodecProvenance в API 37 и более поздних версий при воспроизведении пространственного многоканального PCM-аудио, декодированного из сжатого формата.
    • Исправлена ошибка, из-за которой повторные попытки инициализации AudioTrack пропускались, если одна секунда аудио была не меньше исходного размера буфера. Это приводило к сбою сквозной передачи DTS-HD на устройствах с ограниченной памятью для аудио (#3487).
  • Видео:
    • Разрешен возврат к декодеру H.265/HEVC для обратно совместимых потоков Dolby Vision Profile 7. Запрещен возврат к декодеру AV1 для потоков Profile 10, базовый слой которых сигнализирует о полном диапазоне с неуказанными характеристиками передачи (#3486).
    • Исправлен выбор декодера в MediaCodecUtil, чтобы избежать выбора основных декодеров, которые функционально не поддерживают профиль формата (например, декодер Dolby Vision для другого профиля), когда ни один декодер полностью не поддерживает формат (#3486).
  • Текст:
    • Уменьшено использование памяти в DvbParser за счет рендеринга областей субтитров непосредственно в битовые карты размером с область вместо сохранения полноэкранной временной битовой карты.
  • Эффект:
    • Исправлена ошибка NullPointerException в DefaultVideoFrameProcessor при очистке (например, при поиске или перемотке в CompositionPlayer) (#3470).
    • Исправлена ошибка, из-за которой DefaultGlObjectsProvider.release выдавал GlException, когда поставщик повторно использовался после выпуска (#2016).
  • Мультиплексоры:
    • Проверяйте дорожку Format при ее добавлении в Mp4Muxer или FragmentedMp4Muxer, а не позже, когда записываются образцы или закрывается мультиплексор.
    • Сделайте так, чтобы повторные вызовы Muxer.close() не выполняли никаких операций во всех реализациях библиотеки Muxer, и считайте мультиплексор закрытым, даже если close() выдает ошибку. Вызов любого другого метода после close() теперь приводит к ошибке IllegalStateException.
  • Расширение IMA:
    • Добавлена поддержка интерфейса ResizablePlayer IMA SDK, позволяющего интерактивным объявлениям изменять размер и положение видеопроигрывателя в контейнере объявлений. Также добавлен метод ImaAdsLoader.requestAds(DataSpec, Object, AdViewProvider) (метод ImaAdsLoader.requestAds(DataSpec, Object, ViewGroup) больше не поддерживается).
  • Сеанс:
    • Стабилизация API настроек кнопок мультимедиа.
    • Снижено использование памяти за счет того, что сжатые данные обложек больше не хранятся в CacheBitmapLoader.
    • Избегайте избыточных вызовов MediaSession.setQueue(null) при обновлении временной шкалы, когда очередь сеансов платформы уже null (например, когда Player.COMMAND_GET_TIMELINE недоступен).
    • Исправлена ошибка, из-за которой MediaSessionService не позволял реализации сервиса восстанавливаться должным образом, не пытаясь создать новый сеанс (#3490).
    • Сообщать Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE вместо Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, когда устаревшее обновление метаданных MediaSessionCompat изменяет метаданные или продолжительность активного элемента очереди, не меняя саму очередь.
    • Исправлена ошибка, из-thought которой не показывались обложки для устаревших сеансов, в которых задан параметр null METADATA_KEY_DISPLAY_ICON (или URI обложки) вместе с действительным параметром METADATA_KEY_ALBUM_ART. Теперь при преобразовании устаревших метаданных пустые значения обложек пропускаются.
  • Интерфейс:
    • Добавьте слот subtitles Composable в ContentFrame и Player с поддержкой по умолчанию в media3-ui-compose-material3 для отрисовки битовой карты и горизонтальных текстовых субтитров.
    • Добавлен параметр SubtitleView.setTextDirectionHeuristic, позволяющий настраивать эвристику направления текста, которая используется для переноса двунаправленного текста субтитров (#3454).
    • Анимируйте все слоты для элементов управления в Player в media3-ui-compose-material3, включая пользовательские, и удалите параметр visible из PlayerDefaults.TopControls, CenterControls и BottomControls. Это критическое изменение нестабильного API.
    • Чтобы обеспечить поддержку AdViewProvider.getAdVideoView() в PlayerView, заключите exo_content_frame в exo_content_frame_container.
    • Сокращено использование памяти в SubtitleView за счет освобождения кэшированных растровых изображений субтитров и текстовых макетов при очистке подсказок. Исправлена ошибка, из-за которой устаревший текст субтитров мог оставаться видимым, если подсказка была недостаточно широкой для макета.
  • Расширение HLS:
    • Исправлены ошибки, из-за которых при перезагрузке неудачного или отмененного фрагмента медиаконтента HLS могли сохраняться частично буферизованные образцы без отбрасывания или склейки, а также могла сбрасываться позиция загрузки до устаревшей позиции поиска (#3362).
    • Исправлена ошибка IllegalStateException, возникавшая при переходе к началу буферизованного сегмента после переключения адаптивного трека.
    • Устранены некоторые проблемы с воспроизведением при переключении путей с помощью HLS Content Steering (#3465).
  • Расширение DASH:
    • Исправлена ошибка, из-за которой субтитры CEA-608 дублировались или искажались, если в потоке было несколько встроенных дорожек субтитров (#887).
  • Расширение Cast:
    • Исправлена ошибка, из-за которой ресиверы Android TV отклоняли запросы на загрузку RemoteCastPlayer (#3462).
    • Обновите зависимость com.google.android.gms:play-services-cast-framework до версии 23.0.0.
    • Добавьте CastParams.Builder.setSystemOutputSwitcherEnabled(boolean), чтобы настроить показ устройств Cast в системном переключателе вывода без необходимости объявлять MediaTransferReceiver в AndroidManifest.xml, и включите системный переключатель вывода по умолчанию для приложений, предназначенных для API 37 и более поздних версий, на устройствах с API 37 и более поздних версий.
    • Поддержка предопределенных полей Cast MediaMetadata в DefaultMediaItemConverter путем сопоставления полей без выделенного свойства MediaItem.mediaMetadata с MediaItem.mediaMetadata.extras и обратно, а также сохранение пользовательских дополнений в MediaInfo.customData.
    • Прекратите генерировать исключения в DefaultMediaItemConverter, когда отсутствует URI воспроизведения или не удается выполнить преобразование, сохраняя идентификатор мультимедийного объекта и метаданные на временной шкале CastPlayer для элементов очереди Cast без URI воспроизведения.
    • Добавлен метод SessionAvailabilityListener.onCastSessionAvailable(boolean), который позволяет определить, был ли сеанс Cast запущен с помощью Intent to Join. Также теперь при подключении к сеансу Cast с помощью Intent to Join в CastPlayer сохраняется состояние удаленного воспроизведения, а не перезаписывается состоянием локального проигрывателя.
    • Заполняйте MediaInfo и длительность временной шкалы из MediaMetadata.durationMs для элементов, не относящихся к прямым трансляциям, в DefaultMediaItemConverter и RemoteCastPlayer, а также сохраняйте длительность, определенную получателем, и статус прямой трансляции при поиске в очереди.
  • Демонстрационное приложение:
    • Разрешить изменять порядок элементов плейлиста перетаскиванием в демонстрационном приложении.
  • Удалите устаревшие символы:
    • Удалить androidx.media3.transformer.TextureAssetLoader Используйте вместо него androidx.media3.transformer.RawAssetLoader.
    • Удалите общедоступные конструкторы DefaultDecoderFactory. Используйте вместо него DefaultDecoderFactory.Builder.
    • Удалить DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS Используйте вместо него DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_EXCLUSION_MS.
    • Удалить DefaultVideoFrameProcessor.Factory.Builder.setRequireRegisteringAllInputFrames(boolean). Используйте вместо него VideoFrameProcessor.INPUT_TYPE_SURFACE_AUTOMATIC_FRAME_REGISTRATION.
    • Удалите EditedMediaItemSequence.Builder.experimentalSetForceAudioTrack(boolean) и EditedMediaItemSequence.Builder.experimentalSetForceVideoTrack(boolean). Используйте вместо него EditedMediaItemSequence.Builder(Set).
    • Удалить EditedMediaItemSequence.forceAudioTrack Используйте вместо него trackTypes.contains(C.TRACK_TYPE_AUDIO).
    • Удалить EditedMediaItemSequence.forceVideoTrack Используйте вместо него trackTypes.contains(C.TRACK_TYPE_VIDEO).
    • Удалите ExportResult.durationMs и ExportResult.Builder.setDurationMs. Используйте вместо него правила ExportResult.approximateDurationMs и ExportResult.Builder.setApproximateDurationMs.
    • Удалить SilenceSkippingAudioProcessor.DEFAULT_PADDING_SILENCE_US Чтобы задать поведение при тишине, используйте silenceRetentionRatio.
    • Удалить Timeline.getPeriodPosition(Window, Period, int, long, long) Используйте вместо него Timeline.getPeriodPositionUs(Window, Period, int, long, long).

Версия 1.12.0-alpha02

26 октября 2026 г.

Версия 1.12.0-alpha02 содержит следующие коммиты.

  • Влияние на сервисы Google Play:
    • Добавлен новый модуль media3-effect-play-services, который предоставляет медиаэффекты сервисов Google Play, включая EnhancementSessionDecorator для улучшения видео и StudioSoundAudioProcessor для разделения источников аудио.

Версия 1.12.0-alpha01

21 октября 2026 г.

Версия 1.12.0-alpha01 содержит следующие коммиты.

  • Общая библиотека:
    • Добавьте C.COLOR_SPACE_DISPLAY_P3 и поддержку цветового пространства Display P3 в сопоставления цветов ISO MediaFormatUtil и ColorInfo.
    • Добавлен центральный реестр Flags для управления экспериментальными флагами функций и поэтапным внедрением (Flags.setCanaryModeEnabled). Многие существующие методы @ExperimentalApi перенесены для использования нового API флагов.
    • Добавьте MediaMetadata.playlistId, MediaMetadata.Builder.setPlaylistId(String), MediaMetadata.categories и MediaMetadata.Builder.setCategories(List<String>).
    • Замените androidx.media3.common.util.NonNullApi на JSpecify org.jspecify.annotations.NullMarked.
  • ExoPlayer:
    • Исправлена ошибка, из-за которой воспроизведение DASH с несколькими периодами зависало, если не удавалось загрузить первый фрагмент следующего периода (#3396).
    • Сообщать об ошибке wasCanceled = true в AnalyticsListener.onLoadError и MediaSourceEventListener.onLoadError, когда исчерпаны попытки загрузки.
    • Добавлена поддержка регистрации нескольких экземпляров VideoFrameMetadataListener с помощью ExoPlayer.addVideoFrameMetadataListener и ExoPlayer.removeVideoFrameMetadataListener. ExoPlayer.setVideoFrameMetadataListener и ExoPlayer.clearVideoFrameMetadataListener больше не поддерживаются.
    • Добавьте поддержку рекламы в контенте с несколькими периодами (например, DASH), разделив и сместив AdPlaybackState для каждого периода.
    • Исправлено состояние гонки в PreCacheHelper, когда отмена текущего запроса на подготовку все равно могла запустить скачивание в фоновом режиме.
    • Ограничьте setLoadOnlySelectedTracks(true) в ProgressiveMediaSource и DefaultMediaSourceFactory, чтобы отфильтровать только невыбранные видео- и аудиодорожки. Аудио- и текстовые дорожки загружаются всегда, чтобы можно было переключаться между ними без повторной буферизации.
    • Включить setLoadOnlySelectedTracks(true) по умолчанию на ProgressiveMediaSource и DefaultMediaSourceFactory. Это экономит память и позволяет точнее рассчитывать выделение буфера DefaultLoadControl, когда выбраны не все треки. Обратите внимание, что это может привести к дополнительной буферизации, если невыбранные видео- или графические дорожки будут включены в середине воспроизведения.
    • Исправлена ошибка, из-за которой Player.getCurrentPosition() мог возвращать устаревшие значения (обновляясь всего несколько раз в секунду), когда включено динамическое планирование (#3286).
    • Исправлена ошибка, из-за которой неожиданное уменьшение или сброс позиции головки воспроизведения AudioTrack могли быть ошибочно расценены как переполнение целого числа, что приводило к остановке воспроизведения во время буферизации (#3407).
    • Удалить экспериментальную функцию DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean).
    • Устранена проблема, из-за которой при возврате к контенту, обрезанному в конце, после показа межстраничных или обычных объявлений происходили сбои и ненужные повторные включения средства визуализации (#3371).
    • Исправлена ошибка, из-за которой ошибка рендерера в следующем элементе плейлиста могла преждевременно прервать текущее воспроизведение, если включен параметр Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION.
    • Исправлена ошибка NullPointerException, которая могла возникать, если ExoPlayer переводил средства визуализации в неподготовленный период воспроизведения медиаконтента, когда включен параметр Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION.
    • Исправлена ошибка, из-за которой кадры видео могли неожиданно пропускаться или удаляться во время динамического планирования, когда включен параметр Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS.
    • Исправлена ошибка ArrayIndexOutOfBoundsException в слушателях аналитики при остановке воспроизведения во время рекламы в трансляции (#3423).
    • Исправлена ошибка, из-за которой PreloadMediaSource мог неожиданно опубликовать событие предзагрузки, когда preload() не вызывается (#3408).
    • Исправлена ошибка, из-за которой Format.subsampleOffsetUs игнорировался для дорожек метаданных, что приводило к неправильным временным меткам воспроизведения в декодированных командах вставки SCTE-35 (#3413).
    • Устранена утечка памяти в PreloadMediaSource и DefaultPreloadManager, когда preload() вызывается несколько раз для одного источника (#3445).
    • Исправлена ошибка NullPointerException при освобождении AdsMediaSource, когда ожидается обновление временной шкалы контента (#3442).
    • Исправлена ошибка, из-за которой воспроизведение прогрессивных медиафайлов могло переходить на неправильную позицию, если загрузка после перемотки (или при начале воспроизведения с ненулевой позиции) завершалась сбоем и повторялась (#3440).
    • Добавлено временное решение для декодера H.264 на Xiaomi TV Stick 4K (MiTV-AYFR0), который зависает при плавном изменении разрешения (#3457).
    • Исправлена ошибка NullPointerException в SteeringManifestTracker, возникавшая, когда трекер останавливался до выполнения обратного вызова об успешной загрузке или ошибке (#3443).
    • Добавлена поддержка воспроизведения синхронизированных метаданных HAGC (ST 2094-50) из дорожек метаданных mebx в файлах MP4.
    • Исправлена ошибка, из-за которой могли пропускаться медиапериоды в плейлисте, подготовка которых занимала много времени.
  • CompositionPlayer:
    • Поддержка настройки частоты кадров при агрегировании кадров видео с помощью Composition.Builder.setVideoFrameAggregationParameters для рабочих процессов воспроизведения.
    • Исправьте пропуски кадров в композициях с несколькими последовательностями, вызванные квантованием временных меток или несоответствием округления, выбрав кадр с ближайшей временной меткой во время агрегирования кадров. Эта функция доступна только в API 29, поскольку для нее требуется удерживать один дополнительный кадр в полете на видеопоследовательность.
  • Трансформер:
    • Поддержка настройки частоты кадров для агрегирования кадров видео с помощью Composition.Builder.setVideoFrameAggregationParameters для рабочих процессов экспорта.
    • Исправьте пропуски кадров в композициях с несколькими последовательностями, вызванные квантованием временных меток или несоответствием округления, выбрав кадр с ближайшей временной меткой во время агрегирования кадров. Эта функция доступна только в API 29, поскольку для нее требуется удерживать один дополнительный кадр в полете на видеопоследовательность.
    • Учитывать Transformer#setAudioMimeType(AUDIO_RAW), когда используются AudioProcessors. До этого исправления запрос MimeTypes.AUDIO_RAW и применение AudioProcessor приводили к сжатию выходных данных.
  • Выбор дорожки:
    • Исправлена ошибка, из-за которой на некоторых устройствах дорожка SDR ошибочно предпочиталась поддерживаемой дорожке Dolby Vision (#3135).
  • Экстракторы:
    • Mp4Extractor: исправлена ошибка, из-за которой при синтаксическом анализе поля dOps для Opus в MP4 значения PreSkip, InputSampleRate и OutputGain не преобразовывались из формата с прямым порядком байтов в формат с обратным порядком байтов, в результате чего при отсутствии списка изменений первые ~299 мс аудио удалялись (#3431).
    • Удалите Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES, Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES и FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, поскольку синтаксический анализ зависимости выборок в группе изображений для H.264 и H.265 включен по умолчанию.
    • Mp4Extractor: исправлен синтаксический анализ географических метаданных из блоков xyz, содержащих координаты высоты, для заполнения Mp4LocationData.
    • Добавлен метод ExtractorUtil.getFramesPerEncodedSample для расчета количества аудиокадров на выборку для закодированных аудиоформатов (#3367).
    • Добавьте FLAG_READ_XMP_METADATA в Mp4Extractor, чтобы извлечь метаданные XMP из полей UUID верхнего уровня.
    • Исправлена ошибка, из-за которой повреждались аудиоданные AC-3, DTS и LPCM при воспроизведении контента MPEG-PS в стиле DVD. Теперь заголовок подпотока private_stream_1 удаляется из каждого пакета PES в PsExtractor до того, как полезная нагрузка передается в средство чтения аудио (#3327).
    • Исправлена ошибка в FragmentedMp4Extractor, когда поле tfdt версии 1 кодирует отрицательное значение baseMediaDecodeTime (#3412).
    • MPEG-TS: добавлена поддержка синтаксического анализа сообщений SEI о компоновке кадров H.264 и H.265 для заполнения Format.stereoMode (#3419).
    • Добавлена обработка данных конфигурации Dolby Vision Profile 20 и отклонение неподдерживаемых профилей Dolby Vision вместо воспроизведения в стандартном формате HEVC с некорректными цветами (#3427).
    • MP3: отменена корректировка метаданных задержки и заполнения кодировщика LAME/Xing, поскольку она несовместима со многими декодерами MP3 MediaCodec (#3425).
    • Matroska: исправлена ошибка NullPointerException при синтаксическом анализе вложенных элементов ChapterAtom (#3438).
    • Ogg: исправлена ошибка, из-за которой пакет, размер которого кратен 255 байтам и который заканчивается на границе страницы, объединялся со следующим пакетом.
    • MP4: анализ дорожек с временными метаданными в блоках mebx в Mp4Extractor и FragmentedMp4Extractor. Дорожки с ключом it35 отображаются как MimeTypes.APPLICATION_ITUT_T35 (воспроизведение HAGC включено). Другие дорожки mebx игнорируются, если не задан параметр FLAG_EMIT_RAW_MEBX_DATA. В этом случае все дорожки mebx передаются как необработанные MimeTypes.APPLICATION_MEBX.
    • Ogg: добавлена поддержка извлечения конечного заполнения Opus для непрерывного воспроизведения (#2576) и исправлены временные метки образцов после перехода на страницу, которая начинается с продолженного пакета.
    • Ogg: исправлены ошибки декодирования и скачки временных меток примерно на 1 секунду в связанных потоках Ogg Opus. Для этого игнорируются пакеты заголовков комментариев и идентификаторов Opus в середине потока.
  • Инспектор:
    • Поддержка получения метаданных XMP из файлов MP4 с помощью MetadataRetriever.
    • Поддержка извлечения дорожек с метаданными, синхронизированными по времени, в формате mebx в MediaExtractorCompat как MimeTypes.APPLICATION_MEBX.
  • Фрейм инспектора:
    • Исправлено отсечение цветов широкой гаммы BT.2020 в базовом изображении SDR при извлечении кадров Ultra HDR с помощью FrameExtractor. Цвета, выходящие за пределы гаммы, теперь мягко сжимаются в гамму sRGB, а не зажимаются.
  • Аудио:
    • Добавлено временное решение для устройств, которые вызывают android.media.AudioDeviceCallback в неправильном потоке (#3386).
    • Исправлена ошибка, из-за которой воспроизведение могло зависать после перехода между треками при использовании сжатой разгрузки.
    • Устранена проблема, из-за которой на устройствах Amazon Fire TV Stick аудио AC-3 могло зависать при переходах между периодами (#3448).
    • Добавлена поддержка обрезки заполнения кодировщика в конце потока для непрерывного воспроизведения Opus в Ogg и WebM/Matroska (#2576).
    • Исправлена ошибка, из-за которой при динамической разгрузке задержка и заполнение применялись к воспроизводимому, а не к следующему треку.
    • Добавлена обрезка конечного заполнения кодировщика в отдельных потоках и последнем потоке в плейлисте, а также непрерывные переходы в середине плейлиста (#2576).
    • Избегайте ненужных копий аудио буфера в TrimmingAudioProcessor после того, как обрезка задержки кодировщика в начале потока завершена и не требуется обрезка заполнения в конце потока.
  • Видео:
    • Исправлена ошибка, из-за которой кадры видео с одинаковыми временными метками, которые были показаны с задержкой, помечались как пропущенные, а не как отброшенные.
  • Текст:
    • Добавьте MediaItem.SubtitleConfiguration.timeOffsetUs, чтобы сдвинуть временные метки субтитров, загруженных из неизвестного источника, относительно медиаконтента. Смещение можно изменить во время воспроизведения с помощью Player.replaceMediaItem(int, MediaItem), не прерывая воспроизведение (#1976).
    • SubRip. Добавлена поддержка внедрения CharsetDetector в DefaultSubtitleParserFactory для определения кодировки символов отдельных субтитров SubRip без маркера последовательности байтов (#2247).
  • Эффект:
    • Реализуйте SoundSeparationAudioProcessor для разделения источников звука с помощью модуля StudioSound GMSCore.
  • Мультиплексоры:
    • Исправлена запись поля dOps для Opus в Mp4Muxer и FragmentedMp4Muxer, где PreSkip, InputSampleRate и OutputGain записывались в формате с прямым порядком байтов вместо обратного (#3431).
    • Поддержка записи высоты GPS в Mp4LocationData с помощью Mp4Muxer.
    • Добавьте Muxer.Factory.create(ParcelFileDescriptor), чтобы разрешить мультиплексирование непосредственно в ParcelFileDescriptor.
    • По умолчанию в поле traf фрагментированных файлов MP4 записывается поле tfdt (Track Fragment Base Media Decode Time), чтобы предоставить временные метки декодирования медиаконтента.
    • Поддержка записи контейнеров E-AC-3 и E-AC-3 JOC (Dolby Atmos) dec3 в Mp4Muxer.
    • Добавьте поддержку формата WebM в MediaMuxerCompat.
    • Добавьте поле mfra (Movie Fragment Random Access) в конец фрагментированных файлов MP4, чтобы разрешить поиск в FragmentedMp4Extractor с помощью FLAG_READ_MFRA_FOR_SEEK_MAP.
    • Исправлен сбой в Mp4Writer и FragmentedMp4Writer при записи образца EOS перед другими образцами.
    • Исправлено несоответствие контейнера при мультиплексировании контента Dolby в файлы MP4 или фрагментированные файлы MP4 путем объявления совместимого бренда dby1 в заголовке контейнера (#3369).
    • Добавлена поддержка 32-битных аудиодорожек PCM с плавающей запятой в Mp4Muxer и FragmentedMp4Muxer (#3389).
    • Отклонять неподдерживаемые профили Dolby Vision в Mp4Muxer и FragmentedMp4Muxer при добавлении дорожек.
    • Поддержка 24- и 32-битных целочисленных аудиодорожек PCM в Mp4Muxer и FragmentedMp4Muxer.
  • Расширение IMA:
    • Передавайте события приостановки и возобновления воспроизведения в IMA SDK в ImaServerSideAdInsertionMediaSource.
  • Сеанс:
    • Добавьте MediaConstants.EXTRAS_KEY_PLAYLIST_ID, MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE, MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI и MediaConstants.EXTRAS_KEY_CATEGORIES, чтобы заполнить метаданные плейлиста и объекта из устаревших метаданных и описаний, а также MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE и MediaConstants.EXTRAS_KEY_TTL_SECONDS для предложения LibraryParams.extras.
    • Исправлен сбой SecurityException при создании или выпуске MediaSession на устройствах со строгими ограничениями PendingIntent.
    • Исправлена ошибка, из-за которой MediaSession.getControllerForCurrentRequest() возвращал null во время запросов на воспроизведение на устройствах с Android 12 (API 31 и 32), когда MediaSessionService ещё не был в активном режиме.
    • Исправлен сбой IllegalArgumentException, возникавший, когда MediaController подключался к устаревшему сеансу, который сообщал об отрицательном максимальном объеме.
    • Исправлена ошибка, из-за которой вызов MediaController.setMediaItem или setMediaItems, а затем play() для приостановленного устаревшего MediaSessionCompat мог отправлять неподдерживаемый обратный вызов onPrepareFrom* вместо onPlayFrom* или отправлять onPlay() без повторной инициализации запрошенного мультимедийного объекта.
    • Исправлена ошибка, из-за которой в устаревшей версии MediaBrowser при получении ответа на специальную команду возникала ошибка NullPointerException (#3432).
    • Исправлен сбой IllegalArgumentException при получении устаревших метаданных с повторяющимися ключами в базовом Bundle.
    • Объединение исходящих вызовов MediaControllerCompat.TransportControls, сделанных в рамках одной итерации Looper при управлении устаревшим MediaSessionCompat (например, одновременный вызов setMediaItem, prepare и play теперь отправляет один обратный вызов onPlayFrom*).
  • Интерфейс:
    • Исправлено расположение знаков препинания в субтитрах с направлением письма справа налево и сохранение диапазона span при включенном переносе двунаправленного текста (#3454, #3455).
    • Добавьте классы TrackSelectionState и TrackSelectionParametersState и соответствующие им функции remember для Composable-состояний в модуль media3-ui-compose.
    • Представьте PresentationState.videoAspectRatio и сделайте так, чтобы Modifier.resizeWithContentScale принимал aspectRatio: Float? вместо sourceSizeDp: Size?.
    • Добавьте класс CuesState и composable-функцию rememberCuesState в модуль media3-ui-compose, чтобы прослушивать текущие подсказки проигрывателя.
    • Добавьте поддержку режима прокрутки в ProgressSlider, если он основан на ExoPlayer или CompositionPlayer.
    • Добавьте поддержку showArtwork в PresentationState и используйте ее для замера времени рендеринга необязательной composable-функции artwork в ContentFrame и Player. Добавьте composable-функцию Artwork, которая будет использоваться в качестве значения по умолчанию для слота artwork.
    • Добавьте новые поля в PlayPauseButtonState (showBuffering, showRetry, showReplay) и используйте их в PlayPauseButton, чтобы показывать больше значков и индикатор буферизации.
    • Добавьте класс PlaybackState, чтобы разрешить отслеживание состояния воспроизведения, и введите BufferingIndicator как компонент, не зависящий от кнопки.
    • Устранена проблема, из-за которой в PlayerView и PlayerControlView показывались маркеры объявлений на границах периодов для плейсхолдеров видеорекламы в конце ролика в многопериодных прямых трансляциях.
    • Слоты composable-функций Player, ContentFrame, PlayerDefaults и MiniController больше не получают проигрыватель или видимость элементов управления в качестве параметров. Вместо этого используйте область вызова (например, topControls теперь @Composable BoxScope.() -> Unit). Это критическое изменение в нестабильном API.
    • Добавьте параметр alignment в ContentFrame, Player и Modifier.resizeWithContentScale, чтобы разместить масштабированный контент в контейнере и обрезать контент ContentFrame по его границам. Тогда видео, масштабированное с помощью ContentScale.Crop, больше не будет выходить за его пределы.
    • Добавьте поддержку интерфейса трансляций в ProgressSlider, ProgressStateWithTickCount и ProgressStateWithTickInterval, используя isLive и liveOffsetMs. Добавлен компонент LiveButton Composable в media3-ui-compose-material3 (#2213).
  • Расширение Ktor:
    • Исправлена ошибка, из-за которой KtorDataSource мог обрабатывать сбои подключения в середине потока как конец ввода, а не выдавать HttpDataSourceException (#3460).
  • Расширение HLS:
    • Выполните синтаксический анализ VIDEO-RANGE (PQ и HLG) в EXT-X-STREAM-INF и EXT-X-I-FRAME-STREAM-INF в Format.colorInfo (#3441).
    • Исправлена ошибка NullPointerException, возникавшая при обработке сегментов инициализации MPEG-TS EXT-X-MAP, которые содержат медиасемплы PES (#3456).
    • Исправлена регрессия, из-за которой Format.id и Format.metadata были null для открытых дорожек HLS (#3402).
    • Обрезать объявления со списком объектов до X-PLAYOUT-LIMIT и пропускать те, которые полностью выходят за пределы ограничения, а также по умолчанию устанавливать смещение возобновления контента на 0, если в межстраничном объявлении отсутствует X-RESUME-OFFSET и его продолжительность неизвестна, даже если задано X-PLAYOUT-LIMIT.
    • Исправлена ошибка, из-за которой при обработке межстраничного объявления X-ASSET-LIST перезаписывались смещения возобновления контента других межстраничных объявлений в той же группе.
  • Расширение DASH:
    • Поддержка синтаксического анализа событий вставки (urn:mpeg:dash:event:alternativeMPD:insert:2025) и замены (urn:mpeg:dash:event:alternativeMPD:replace:2025) альтернативного MPD в DashManifestParser и их представление в виде экземпляров AlternativeMpdEvent в Period.alternativeMpdEvents. Это критическое изменение для приложений, которые используют подклассы DashManifestParser: теперь DashManifestParser.buildPeriod принимает дополнительный параметр List<AlternativeMpdEvent>, а предыдущая перегрузка удалена. Приложения, переопределяющие DashManifestParser.parseEventStream(XmlPullParser), должны вместо этого переопределять DashManifestParser.parseEventStream(XmlPullParser, String), поскольку первый метод устарел и в будущем станет закрытым.
    • Добавлена обработка информации о цвете CICP (ColourPrimaries, TransferCharacteristics, MatrixCoefficients и VideoFullRangeFlag) из дескрипторов EssentialProperty и SupplementalProperty в Format.colorInfo (#3426).
    • Добавлена поддержка разделенных пробелами списков значений @id в атрибутах @value дескриптора http://dashif.org/guidelines/trickmode в режиме перемотки (#3315).
    • Поддержка синтаксического анализа <ProducerReferenceTime> в DashManifestParser, его экспорта в AdaptationSet.producerReferenceTimes и использования для заполнения Timeline.Window.presentationStartTimeMs и Timeline.Window.windowStartTimeMs для видео по запросу.
    • Добавлена поддержка DASH Content Steering (#1689).
    • Исправлена ошибка NullPointerException, которая могла возникать при синтаксическом анализе манифеста DASH с отсутствующим атрибутом в элементе <UTCTiming> (#3436).
  • Расширение RTSP:
    • Устранена ошибка, из-за которой происходил сбой IllegalStateException при обработке отложенных ответов сети после закрытия клиента RTSP.
    • Исправлена ошибка, из-за которой быстрая перемотка могла ошибочно активировать резервный механизм протокола TCP.
    • Исправлен сбой IllegalStateException, который мог возникать при обработке отложенных ответов сети после сброса состояния клиента RTSP во время повторного выбора трека, завершения сеанса или переадресации URI.
    • Исправлена ошибка, из-за которой повторный поиск до перезапуска воспроизведения мог привести к сбою IllegalStateException.
    • Исправлена ошибка, из-за которой перемотка назад во время ожидания перемотки могла привести к потере звука и зависанию воспроизведения видео.
    • Исправлена ошибка, из-за которой блоки доступа к ключевым кадрам H.264 и H.265, заканчивающиеся пакетом агрегации или пакетом, не относящимся к IDR, не помечались как ключевые кадры, в результате чего воспроизведение зависало в режиме буферизации (#3434).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Расширение Opus: исправлен сбой JNI при декодировании недопустимых данных Opus.
    • Расширение Opus: исправлена ошибка, из-за которой игнорировалось заполнение отбрасывания, когда предварительный пропуск и заполнение отбрасывания попадали в один пакет (#2576).
  • Расширение Cast:
    • Добавьте SessionAvailabilityListener.SessionUnavailableReason, чтобы указать причину недоступности сеанса, и предоставьте перегруженный метод для SessionAvailabilityListener.onCastSessionUnavailable, чтобы показать его.
    • Исправлена ошибка, из-за которой воспроизведение неожиданно возобновлялось на устройстве после остановки сеанса трансляции.
    • Регистрировать ошибку, когда операции RemoteMediaClient (например, воспроизведение, пауза, изменение скорости, режим повтора, громкость, отключение звука или выбор трека) не выполняются в RemoteCastPlayer (#3373).
    • Исправлена ошибка ArrayIndexOutOfBoundsException в RemoteCastPlayer, возникавшая, когда очередь приемника Cast изменялась или сокращалась во время ожидания операции поиска (#3372).
    • Исправлена ошибка, из-за которой в стандартном приемнике Cast на временной шкале показывались только мультимедийные объекты, находящиеся рядом с активным, а не весь плейлист (#3129).
    • Обновление хронологии и позиции воспроизведения сразу после изменения плейлиста (setMediaItems, addMediaItems, moveMediaItems, removeMediaItems) или перемотки в RemoteCastPlayer, а также постановка в очередь последовательных операций с плейлистом, чтобы они выполнялись в правильном порядке (#2639, #3272).
    • Исправлена ошибка, из-за которой вызов addMediaItems для пустой очереди в RemoteCastPlayer не позволял загрузить мультимедийные объекты на приемник Cast (#2402).
    • Исправлена ошибка в RemoteCastPlayer, из-за которой при достижении конца очереди приемника Cast очищалась временная шкала, а не сохранялся плейлист.
    • Исправлена ошибка, из-за которой playWhenReady, repeatMode и playbackParameters не переносились и не применялись, если были заданы в RemoteCastPlayer до загрузки мультимедийных объектов (например, при переносе воспроизведения с локального устройства на удаленное в CastPlayer) (#889).
  • Демонстрационное приложение:
    • Добавьте поддержку мультимедийных объектов, защищенных технологиями DRM, и дополнительный пример потока HLS в каталог демонстрационного приложения.
    • Чтобы во время трансляции можно было выбирать субтитры и аудиодорожки, настройте RemoteCastPlayer с помощью CastTrackSelector в демонстрационном приложении.
  • Удалите устаревшие символы:
    • Удалите DashUtil.buildDataSpec(Representation, RangedUri, int) и DashUtil.buildDataSpec(Representation, String, RangedUri, int). Используйте вместо него DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>).
  • Сборка:
    • Увеличьте значение minSdk в Gradle до 24.

Версия 1.11.0

1.11.1

10 сентября 2026 г.

  • ExoPlayer:
    • Переместите флажок, чтобы включить или отключить метаданные HAGC для прогрессивных медиафайлов, с MediaSource.Factory на ExtractorsFactory. Прежний метод setExperimentalEnableHagcPlayback удален и заменен на ExtractorsFactory.setParseHagcMetadata. Это также решает проблему, из-за которой отключение не работало для контейнеров Matroska/WebM.
    • Исправлена ошибка, из-за которой воспроизведение останавливалось при предварительном прогреве дополнительного средства отрисовки, не выполняющего переход.
    • Исправлена ошибка предварительного прогрева, из-за которой Surface возвращался к основному рендереру, когда поиск сбрасывал и отключал оба рендерера.
    • Исправлена ошибка ArrayIndexOutOfBoundsException, из-за которой при обновлении временной шкалы трансляции позиция по умолчанию перемещалась за вставленное на стороне сервера объявление, которое воспроизводилось в этот момент (#3348).
    • Исправлена ошибка, из-за которой в режиме прокрутки могли ненадолго показываться устаревшие кадры видео, если включен параметр ScrubbingModeParameters.allowSkippingMediaCodecFlush.
  • Экстракторы:
    • Matroska: исправлена ошибка, из-за которой дорожки, размещенные после кластеров, не позволяли перемещаться по временной шкале (#3377).
  • Аудио:
    • Исправлен расчет размера буфера в SilenceSkippingAudioProcessor, чтобы минимальная продолжительность тишины не уменьшалась неправильно из-за размера кадра (#3271).
    • Исправлена обработка 8-битных PCM в PcmAudioUtil, чтобы семплы обрабатывались как беззнаковые, как определено в Android (#3271).
    • Исправлена проблема с разгрузкой, из-за которой воспроизведение могло останавливаться во время видеорекламы в начале ролика или переходов без пауз из-за ограниченного размера аппаратного буфера.
    • Исправлена ошибка в DefaultAudioSink, из-за которой количество выпусков не уменьшалось, когда поток воспроизведения переставал работать (#3338).
  • Сеанс:
    • Исправлена ошибка NullPointerException, возникавшая, когда выполняющийся процесс MediaController освобождался из обратного вызова Player.Listener (#3375).
    • Исправлена взаимная блокировка в основном потоке, когда устаревший MediaBrowser подключается к сервису, возвращающему асинхронный результат из onGetLibraryRoot() или onConnectAsync() (#3393).
  • Расширение HLS:
    • Исправлен расчет смещения возобновления контента, когда целевой сегмент для привязки ещё не находится в плейлисте (#3322).
    • Исправлена ошибка, из-за которой полностью использованный HlsMediaChunk повторно пытался загрузиться при получении EOFException от экстрактора (#3350).
  • Расширение DASH:
    • Исправлен неверный расчет временной метки для дорожек изображений с presentationTimeOffset (#3334).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Opus: исправлена ошибка, из-за которой повреждалась память, когда одновременно инициализировалось несколько экземпляров OpusDecoder.
    • MPEG-H: исправлена утечка памяти, усечение символов, не входящих в набор ASCII, и потенциальный сбой на уровне ОС в условиях нехватки памяти при отправке команд в MpeghUiManager (#3365).

Версия 1.11.0

5 августа 2026 г.

  • Общая библиотека:
    • Добавьте Format.channelMask, чтобы явно представить маску аудиоканала, и новую перегрузку Util.getAudioTrackChannelConfig(Format), чтобы безопасно ее разрешить.
    • Обновите Kotlin с версии 2.0.20 до 2.2.0.
  • ExoPlayer:
    • Исправлена ошибка параллелизма, зависящая от времени, которая могла вызывать IllegalStateException или IndexOutOfBoundsException в ExoPlayer.
    • Ослабьте проверку количества групп объявлений в AdsMediaSource, чтобы разрешить уменьшение количества групп объявлений, когда группа объявлений полностью обработана (hasUnplayedAds() – false), что позволяет динамически изменять размер группы объявлений во время рабочих процессов сброса.
    • Добавьте getFlags() и FLAG_STRICT_DURATION в SampleStream, чтобы разрешить потокам сообщать о флагах, и обновите средства визуализации, чтобы динамически проверять эти флаги.
    • Если форматы потока не предоставляют допустимое значение, для расчета рабочей частоты кодека используйте оценщик частоты кадров в MediaCodecVideoRenderer и формат вывода кодека в MediaCodecAudioRenderer. Это позволит избежать ненужных сбросов кодека.
    • Удалите обрезку контента для клиентских объявлений, вставленных в основной проигрыватель. Вместо этого AdsMediaSource берет на себя логику обрезки. Специальные источники объявлений, вставляемых на стороне клиента, необходимо обновить, чтобы реализовать обрезку контента на стороне клиента.
    • Треки с правильно сформированным, но нераспознанным профилем или уровнем кодека помечаются как supported=NO_EXCEEDS_CAPABILITIES, а не supported=YES (так помечаются треки с отсутствующей или неправильно сформированной информацией о профиле или уровне). Это гарантирует, что такие дорожки (которые вряд ли поддерживаются устройством) не будут выбраны, если есть альтернативы с лучшей поддержкой.
    • Добавьте DefaultPreloadManager.SimpleRankingDataComparator, который является RankingDataComparator, сравнивающим ранги мультимедийных объектов на основе их расстояния до индекса текущего воспроизводимого мультимедийного объекта. Приложения могут переопределять метод compare(Integer, Integer), если требуется более точная логика сравнения. Специальный класс SimpleRankingDataComparator можно внедрить с помощью нового конструктора DefaultPreloadManager.Builder.
    • Уменьшите риск нехватки памяти для DefaultLoadControl.prioritizeTimeOverSizeThresholds, вернувшись к ограничениям на размер буфера в байтах, если доступной памяти в куче недостаточно.
    • Выровнена обработка неподвижных изображений, когда не задано свойство MediaItem.imageDurationUs. Теперь неподвижные изображения JPEG и HEIC "воспроизводятся" с очень короткой продолжительностью по умолчанию (так же, как ранее вели себя PNG и другие изображения).
    • Добавьте MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter), чтобы выровнять BandwidthMeter по MediaSource. Однако по умолчанию по-прежнему будет вызываться устаревший метод с пользовательской реализацией. Рекомендуется реализовать новый метод и использовать BandwidthMeter.getTransferListener(), чтобы получить паритет со старым методом.
    • В DefaultBandwidthMeter добавьте поддержку пользовательского InitialBitrateSupplier. Это позволяет приложениям использовать собственную логику для определения начальной оценки битрейта, которая будет использоваться при создании DefaultBandwidthMeter и при изменении типа сети. Поставщика можно указать с помощью атрибута DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Включить динамическое планирование по умолчанию. Рабочий цикл воспроизведения ExoPlayer будет выполняться динамически, а не со статическим интервалом.
    • Удален ненужный сброс, который мог происходить при присоединении треков с семплами видеорекламы в начале ролика к активному воспроизведению.
    • В DefaultBandwidthMeter оптимизируйте getInitialBitrateCountryGroupAssignment, чтобы возвращать назначения групп стран, упакованные в 32-битное целое число, а не в массив. Это позволит уменьшить размер кода и избежать выделения памяти.
    • Исправлены ошибки инициализации AudioTrack на некоторых устройствах. Теперь при повторных попытках всегда используется буфер размером не менее 1 секунды, если другие попытки (с уменьшением размера буфера вдвое) не увенчались успехом (#3207).
    • Исправлена проблема с кодеком на некоторых устройствах, из-за которой кодек поглощал все образцы, если ранее он был очищен до получения входных буферов.
    • Добавлен экспериментальный параметр ExoPlayer.Builder.enablePerStreamMediaProgression(), позволяющий улучшить обработку медиаконтента для каждого потока. Это сокращает задержку при запуске между элементами плейлиста и предотвращает зависание воспроизведения при очень коротком контенте (#3122).
    • Исправлено состояние гонки, связанное с использованием идентификатора аудиосеанса, когда вместо значения, заданного setAudioSessionId, использовался автоматически сгенерированный ExoPlayer идентификатор аудиосеанса (#3241).
    • Добавлена экспериментальная поддержка воспроизведения временных метаданных HAGC (ST 2094-50) для прогрессивных медиафайлов (например, MP4, Matroska). Проигрыватель автоматически объединяет дорожки метаданных HAGC со связанной видеодорожкой и передает метаданные декодеру на устройствах с API 37 и более поздних версий. Это поведение можно отключить с помощью DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
    • Добавлен параметр Format.selectionPriority, который представляет относительное предпочтение Format при выборе трека (#3236).
    • Исправлена потенциальная проблема с режимом перемотки, из-за которой перемотка могла останавливаться при переходе к концу потока.
  • CompositionPlayer:
    • Исправлена ошибка, из-за которой экземпляры TrackSelector не освобождались.
  • Трансформер:
    • Исправлена ошибка, из-за которой в отчетах могли завышаться данные о ExportResult.fileSizeBytes.
  • Выбор трека:
    • Добавьте BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR и AdaptiveTrackSelection.Factory.setTrackFormatComparator, чтобы разрешить сортировку по форматам и выбор приоритета ABR не только по битрейту.
    • Исправлена проблема параллелизма, зависящая от времени, из-за которой быстрые последовательные обновления параметров выбора трека могли привести к потере или перезаписи некоторых обновлений.
  • Экстракторы:
    • MP4, MP3 и FLAC. Добавлен метод FLAG_DISABLE_ARTWORK_METADATA, позволяющий удалять прикрепленные изображения и метаданные обложек при синтаксическом анализе контейнера, чтобы снизить потребление памяти во время выполнения (#2077). Эту функцию также можно включить централизованно в DefaultExtractorsFactory.setDisableArtworkMetadata.
    • MP4: добавлена поддержка извлечения дорожек временных метаданных ITU-T T.35 (it35).
    • MP4: добавлена поддержка извлечения метаданных разделов (в форматах Nero и QuickTime). Если в видео есть и те, и другие, предпочтение отдается эпизодам QuickTime. Извлеченная информация о главах представлена в виде записей Chapter в Metadata трека, что позволяет осуществлять навигацию по главам в файлах MP4, M4A и M4B (например, в аудиокнигах и подкастах) (#2803).
    • WAV, Matroska и MP4: добавлена поддержка 64-битного PCM-аудио с плавающей запятой (#3090).
    • Matroska: используйте метаданные битового потока кодека, чтобы заполнить точные значения ColorInfo.
    • MP4: добавлена поддержка поиска во фрагментированных файлах MP4 с помощью поля mfra, если поле sidx отсутствует. Чтобы включить эту функцию, передайте FLAG_READ_MFRA_FOR_SEEK_MAP в FragmentedMp4Extractor. В DefaultExtractorsFactory это делается по умолчанию (#3088).
    • Игнорировать данные av1C с неподдерживаемой версией.
    • MP4: добавлена поддержка PCM с плавающей запятой и прямым порядком байтов в блоках fpcm.
    • Matroska: анализ информации о разделах для записей Chapter в Metadata дорожки.
    • MPEG-TS: улучшено извлечение потоков DTS-HD и DTS Express за счет объединения основного и дополнительного подпотоков в один образец. Это позволило устранить проблемы с воспроизведением, возникавшие, когда они выводились как отдельные образцы (#3147).
    • MP4: предотвращение бесконечных циклов и чтения за пределами допустимого диапазона при обработке пустых элементов тега метаданных ilst (#3191).
    • MPEG-TS. Обеспечена отрисовка последнего кадра для потоков, в которых последний пакет PES имеет известную длину (#3206).
    • MP3: исправлена ошибка, из-за которой в файлах с заголовками Xing и VBRI неправильно указывался битрейт.
    • Matroska: обработка дорожек, определенных в последнем кластере (#3250).
    • Matroska: добавлена поддержка ALAC (#3268).
    • MP4: разрешены блоки sgpd переменной длины во фрагментированных файлах MP4 (#3243).
    • AVI: устранена проблема, из-за которой при воспроизведении файлов без флагов ключевых кадров на аудиодорожках пропадал звук и возникала ошибка OutOfMemoryError.
    • MP3: используйте длительность без пауз из заголовков Xing/Info (#3183).
    • MP3: скорректирована задержка кодировщика LAME/Xing и метаданные заполнения, чтобы они соответствовали декодированной обрезке PCM (#3200).
  • Аудио:
    • Добавлен 100-миллисекундный льготный период в аудиорендерерах ExoPlayer при переходе из состояния готовности в состояние неготовности, чтобы устранить временные недогрузки и избежать неожиданных состояний буферизации во время активного воспроизведения (#3210).
    • Измените логику размера буфера PCM по умолчанию в DefaultAudioTrackBufferSizeProvider, чтобы использовать фиксированный буфер 500 мс и сделать его менее зависимым от устройства.
    • Обновите MediaCodecAudioRenderer, чтобы извлечь пространственную маску channelMask из декодера платформы. Это позволит DefaultAudioSink использовать явную маску вместо того, чтобы выводить ее из количества каналов.
    • Преобразуйте параметры AudioSink.configure в класс данных. Специальные переопределения ForwardingAudioSink.configure необходимо перенести в новую сигнатуру метода.
    • Добавлена поддержка сохранения высоты тона при растягивании аудиопотока по времени с помощью EditedMediaItem.Builder#setSpeed(SpeedParameters).
    • Улучшен класс ToFloatPcmAudioProcessor, чтобы поддерживать преобразование 8-битного PCM, 16-битного PCM с прямым порядком байтов и 64-битного PCM с плавающей запятой в 32-битный PCM с плавающей запятой (#3090).
    • Измените возвращаемое значение DecoderAudioRenderer.getChannelMapping на ImmutableIntArray.
    • Исправлена ошибка, из-за которой воспроизведение плейлиста с непрерывным аудио зависало в режиме сжатой разгрузки.
    • Пересылать Timeline и UID периода в AudioSink.configure и AudioProcessor.StreamMetadata, чтобы предоставлять аудиопроцессорам контекст плейлиста (#418).
    • Установите правильное значение AudioProcessor.StreamMetadata.positionOffsetUs, чтобы разрешить обработку аудио на основе времени (#418).
    • Добавлена поддержка 32- и 64-битных PCM с плавающей запятой и прямым порядком байтов.
    • Удален резервный путь EAC3-JOC к EAC3 для воспроизведения на устройствах Google Pixel, поскольку их стандартные декодеры EAC3 не могут декодировать потоки EAC3-JOC (#3257).
  • Видео:
    • Исправлена логика присоединения видео, чтобы буферы, сброшенные во время присоединения, считались пропущенными, а не сброшенными.
    • Исправлена ошибка, из-за которой при настройке новой поверхности принималось решение о немедленном рендеринге, что приводило к пропуску кадров на устройствах, не поддерживающих плейсхолдеры.
    • Исправлена оценка частоты кадров в MediaCodecVideoRenderer. Теперь она точнее, поскольку учитывает пропущенные кадры.
    • Разрешить настройку порогового значения, используемого для раннего планирования кадров По умолчанию установлено значение 50 мс, но его можно изменить с помощью MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
    • Исправлена ошибка в VideoFrameReleaseHelper, из-за которой изменения на экране могли вызывать лишние обратные вызовы Choreographer и чрезмерное количество пробуждений ЦП в основном потоке.
  • Текст:
    • TTML: резервный вариант displayAlign вместо style для регионов (#2559).
    • TTML: наследование времени начала реплики от родительского элемента <p> (#3246).
  • Метаданные:
    • Добавьте поле MediaMetadata.discSubtitle и проанализируйте его из данных ID3v2.4 TSST и Vorbis DISCSUBTITLE.
    • Получить номер и количество дисков из фрейма ID3 TPOS.
  • Эффект:
    • Очистка состояния перерисовки в FinalShaderProgramWrapper при сбросе, чтобы предотвратить зависание проигрывателя при поиске.
  • Мультиплексоры:
    • Добавлена поддержка ссылок на треки (поле tref) в Mp4Muxer с помощью нового API addTrackReference. Это позволяет устанавливать связи между дорожками, например связывать дорожку метаданных с дорожкой видео, которую она описывает.
    • Добавьте OggMuxer, чтобы разрешить мультиплексирование медиапотоков OPUS или VORBIS в формат файла ogg.
    • Добавьте WavMuxer для создания WAV-файлов (поддерживается целочисленная и запись с плавающей запятой PCM).
    • Добавьте setAttemptStreamableOutputEnabled в InAppMp4Muxer.Factory, чтобы разрешить запись небольших файлов, не предназначенных для потоковой передачи, без резервирования места.
    • Добавлена поддержка аудио IAMF в Mp4Muxer и FragmentedMp4Muxer.
  • Расширение IMA:
    • Добавьте ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot, чтобы предоставить рекламное место для объявлений во время паузы.
    • Исправлена ошибка, из-за которой при показе двух объявлений VAST с возможностью пропуска подряд кнопка пропуска появлялась сразу же после начала второго объявления (#3165).
  • Сеанс:
    • Исправлены потенциальные взаимоблокировки и сбои IllegalStateException в MediaNotificationManager при использовании сеанса с циклом проигрывателя в фоновом потоке.
    • Принудительно применять более строгие требования к потокам для методов MediaSession. Методы void теперь автоматически отправляют выполнение в поток цикла приложения, а методы доступа к состоянию (геттеры) явно вызывают IllegalStateException, если они вызываются из потока, отличного от цикла приложения.
    • Исправлен сбой при объединении временных шкал за пределами допустимого диапазона (IllegalStateException в MediaUtils.mergePlayerInfo) за счет отслеживания согласованности состояния для каждого контроллера на стороне сеанса.
    • Добавьте androidx.media3.session.MediaSessionManager, чтобы обеспечить поддержку запросов активных сеансов воспроизведения и возврата экземпляров Media3 SessionToken.
    • Измените режим работы по умолчанию для MediaSession.Callback.onConnect, если метод не переопределен, чтобы предоставлять ненадежным контроллерам доступ только для чтения.
    • Добавлена поддержка переопределения названия пакета при создании MediaSession с помощью нового API MediaSession.Builder#setPackageNameOverride. Чтобы переопределить название пакета сеанса, у вызывающего абонента должно быть разрешение android.permission.OVERRIDE_MEDIA_SESSION_OWNER.
    • Добавьте MediaSession.Callback.onConnectAsync(). Новый метод позволяет асинхронно обрабатывать попытку подключения контроллера. Чтобы добиться прежнего поведения, приложения могут сразу возвращать Future с Futures.immediateFuture(ConnectionResult). Рекомендуется перейти на новый метод, поскольку Callback.onConnect может быть упразднен.
    • Исправлена ошибка, из-за которой при просмотре Bluetooth AVRCP не распознавался MediaLibraryService в API 36 и 37.
    • Исправлено двойное уменьшение масштаба обложки в MediaSession, когда размер изображения близок к ограничению платформы. Это устраняет размытость в уведомлениях (#3134).
    • Исправлен сбой ForegroundServiceStartNotAllowedException в MediaNotificationManager, когда обратный вызов асинхронной загрузки битовой карты обложки пытался запустить активную службу, пока приложение работало в фоновом режиме (#3270).
    • Исправлена ошибка, из-за которой у объектов PositionInfo, полученных MediaController, отсутствовали исходные идентификаторы UID Timeline. Теперь сеанс надежно преобразует и распространяет эти UID во время обновления состояния.
    • Исправлен сбой, возникавший при перехвате ForegroundServiceStartNotAllowedException в MediaSessionService.stopSelfSafely() (#3310).
    • Исправлен неожиданный обратный вызов onMediaItemTransition() в MediaController при перемотке в одном и том же мультимедийном объекте (#3248).
  • Интерфейс:
    • Исправлена ошибка, из-за которой первый кадр отображался в неправильном размере, когда ContentFrame перекомпоновывался в середине воспроизведения (#3238).
    • Добавьте класс CurrentMediaItemState и соответствующую composable-функцию rememberCurrentMediaItemState в модуль media3-ui-compose. Это хранилище состояния используется в demo-compose для отображения различных метаданных о воспроизводимом в данный момент MediaItem.
    • Добавьте класс PlaylistState и соответствующую composable-функцию rememberPlaylistState в модуль media3-ui-compose. Это хранилище состояния используется в demo-compose для отображения различных метаданных о MediaItems, заданном в проигрывателе.
    • Добавьте API для ускорения и замедления в PlaybackSpeedState. Используйте эту функцию в demo-compose, чтобы показать, как работает перемотка вперед долгим нажатием.
    • Добавьте composable-функцию MiniController в модуль media3-ui-compose-material3. Оно предоставляет компактный аффорданс для управления Player, а также показывает название, исполнителя, обложку и ход воспроизведения текущего мультимедийного объекта.
    • Добавьте класс ErrorState и соответствующую composable-функцию rememberErrorState в модуль media3-ui-compose. Добавьте composable-функцию ErrorText в media3-ui-compose-material3 и сделайте ее оверлеем по умолчанию для Player.
    • Опубликуйте объект PlayerDefaults с composable-функциями для TopControls, CenterControls, BottomControls и ErrorOverlay.
    • Добавьте FocusRequester в composable-функцию Player и ее слоты контента.
    • Публикуйте PlayerPool (common-ktx) и rememberPooledPlayer (ui-compose), чтобы поддерживать предзагрузку MediaItems в интерфейсах со скользящим окном. Продемонстрируйте эту функцию в demo-compose с помощью нового ShortFormPlayerScreen.
    • Исправлена ошибка подавления затвора в PlayerView и Compose,PresentationState которая приводила к сбоям на временных шкалах, не поддерживающих поиск UID периода (#3264).
  • Скачивания:
    • Переменные HLS в плейлисте медиаконтента теперь разрешаются при получении для скачивания (#3258).
  • Расширение Ktor:
    • Добавьте новый модуль расширения media3-datasource-ktor, предоставляющий KtorDataSource на основе стека HTTP Ktor.
    • Исправлена ошибка KtorDataSource, из-за которой при открытии подключения в память загружалось все тело HTTP-ответа (#3305).
  • Расширение HLS:
    • Добавлена поддержка управления контентом HLS и клонирования путей (#1689).
    • Добавьте setWithAssetListReset в HlsInterstitialsAdsLoader, чтобы приложения могли сбрасывать полностью обработанные межстраничные объявления из списка объектов обратно в недоступное состояние для повторного разрешения по запросу.
    • Проанализируйте атрибут SCORE для EXT-X-STREAM-INF и EXT-X-I-FRAME-STREAM-INF и добавьте его в Format.selectionPriority (#3236).
    • Исправлена ошибка, из-за которой запланированные обновления плейлиста HLS продолжались, даже если плейлист больше не был основным или активным (#3254).
    • Исправлен расчет смещения возобновления контента при разрешении списков объектов межстраничных объявлений (#3322).
    • Исправлена ошибка, из-за которой при возобновлении воспроизведения трансляции с низкой задержкой после сбоя запроса плейлиста возникал неожиданный разрыв временных меток аудиодорожки (#3311).
    • Исправлена ошибка в HlsMediaPeriod.getStreamKeys(), из-за которой трек ID3 в аудиоверсиях считался субтитрами (#3333).
  • Расширение DASH:
    • Разделяйте субтитры CEA на разные элементы TrackGroup в зависимости от языка (#3113).
    • Добавлена поддержка синтаксического анализа нескольких элементов Location из манифеста (MPD) и резервного местоположения в DashMediaSource, когда не удается загрузить манифест.
    • Исправлен сбой (IndexOutOfBoundsException), возникавший при открытии манифестов с пустым элементом <SegmentTimeline/> (#3326).
  • Расширение RTSP:
    • Исправлены временные сбои воспроизведения или ошибки при подготовке воспроизведения RTSP, вызванные ошибками привязки портов UDP.
  • Расширение Cast:
    • Добавлен новый класс CastParams, позволяющий настраивать Cast с помощью вызова Cast.initialize(CastParams).
    • Добавлен новый параметр CastParams.getShowSystemOutputSwitcherOnCastIconClick(), который позволяет использовать переключатель вывода SystemUI вместо средства выбора устройства Cast в приложении, если оно доступно.
    • Добавлены методы MediaRouteButtonState и rememberMediaRouteButtonState, позволяющие отслеживать видимость средства выбора маршрута медиа, а также параметр state в метод MediaRouteButton (#3172).
    • Исправлена ошибка, из-за которой RemoteCastPlayer мог навсегда застрять в состоянии маскирования трека после выбора трека, в результате чего он игнорировал последующие обновления трека от приемника Cast (#3237).
    • Исправлена ошибка, из-за которой DefaultMediaItemConverter выдает NullPointerException при попытке присоединиться к сеансу трансляции, запущенному не из Media3.
    • Запрет на передачу CastPlayer MediaItems, которые не могут быть воспроизведены при смене активного проигрывателя (#3199).
    • Исправлена ошибка, из-за которой ненастроенные прямые трансляции (liveConfiguration == UNSET) ставились в очередь как STREAM_TYPE_BUFFERED (#3318).
  • Утилиты для тестирования:
    • Расширьте DataSourceContractTest, чтобы включить поддержку запросов POST с заголовками и телами, добавьте некоторые ресурсы POST в HttpDataSourceTestEnv и добавьте утверждения для ожидаемого метода HTTP, заголовков и тела в WebServerDispatcher.
    • Ужесточить утверждения в DataSourceContractTest для длин, возвращаемых из DataSource.open(). Ресурсы, которые могут возвращать ошибку C.LENGTH_UNSET, должны указывать на это с помощью TestResource.Builder.setMayResolveToUnknownLength(boolean).
    • Свойство setPlaybackLooper добавлено в запрос TestExoPlayerBuilder.
  • Удалите устаревшие символы:
    • Удалить androidx.media3.exoplayer.MetadataRetriever Используйте вместо него androidx.media3.inspector.MetadataRetriever.
    • Удалить androidx.media3.exoplayer.MediaExtractorCompat Используйте вместо него androidx.media3.inspector.MediaExtractorCompat.
    • Удалить Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA Для извлечения метаданных фото с движением из файлов HEIC используйте HeifExtractor.
    • Удалить androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata Используйте вместо него androidx.media3.extractor.metadata.MotionPhotoMetadata.
    • Удалить androidx.media3.extractor.DummyTrackOutput Используйте вместо него androidx.media3.extractor.DiscardingTrackOutput.
    • Удалить androidx.media3.extractor.DummyExtractorOutput Используйте вместо него androidx.media3.extractor.NoOpExtractorOutput.
    • Удалить androidx.media3.common.C.generateAudioSessionIdV21 Используйте вместо него androidx.media3.common.util.Util.generateAudioSessionId.
  • Создание
    • Обновлены инструкции README.md по локальной зависимости от Media3 для использования составных сборок Gradle (includeBuild). Скрипт core_settings.gradle удален, а свойства androidxMediaModulePrefix и androidxMediaEnableMidiModule больше не используются.

1.11.0-rc01

Используйте стабильную версию 1.11.0.

1.11.0-beta01

7 июля 2026 г.

Используйте стабильную версию 1.11.0.

1.11.0-alpha01

24 июня 2026 г.

Используйте стабильную версию 1.11.0.

Версия 1.10.0

1.10.1

12 мая 2026 г.

  • Общая библиотека:
    • Исправьте обработку onAudioSessionIdChanged в SimpleBasePlayer и ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Исправлена ошибка, связанная с состоянием гонки при создании идентификатора аудиосеанса, которая могла приводить к IllegalStateException в туннельном режиме. (#3099).
    • Исправлены возможные сбои приложения при восстановлении после ошибок декодера с предварительным прогревом средства визуализации.
    • Исправлена ошибка, из-за которой в видео появлялись артефакты, если при использовании кодека Dolby Vision на основе AV1 предоставлялись данные инициализации (#3153).
  • Выбор трека:
    • Скорректируйте логику выбора треков в VideoTrackInfo, чтобы устранить резервные MIME-типы и перенести HDR и оценки кодеков в настройки качества (#3135).
  • Экстракторы:
    • MP3: игнорирование длины данных Xing, если она превышает известную длину потока (#3117).
    • Исправлена ошибка ArrayIndexOutOfBoundsException в Mp4Extractor, когда задано значение FLAG_OMIT_TRACK_SAMPLE_TABLE, а в дорожке отсутствует поле синхронизации образца (stss).
  • Аудио:
    • Исправлена ошибка, из-за которой аудиособытия могли быть неправильно перенаправлены, если в проигрыватель добавлено несколько средств визуализации аудио.
  • Видео:
    • Скорректирована логика повторного использования кодека при изменении частоты кадров в API ниже 30, чтобы избежать сброса кодека, когда это не требуется (#3120).
    • Отключить обходное решение с принудительной синхронизацией в queueSecureInputBuffer для API 31+. Это решение было искусственным узким местом, которое заставляло расшифровку выполняться последовательно, что предотвращало искажение видео из-за проблемы с фреймворком, существовавшей до API 31.
  • Изображение:
    • Исправлена ошибка, из-за которой в режиме перемотки изображения обновлялись, только когда пользователь останавливал перемотку (#2815).
  • Сеанс:
    • Исправлена ошибка, из-за которой ForegroundServiceStartNotAllowedException не распространялся за пределы потока, если поток приложения не был основным (#2499).
    • Исправлена ошибка, из-за которой COMMAND_SEEK_TO_MEDIA_ITEM не был доступен в MediaController при подключении к сеансу только для платформы, который поддерживает переход к другим элементам, но не поддерживает изменение плейлиста.
    • Исправлена ошибка, из-за которой MediaController не может задавать мультимедийные объекты в сеансах воспроизведения на платформе, не разрешающих действия PREPARE_FROM.
    • Исправлена ошибка, из-за которой собственный процесс не помечался как Controller.isTrusted() в API 27 или более ранних версиях при подключении через контроллеры платформы.
  • Расширение HLS:
    • Исправлена ошибка, из-за которой при резервном копировании потока возникало исключение ArrayIndexOutOfBoundsException, если выбранные треки были подмножеством доступных (#3161).
    • Исправлена ошибка, из-за которой сегмент инициализации не переносился в обновления плейлиста, если тег #EXT-X-MAP не повторялся в последующих обновлениях (#3105).
  • Расширение DASH:
    • Исправлен сбой в SampleQueue при переходе к фрагменту, который в данный момент отменяется.

1.10.0

26 марта 2026 г.

  • Общая библиотека:
    • Перевести Player.mute() и Player.unmute() из UnstableApi в стабильную версию.
    • Перевести Format.pcmEncoding и C.PcmEncoding из UnstableApi в стабильную версию.
    • Добавлен атрибут Format.primaryTrackGroupId, позволяющий идентифицировать основную группу встроенных экземпляров Format (#294).
  • ExoPlayer:
    • Добавьте в AdsMediaSource возможность создавать клипы.
    • Добавлена поддержка динамического планирования в MediaCodecVideoRenderer, чтобы лучше согласовывать планирование работы и циклы пробуждения ЦП с моментами, когда можно обрабатывать кадры видео. Для этого используйте experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() в DefaultRenderersFactory.
    • Разрешить задавать собственное значение DataSource.Factory в DefaultPreloadManager.Builder.
    • Разрешить имитацию ExoPlayer без Robolectric, переместив некоторые константы по умолчанию в ExoPlayer.Builder. Имитировать этот сложный интерфейс обычно не рекомендуется. Это можно делать, только если он используется минимально, просто или случайно (#2985).
      • Для этого потребовалось перенести DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS из ExoPlayer в ExoPlayer.Builder (без прекращения поддержки).
    • Исправлена ошибка, из-за которой ProgressiveMediaSource передавал проигрывателю устаревшую информацию о временной шкале, а периоды в очереди неожиданно удалялись (#3016).
    • Исправлена ошибка, из-за которой ExoPlayer не запрашивал отложенный аудиофокус, когда воспроизведение запрашивалось во время телефонного звонка.
    • Исправлена ошибка, из-за которой при переходе от контента по запросу к трансляции в конце контента по запросу могла происходить повторная буферизация (#3052).
    • Добавлена поддержка Dolby Vision Profile 10 (#2830).
    • Исправлена ошибка, из-за которой неинициализированная реклама в начале видео вызывала ошибку ArrayIndexOutOfBoundsException (#3125).
  • CompositionPlayer:
    • Добавьте поддержку EditedMediaItem.removeVideo.
  • Трансформер:
    • Теперь в EditedMediaItem.Builder.setFrameRate() можно задать максимальную частоту кадров для видео. Это особенно полезно при увеличении скорости воспроизведения с помощью setSpeed().
  • Выбор трека:
    • Измените сигнатуру DefaultTrackSelector.selectAllTracks, чтобы включить выходной массив в качестве параметра, предварительно заполненного переопределениями дорожек.
    • Исправлена ошибка, из-за которой встроенные дорожки метаданных выбирались независимо от того, была ли выбрана соответствующая основная дорожка (#294).
    • Стабилизировать TrackSelectionParameters вариантов для preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabels и selectTextByDefault.
  • Экстракторы:
    • MP4: добавлена поддержка файлов с большими блоками uuid перед другими блоками, например moov (#3046).
    • MP4: добавлена поддержка дорожек Versatile Video Coding (VVC) в контейнерах MP4.
  • Инспектор:
    • Критическое изменение: удаление FrameExtractor. Теперь пользователям нужно использовать новый модуль :media3-inspector-frame и обновить импорт до androidx.media3.inspector.frame.FrameExtractor.
    • Добавлен новый модуль для извлечения и обработки декодированных кадров видео.
  • Аудио:
    • Базовая библиотека декодирования для расширения декодера IAMF изменена с libiamf на iamf_tools.
    • Декодирование IAMF поддерживает бинауральный вывод через декодер (при использовании расширения декодера IAMF) или через Android Spatializer.
    • Исправлена ошибка, из-за которой при оценке поддержки декодера AC-4 в автомобильных сценариях некорректно удалялась поддержка AC4Profile22 и других устаревших профилей (#2609).
    • Улучшена логика повторных попыток инициализации AudioOutput в DefaultAudioSink (#2905).
    • При декодировании IAMF с помощью расширения IAMF и декодеров медиакодеков, поддерживаемых новыми полями и логикой в AudioCapabilities и AudioCapabilitiesReceiver, попытайтесь сопоставить выходную схему динамиков (или пространственного звука, если применимо).
    • Исправлена ошибка, из-за которой воспроизведение плейлиста с непрерывным аудио зависало в режиме сжатой разгрузки.
  • Текст:
    • VobSub: для определения длительности подсказки используются команды управления SPU START и STOP, а не значение по умолчанию, равное 5 секундам (#2935).
  • Метаданные:
    • Количество средств визуализации метаданных по умолчанию увеличено до четырех, чтобы охватить все потенциальные дорожки метаданных, публикуемые вариантами и версиями HLS (#3043).
  • Эффект:
    • Переместите LottieOverlay в новый модуль :media3-effect-lottie (при этом также потребуется переименовать его из androidx.media3.effect.LottieOverlay в androidx.media3.effect.lottie.LottieOverlay).
  • Lottie-эффект:
    • Представляем новый модуль :media3-effect-lottie, который позволяет применять эффекты Lottie к кадрам видео.
  • Расширение IMA:
    • Обновите IMA SDK до версии 3.39.0, чтобы получить доступ к последней версии Ad Media Info API.
    • Исправлена ошибка, из-за которой MIME-тип объявления не соответствовал MIME-типу, указанному в событии IMA LOADED. Теперь MIME-тип объявления сопоставляется с использованием информации о медиафайле объявления, предоставленной IMA.
    • Добавьте setEnableCustomTabs в ImaAdsLoader и ImaServerSideAdInsertionMediaSource, чтобы пользователи могли выбирать, открывать ли URL перехода по клику по объявлению в специальных вкладках.
    • Добавьте ImaAdTagUriBuilder – класс, который предлагает альтернативный способ создания adTagUri. Он содержит setPreferredLinearOrientation API. Это API, который проходит альфа-тестирование и позволяет задавать предпочтительную ориентацию для линейных объявлений. Если вы хотите присоединиться к группе альфа-тестирования, обратитесь к своему партнеру по аккаунту.
  • Сеанс:
    • Исправлена ошибка, из-за которой большие массивы в MediaMetadata.artworkData могли приводить к сбою приложения.
    • Используйте тип int для аргумента @Player.Command в интерфейсе ActionFactory (#2933).
    • Сделайте MediaSessionService и MediaLibraryService LifecycleService, чтобы можно было прикреплять операции, учитывающие жизненный цикл, к жизненному циклу сервиса (#187).
    • Прекратить поддержку команд изменения громкости устройства от MediaController и MediaBrowser для локального воспроизведения. Приложения не должны менять громкость на устройстве. При необходимости для этого можно использовать API AudioManager.
    • Обнаруживать устаревшие экземпляры Intent, которые запустили службу как активную. Это предотвращает появление ошибки ForegroundServiceDidNotStartInTimeException. Это критическое изменение нестабильного API для приложений, в которых реализован собственный класс MediaNotification.Provider, поскольку появился новый обязательный метод.
    • Добавлены конструкторы для экземпляров PendingIntent, которые будут использоваться с виджетами главного экрана (#2933).
    • Добавлены статические методы для создания экземпляров Intent для виджетов главного экрана на основе Compose (#2933).
    • Исправлена ошибка, из-за которой контроллеры не получали уведомление о переходе между мультимедийными объектами, когда воспроизведение переходило от одного индекса объекта к другому с тем же объектом по причине прерывания AUTO и SEEK (#2997).
    • Исправлена ошибка, из-за которой обходное решение для размещения кнопок в системном интерфейсе негативно влияло на другие интерфейсы, например Android Auto, или на устройства производителей, которым не требовалось это решение (#3041).
    • Устранена проблема, из-за которой доступ к подпискам не синхронизировался (#3056).
    • Устранена ошибка SysUI в API 29, из-за которой обложка сеанса воспроизведения определенного размера могла привести к сбою SysUI и принудительной перезагрузке устройства (#3118).
    • Исправлено масштабирование значка обложки в уведомлениях на Android Q (#3084).
  • Интерфейс:
    • Добавьте composable-функцию PlaybackSpeedControl в media3-ui-compose, чтобы показывать и изменять скорость воспроизведения.
    • Добавьте composable-функцию PlaybackSpeedToggleButton в media3-ui-compose-material3, чтобы управлять скоростью воспроизведения.
    • Добавлен компонент ProgressSlider Composable в media3-ui-compose-material3 для отображения прогресса воспроизведения и перемотки с помощью перетаскивания и нажатия (#2288).
    • Избегайте использования большого буфера за пределами экрана при анимации PlayerControlView.
    • Добавьте composable-функцию Player в media3-ui-compose-material3, которая объединяет ContentFrame с настраиваемыми элементами управления, выровненными по верхнему краю, центру и нижнему краю.
    • Скрыть позицию воспроизведения от службы специальных возможностей, чтобы предотвратить непрерывное обновление объявлений, когда виден элемент PlayerControlView.
  • Расширение HLS:
    • Добавлена поддержка X-PLAYOUT-LIMIT с промежуточными объявлениями HLS (#2484).
    • Добавлена поддержка атрибута QUERYPARAM с #EXT-X-DEFINE (#1854).
    • Оптимизирован синтаксический анализ плейлистов HLS за счет кеширования сопоставителей регулярных выражений (#3008).
    • Добавление дорожки метаданных ID3 (EMSG) в аудиоверсии (#3043).
    • Добавлена возможность использовать резервные местоположения при возникновении ошибок загрузки, если доступны избыточные потоки из разных местоположений (#1988).
    • Исправлено поведение X-SNAP для межстраничных объявлений HLS, чтобы правильно рассчитывать позицию начала и возобновления (#3013).
  • Расширение DASH:
    • Исправлена ошибка, из-за которой треки с невыровненным временем начала сегментов вызывали задержки или пропущенные фрагменты в начале воспроизведения (#3057).
    • Исправлена ошибка, из-за которой временные метки метаданных EMSG v0 в полосе пропускания устанавливались неправильно (#3024).
  • Расширение RTSP:
    • Исправлена регрессия в потоковой передаче H.264 и H.265, из-за которой неправильно анализировались выборки одного и того же блока доступа, охватывающего несколько пакетов RTP. Это приводило к появлению визуальных артефактов и повреждению видео (#3121).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Добавлена поддержка менеджера интерфейса MPEG-H в расширение декодера MPEG-H (#3066).
  • Расширение Cast:
    • Добавлен метод RemoteCastPlayer.Builder#setTrackSelector, позволяющий выбирать треки для воспроизведения через Cast.
  • Удалите устаревшие символы:
    • Удалить ExperimentalFrameExtractor Используйте вместо него androidx.media3.inspector.frame.FrameExtractor.
    • Удалить ChannelMixingMatrix.create() Используйте вместо него ChannelMixingMatrix.createForConstantGain().
    • Удалить androidx.media3.extractor.metadata.flac.VorbisComment Используйте вместо него androidx.media3.extractor.metadata.vorbis.VorbisComment.
    • Удалить MediaSource.prepareSource(MediaSourceCaller, TransferListener) Используйте вместо него MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).

1.10.0-rc03

25 марта 2026 г.

Используйте стабильную версию 1.10.0.

1.10.0-rc02

16 марта 2026 г.

Используйте стабильную версию 1.10.0.

1.10.0-rc01

10 марта 2026 г.

Используйте стабильную версию 1.10.0.

1.10.0-beta01

25 февраля 2026 г.

Используйте стабильную версию 1.10.0.

1.10.0-alpha01

6 февраля 2026 г.

Используйте стабильную версию 1.10.0.

Версия 1.9.0

1.9.4

16 мая 2026 г.

Версия 1.9.4 содержит следующие коммиты.

  • Эффект:
    • Явно задайте GL_DRAW_BUFFER и GL_READ_BUFFER при переходе из контекста без поверхности.

1.9.3

16 марта 2026 г.

Версия 1.9.3 содержит следующие коммиты.

  • Аудио:
    • Исправлена ошибка, из-за которой воспроизведение плейлиста с непрерывным аудио зависало в режиме сжатой разгрузки.

1.9.2

6 февраля 2026 г.

Версия 1.9.2 содержит следующие коммиты.

  • ExoPlayer:
    • Исправлена ошибка, из-за которой ProgressiveMediaSource передавал проигрывателю устаревшую информацию о временной шкале, а периоды в очереди неожиданно удалялись (#3016).
  • Сеанс:
    • Исправлена ошибка, из-за которой обходное решение для размещения кнопок в системном интерфейсе негативно влияло на другие интерфейсы, например Android Auto, или на устройства производителей, которым не требовалось это решение (#3041).
  • Расширение Cast:
    • Исправлена ошибка, из-за которой не удавалось переключиться с трансляции на локальное воспроизведение.

1.9.1

26 января 2026 г.

Версия 1.9.1 содержит эти коммиты.

  • Общая библиотека:
    • Добавлена поддержка строк даты и времени, в которых в смещении часового пояса указаны только часы (#2929).
  • ExoPlayer:
    • Разрешить динамическому планированию замедлять интервал doSomeWork только после начала воспроизведения аудио, чтобы улучшить синхронизацию аудио и видео в начале воспроизведения.
    • Исправлена ошибка в DefaultLoadErrorHandlingPolicy, из-за которой повторные попытки выполнялись несколько раз для FileNotFoundException и подобных типов исключений.
    • Исправлена ошибка с динамическим планированием, из-за которой расчетное время для следующего doSomeWork ошибочно уменьшалось на время, прошедшее с текущей итерации doSomeWork. Решение этой проблемы должно продлить время простоя ЦП и сэкономить электроэнергию.
    • Исправлена ошибка, из-за которой некоторые файлы Dolby Vision не воспроизводились при попытке использовать резервный кодек AVC или HEVC.
    • Исправлена ошибка, из-за которой загрузка продолжалась после окончания воспроизведения, если воспроизводимый элемент был удален из плейлиста (#2873).
    • Устранена утечка экземпляров MediaItem при повторном использовании ExoPlayer.replaceMediaItem для одного и того же элемента (#2993).
    • Предотвращены потенциальные ошибки ANR, вызванные экстренным снятием запрета блокировки (#2979).
  • Экстракторы:
    • MP3: анализ данных ReplayGain в LAME (#2840).
  • Аудио:
    • Исправлена ошибка, из-за которой при оценке поддержки декодера AC-4 в автомобильных сценариях некорректно удалялась поддержка AC4Profile22 и других устаревших профилей (#2609).
  • Видео:
    • Чтобы избежать задержек при воспроизведении, видеокодеки на устройствах с API ниже 30 отключаются, когда меняется частота кадров контента (#2941).
  • Текст:
    • VobSub: исправлена проблема с отсутствием некоторых субтитров за счет правильной обработки SPU, которые содержат только одну управляющую последовательность или имеют критически важную информацию, разделенную между несколькими управляющими последовательностями (#2935).
  • Расширение IMA:
    • Исправлена ошибка, из-за которой MIME-тип объявления не соответствовал MIME-типу, указанному в событии IMA LOADED. Теперь MIME-тип объявления сопоставляется с помощью индекса пакета объявлений и позиции объявления.
    • Добавьте проверку на null перед доступом к результату getAdsManager() и AdEvent.getAd().
  • Сеанс:
    • Исправлена ошибка, из-за которой остановка сеанса MediaController, подключенного к платформе, приводила к сбою приложения, если остановка происходила во время воспроизведения объявления (#2948).
    • Добавьте дополнительные проверки экземпляров extras Bundle в различных классах, чтобы защититься от некорректных экземпляров Bundle, отправленных из других процессов.
    • Исправлена ошибка, из-за которой отсутствие команд для COMMAND_SEEK_NEXT или COMMAND_SEEK_BACK могло приводить к пробелам в системном уведомлении о медиаконтенте (#2976).
    • Масштабирование растрового изображения для значка уведомления перенесено из основного потока (#2829).
    • Исправлена ошибка, из-за которой автор, писатель и композитор не использовались в качестве резервных вариантов при преобразовании из устаревших MediaMetadataCompat и MediaDescriptionCompat (#3018).
  • Скачивания:
    • Устранена проблема, из-за которой могли возникать бесконечные циклы, когда PriorityTooLowException обрабатывался SegmentDownloader (для DASH, HLS и SmoothStreaming). Специальные переопределения SegmentDownloader с использованием защищенного метода execute должны предоставлять задачу, упакованную в Supplier, чтобы ее можно было воссоздать (#2931).
  • Расширение HLS:
    • Передайте необработанный список объектов в формате JSON в обратный вызов Listener.onAssetListLoadCompleted. Это критическое изменение в нестабильном API, которое требует от приложений, реализующих этот обратный вызов, добавить дополнительный аргумент типа JSONObject (#2950).
  • Расширение RTSP:
    • Исправлена обработка пакетов RTP с временными метками, которые переносятся (#2930).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Исправлена потенциальная ошибка NullPointerException, которая могла возникать при перемотке до обработки первого кадра видео (#2965).
  • Расширение Cast:
    • Исправлена ошибка, из-за которой временная шкала RemoteCastPlayer не обновлялась корректно при замене плейлиста.

1.9.0

17 декабря 2025 г.

  • Общая библиотека:
    • Обновите minSdk до 23 в соответствии с другими библиотеками AndroidX.
    • Добавлен класс PlayerTransferState, который упрощает перенос состояния воспроизведения между экземплярами Player.
    • Добавьте в Player методы void mute() и void unmute(), которые сохраняют и восстанавливают громкость Player до и после установки ее на ноль.
    • Опубликованы служебные классы WakeLockManager, WifiLockManager, AudioFocusManager, AudioBecomingNoisyManager и StuckPlayerDetector, которые ранее использовались ExoPlayer внутри, чтобы разрешить повторное использование для других проигрывателей (#1893).
    • Исправлена обработка прослушивателя ForwardingPlayer, когда базовый проигрыватель-делегат использует равенство ссылок для сравнения экземпляров прослушивателя (#2675).
    • Добавьте функцию приостановки расширения Player.listenTo в библиотеку media3-common-ktx, которая указывает конкретный Player.Events, с которым нужно выполнить действие.
    • Исправлен сбой в BasePlayer.getBufferedPercentage, возникавший из-за переполнения целого числа, когда сообщаемая позиция буферизации была неправдоподобно больше сообщаемой длительности (#2750).
    • Исправлено автоматическое определение типа дорожки TrackGroup. Теперь специальный MIME-тип образца не игнорируется, а в качестве резервного варианта используется потенциально неправильный тип дорожки из MIME-типа контейнера (#2860).
  • ExoPlayer:
    • Добавьте функцию обнаружения зависания проигрывателя, которая будет вызывать ошибку StuckPlayerException, если проигрыватель завис. Это происходит в следующих случаях (при необходимости время ожидания по умолчанию можно настроить в ExoPlayer.Builder):
      • Если в течение 10 минут STATE_BUFFERING не удается воспроизвести контент и буферизация не выполняется.
      • Если в течение 10 секунд после начала воспроизведения STATE_READY не происходит, а прогресс воспроизведения отсутствует.
      • Если по истечении одной минуты после заявленной продолжительности STATE_READY не достигнут конец объекта.
      • Через 10 минут после того, как при попытке воспроизведения возникла причина для его подавления.
    • Включите обработку запрета блокировки по умолчанию, чтобы устранить проблемы с буферизацией во время фонового воспроизведения. Это эквивалентно установке значения C.WAKE_MODE_LOCAL для ExoPlayer.Builder.setWakeMode.
    • Добавьте логику прослушивания, чтобы автоматически обновлять идентификатор виртуального устройства, когда сообщается об изменении в Context, изначально переданном в ExoPlayer.Builder.
    • Добавьте ExoPlayer.setVirtualDeviceId, чтобы вручную обновить идентификатор виртуального устройства, полученный из Context, переданного в ExoPlayer.Builder.
    • Убедитесь, что средства визуализации не используют данные из следующего элемента плейлиста более чем за 10 секунд до окончания текущего элемента.
    • Добавлены методы setSeekBackIncrementMs, setSeekForwardIncrementMs и setMaxSeekToPreviousPositionMs в класс ExoPlayer, позволяющие обновлять эти настройки после создания (#2736).
    • Добавьте в DefaultPreloadManager функцию предварительного кеширования. Теперь приложения могут возвращать DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) или DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) через TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData), чтобы указать, что мультимедийный объект нужно предварительно кешировать.
    • Используйте функцию предварительного кеширования DefaultPreloadManager в демоприложении для коротких видео.
    • Добавьте сеттеры DefaultLoadControl.Builder для локального воспроизведения и настройте значения по умолчанию для DefaultLoadControl, чтобы обеспечить совместимость с широким спектром локальных файлов.
    • Исправлена ошибка, из-за которой при настройке пустого плейлиста проигрыватель мог оставаться в состоянии STATE_READY или STATE_BUFFERING.
    • Улучшите API менеджера предварительной загрузки:
      • Добавьте addMediaItems(List<MediaItem>, List<T>) и addMediaSources(List<MediaSource>, List<T>), которые добавляют мультимедийные объекты или источники мультимедиа в пакетном режиме и автоматически вызывают invalidate().
      • Добавьте removeMediaItems((List<MediaItem>) и removeMediaSources(List<MediaSource>), которые удаляют мультимедийные объекты или источники мультимедиа в пакетном режиме, и убедитесь, что менеджер предварительной загрузки не начинает и не продолжает предварительную загрузку ни одного из них после удаления.
      • Разрешить DefaultPreloadManager.setCurrentPlayingIndex(int) автоматически аннулировать себя. После обновления текущего индекса воспроизведения приложениям больше не нужно явно вызывать invalidate().
    • Добавлена возможность пропускать сброс ключевого кадра при перемотке вперед в пределах одной группы изображений в режиме прокрутки.
    • Добавьте DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int), чтобы приложения могли задавать значение целевого размера буфера в байтах для проигрывателя с указанным playerName. Теперь DefaultLoadControl может принимать решения для каждого проигрывателя отдельно на основе выделенных ему байтов и целевых байтов буфера.
    • Добавьте SkipInfo в AdPlaybackState.AdGroup, чтобы передавать информацию о пропуске для каждого объявления в группе.
    • Исправлена ошибка, из-за которой вызов removeMediaItems(List) во время воспроизведения видеорекламы в конце ролика приводил к сбою (#2746).
    • Устранено заикание при воспроизведении плейлиста, когда кадры ошибочно всегда устанавливались как последний образец и визуализировались.
    • Добавлен путь повторной попытки, если проигрывателю не удается сгенерировать идентификатор аудиосеанса (#2382, #2678).
    • Добавьте поддержку управления общим объемом буфера для источников в DefaultPreloadManager, чтобы избежать произвольного увеличения общего объема буфера для предварительной загрузки. Чтобы использовать логику управления по умолчанию, приложения могут задавать целевой размер буфера для предзагрузки с помощью DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) для playerName со значением PlayerId.Preload.name ("preload") и внедрять созданный DefaultLoadControl с помощью DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • Добавлен метод cloneAndSet(int, int) в ShuffleOrder с реализацией по умолчанию (#2834).
    • Добавлено смещение возобновления контента при пропуске воспроизведения объявления после корректировки поиска или автоматического перехода (#2484).
    • Добавлен API для настройки и отслеживания параметров кодеков для аудио- и видеодорожек. Эта функция реализована для средств визуализации на основе MediaCodec и требует API 29 или более поздней версии.
      • Используйте ExoPlayer.setAudioCodecParameters() и ExoPlayer.setVideoCodecParameters(), чтобы применить параметры.
      • Используйте ExoPlayer.addAudioCodecParametersChangeListener() и ExoPlayer.addVideoCodecParametersChangeListener(), чтобы отслеживать изменения. Для отслеживания ключей, относящихся к поставщику, требуется API 31 или более поздней версии.
    • Исправлена ошибка IllegalStateException, возникавшая при установке пустого источника медиаконтента после перехода к ненулевой позиции и последующей подготовке проигрывателя с непустым источником медиаконтента.
    • Исправлена ошибка, из-за которой при перемотке к другим мультимедийным объектам в режиме прокрутки мог возникать сбой IllegalStateException.
    • Исправлена потенциальная ошибка NullPointerException в DefaultPlaybackSessionManager (#2885).
    • Включить улучшенную перемотку для подходящих видео.
    • Повторно включена асинхронная расшифровка в MediaCodec на API 36 и более поздних версиях, где исправлены проблемы с тайм-аутом в этом API платформы (#1641).
    • Измените значение по умолчанию для MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs на 15 мс и включите более эффективный пропуск кадров видео перед декодированием для подходящих видео.
    • Добавьте максимальный лимит памяти для автоматического расчета памяти в DefaultLoadControl. Это должно происходить, только если выбрано слишком много треков (#2860).
    • Исправлена ошибка, из-за которой при воспроизведении плейлиста или в режиме повтора перемотка в режиме прокрутки ближе к концу могла привести к переходу к следующему мультимедийному объекту.
  • CompositionPlayer:
    • Опубликуйте CompositionPlayer с новой аннотацией @ExperimentalApi, чтобы указать, что она доступна для экспериментов, но все ещё находится в разработке. Некоторые API могут значительно измениться в будущих выпусках. Кроме того, в некоторых случаях использования (в том числе недокументированных) могут возникать известные проблемы и ограничения.
    • Добавьте поддержку COMMAND_SET_AUDIO_ATTRIBUTES и обработку фокуса аудио в CompositionPlayer.
    • Добавлена поддержка изменения скорости во второстепенных последовательностях в CompositionPlayer.
    • Добавьте поддержку EditedMediaItem.removeVideo.
  • Трансформер:
    • Использовать InAppMp4Muxer в качестве мультиплексора по умолчанию.
    • Добавьте EditedMediaItem.Builder#setSpeed() и прекратите поддержку Effects#createExperimentalSpeedChangingEffects().
    • Замените forceAudioTrack и forceVideoTrack на trackTypes в EditedMediaItemSequence.
  • Выбор дорожки:
    • Добавьте TrackSelectionParameters.selectTextByDefault, чтобы выбрать любую текстовую дорожку без указания других, более конкретных параметров.
    • Добавьте preferredVideoLabels, preferredAudioLabels и preferredTextLabels в TrackSelectionParameters, чтобы указать предпочтение для треков с определенным ярлыком, например тех, которые считываются из тегов HLS NAME (#1666).
  • Экстракторы:
    • FLAC: улучшено обнаружение заголовков, чтобы снизить вероятность нахождения ложных заголовков в закодированных данных FLAC, что приводит к ошибкам декодирования (#558).
    • MP3: разрешены пробелы между тегами ID3 и перед ними в начале MP3-файлов (#811, #5718).
    • MP3: лимит на сниффинг увеличен до 128 КБ, чтобы соответствовать существующему лимиту на поиск байта синхронизации (#2713).
    • MP3: теперь FLAG_ENABLE_INDEX_SEEKING предпочитает получать информацию о поиске из заголовков метаданных (например, Xing и VBRI), если они доступны. Если такой информации нет, используется поиск на основе индекса. Это повышает производительность при работе с файлами, содержащими метаданные для поиска (#2839).
    • MP3. Изменено значение Mp3Extractor, чтобы по умолчанию использовался постоянный битрейт (CBR), если не найдены метаданные поиска (например, Xing, VBRI), даже если задано значение FLAG_ENABLE_INDEX_SEEKING. Это связано с историей спецификации MP3, в которой CBR был стандартом, а VBR требовал явных заголовков. Это улучшает возможность немедленного поиска для файлов без метаданных за счет потенциальной точности для файлов VBR без заголовков. Поиск по индексу теперь используется в качестве резервного варианта, если предположение о постоянном битрейте не позволяет выполнить поиск (например, для потоков неизвестной длины) (#2848).
    • MP4: устранена неоднозначность между MIME-типами audio/mpeg (MP3), audio/mpeg-L1 и audio/mpeg-L2. Теперь перед тем, как экстрактор выдаст формат трека, проверяется значение уровня первого образца (#2683).
    • MP4: повышена эффективность сниффинга очень больших файлов за счет предположения, что блок stbl размером более 1 МБ означает, что файл не фрагментирован (#2650).
    • MP4: добавлена поддержка метаданных ©mvn (название движения) и ©mvi (индекс движения). Теперь они передаются как объекты TextInformationFrame в Format.metadata с идентификаторами MVNM и MVIN соответственно (#2754).
    • MP4: игнорировать дорожки с отсутствующим полем stsd (вместо того, чтобы не обрабатывать весь файл).
    • Matroska: добавлена поддержка обнаружения DTS-HD (#6225).
    • Исправлена ошибка в MatroskaExtractor, из-за которой поиск мог быть неточным для файлов с несколькими дорожками. Временные точки теперь правильно связаны с соответствующими звуковыми дорожками, что обеспечивает более точную перемотку.
    • MPEG-TS: исправлена ошибка IllegalArgumentException из ReorderingBufferQueue, вызванная пакетами PES без временной метки (#2764).
    • Добавлена поддержка извлечения фото с движением в формате HEIC. Теперь HeifExtractor может анализировать файлы HEIC со встроенными видео- и аудиодорожками.
  • Инспектор:
    • Добавлен новый модуль :media3-inspector, предназначенный для утилит проверки медиаконтента. Теперь в этом модуле есть новый класс androidx.media3.inspector.MetadataRetriever, который предоставляет единый API для извлечения метаданных и кадров. Существующая версия androidx.media3.exoplayer.MetadataRetriever больше не поддерживается.
    • Добавлен новый общедоступный API androidx.media3.inspector.FrameExtractor для извлечения кадров. Класс AutoCloseable позволяет извлекать кадры с поддержкой HDR-видео, видеоэффектов и выбора декодера. Его нужно создать с помощью Builder для определенного MediaItem.
    • FrameExtractor: добавьте getThumbnail(), чтобы извлечь из медиафайла кадр для значка без указания временной метки.
    • Добавлен класс androidx.media3.inspector.MediaExtractorCompat, который заменяет android.media.MediaExtractor и позволяет извлекать необработанные закодированные медиафрагменты из медиафайла. Существующий класс androidx.media3.exoplayer.MediaExtractorCompat теперь не рекомендуется использовать.
  • Аудио:
    • Добавьте в экземпляры AudioProcessor поддержку перемотки.
    • Разрешить внедрение нового интерфейса AudioOutputProvider в DefaultAudioSink.Builder для поддержки пользовательских путей вывода аудио. Значение по умолчанию – AudioTrackAudioOutputProvider.
    • Обработка перемотки в GainProcessor.
    • При оценке поддержки формата трека используются возможности профиля и уровня декодера AC-4 (#2580).
    • Устранена проблема, из-за которой могли возникать задержки, вызванные обработкой обратных вызовов при изменении маршрутизации в начале воспроизведения (#2646).
    • Разрешено повторное использование кодеков для форматов EAC3, EAC3-JOC и AC-4 (#1346).
    • Добавлена поддержка семплов PCM с плавающей запятой в Sonic.
    • Добавлена поддержка 16-битных PCM-сэмплов в ToFloatPcmAudioProcessor.
  • Видео:
    • Отключите повторное использование кодека для контента Dolby Vision с разными профилями.
    • Повторно включено временное решение для ошибочно сообщаемых баллов производительности для защищенных кодеков (#2856).
  • Текст:
    • Исправлена ошибка, из-за которой не выполнялся синтаксический анализ субтитров CEA-6/708 в контенте Dolby Vision (#2775).
  • Изображение:
    • Исправлена ошибка ScrubbingMode, из-за которой проигрыватель зависал при перемотке дорожки со значками DASH (#2815).
  • DRM:
    • Измените тип возвращаемого значения методов MediaDrmCallback с byte[] на новый тип MediaDrmCallback.Response, чтобы разрешить возврат дополнительной необязательной информации. Это критическое изменение, но его можно легко устранить, обернув предыдущее возвращаемое значение byte[] в new Response перед возвратом.
    • Добавьте в AnalyticsListener.onDrmKeysLoaded ключевую информацию о запросе, например URL и задержку (#1001).
    • Перенесите данные запроса на инициализацию из параметра URL в тело POST.
  • Эффект:
    • Добавьте Presentation.copyWithUnsetSideRoundedTo, чтобы округлить выходную сторону, если Presentation создается с одной длиной стороны.
  • Мультиплексоры:
    • Добавьте MediaMuxerCompat, который заменит фреймворк MediaMuxer.
    • Чтобы создать фото с движением, добавьте MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo().
    • Добавьте WebmMuxer, чтобы разрешить мультиплексирование медиапотоков OPUS, VORBIS, VP8 и VP9 в файл формата webm.
  • Расширение IMA:
    • Удалены пользовательские правила ProGuard, чтобы приложения могли использовать правила, выпущенные в архиве IMA для Android.
    • Добавлен новый API ImaServerSideAdInsertionUriBuilder.setNetworkCode, который позволяет задавать код сети Google Менеджера рекламы для IMA SDK, чтобы обрабатывать идентификаторы объявлений в соответствии с настройками Google Менеджера рекламы. Коды сетей необязательны, но рекомендуются для запросов потоков с полным обслуживанием. Чтобы узнать, как найти код сети, прочитайте эту статью.
    • Зависимость IMA обновлена до версии 3.37.0, для которой требуется включить десахаризацию основной библиотеки. Это также должно быть включено зависимыми приложениями. Ознакомьтесь с примечаниями по настройке IMA. * В конструктор URI для вставки объявлений на стороне сервера добавлена поддержка настроек интерфейса IMA DAI. Настраиваемый интерфейс для вставки объявлений на стороне сервера включает поддержку отрисовки элементов "С возможностью пропуска" и "Об этой рекламе". В настоящее время эта функция доступна только издателям, включенным в белый список. Это изменение также обновляет IMA SDK до версии 3.38.0 (примечания к выпуску), чтобы обеспечить доступ к API настроек пользовательского интерфейса.
    • Исправлена ошибка, из-за которой ошибка подготовки контента после объявления неправильно регистрировалась как ошибка воспроизведения объявления (#2656).
  • Сеанс:
    • Добавьте новый параметр в MediaSession.Callback.onPlaybackResumption, чтобы указать, выполняется ли вызов только для сбора информации или для начала воспроизведения (#1764).
    • Обновите MediaSession.ControllerInfo.isTrusted, чтобы также объявить контроллеры из собственного приложения доверенными (#2542).
    • Добавлен метод MediaSessionService.triggerNotificationUpdate, позволяющий вручную запускать обновление уведомлений (#1833).
    • Добавьте ProgressListener в методы пользовательских команд.
    • Измените значение по умолчанию для MediaLibrarySession.Builder.setLibraryErrorReplicationMode на non fatal.
    • Добавлен параметр Context в MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • Считывать идентификатор управления громкостью с платформы PlaybackInfo, а не получать его через Binder. Это гарантирует, что тип воспроизведения и идентификатор элемента управления громкостью считываются атомарно и соответствуют друг другу.
    • Исправлена ошибка, из-за которой события клавиш ACTION_UP отфильтровывались до передачи в обратный вызов для специальной обработки. Это обеспечивает паритет с тем, что делала media1 и что делает платформа (#2637).
    • Исправлена ошибка, из-за которой getCurrentTimeline() вызывался PlayerWrapper, даже когда команда была недоступна (#2665).
    • Исправлена ошибка, из-за которой сообщение оставалось в очереди сообщений основного цикла, что приводило к утечке памяти после завершения работы сервиса (#2692).
    • При подключении к устаревшему приложению сеанса с помощью MediaBrowser настраиваемые команды отправляются в сеанс, только если настраиваемое действие объявлено как настраиваемое действие в PlaybackStateCompat устаревшего сеанса. Все остальные настраиваемые действия отправляются в сервис.
    • Реализован метод onAudioSessionIdChanged, который уведомляет контроллеры мультимедиа, когда сеанс задает идентификатор аудиосеанса (#244).
    • Исправлена ошибка, из-за которой KEYCODE_HEADSETHOOK не запускал проигрыватель, а событие мультимедийной клавиши Intent поступало в onStartCommand(). Проблема устранена путем обработки KEYCODE_HEADSETHOOK так же, как и KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • Исправлена ошибка, из-за которой размер Surface не передавался между сеансом и контроллером, что приводило к сбою при применении видеоэффектов в демосеансе. Если вы используете контроллер, это может быть критическим изменением, если ваш проигрыватель не может обработать вызов setVideoSurfaceHolder.
    • Исправлено распространение значений метаданных, отличных от String CharSequence, например строк со стилем span (#2853).
    • Добавьте CommandButton.executeAction, чтобы контроллеры могли проще запускать нужное действие. Также можно указать параметры для некоторых команд проигрывателя и сеанса, чтобы определить, какое действие следует запустить.
    • Добавьте обратную совместимость для экземпляров CommandButton, используя Player.Command или стандартный SessionCommand для определения их действия. Теперь они правильно представлены в медиасеансах платформы, например в системном интерфейсе или Android Auto.
    • Исправлена ошибка, из-за которой один и тот же Bitmap сжимался несколько раз при подключении MediaController к медиасеансу платформы.
  • Интерфейс:
    • Добавьте класс ProgressStateWithTickInterval и соответствующую composable-функцию rememberProgressStateWithTickInterval в модуль media3-ui-compose. Это хранилище состояния используется в demo-compose, чтобы показывать текущую позицию и продолжительность в текстовом формате.
    • Добавьте MuteButtonState в ui-compose, чтобы отключить звук Player. Это хранилище состояния используется в demo-compose для отображения переключателя включения/выключения звука.
    • Добавьте классы ProgressStateWithTickCount и соответствующую composable-функцию rememberProgressStateWithTickCount в модуль media3-ui-compose. Это хранилище состояния используется в demo-compose для отображения прогресса в виде горизонтального индикатора выполнения, доступного только для чтения.
    • Добавьте composable-функцию ContentFrame в media3-ui-compose, которая объединяет управление PlayerSurface с изменением соотношения сторон и закрытием затвора.
    • Устранена известная ошибка платформы API 34, из-за которой видео растягивалось или обрезалось при использовании SurfaceView внутри Compose AndroidView, что влияло на composable-функции ContentFrame и PlayerSurface с SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • Создайте новый модуль media3-ui-compose-material3 и добавьте в него composable-функции с темой Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton).
    • Добавьте composable-функцию TimeText в media3-ui-compose-material3, чтобы показывать прогресс игрока в текстовом формате. Его можно настроить так, чтобы он показывал текущую позицию, продолжительность или оставшееся время.
    • Добавьте поддержку размещения кнопки выбора маршрута медиаданных в PlayerView.
    • Используйте BidiFormatter, чтобы правильно отображать знаки препинания в субтитрах с направлением письма справа налево (#11214).
  • Расширение HLS:
    • Обработка атрибутов пропуска межстраничных объявлений HLS.
    • Сопоставьте атрибуты управления пропуском из плейлиста HLS и документа со списком объектов с AdPlaybackState для общего доступа.
    • Исправлена ошибка, из-за которой время начала плейлиста сбрасывалось, когда из плейлиста удалялся тег EXT-X-PROGRAM-START-DATE, определяющий время начала (#2760).
    • Используйте двоичный поиск, чтобы найти индекс сегмента для заданной позиции в плейлисте (#2826).
    • Добавьте HlsInterstitialsAdsLoader.skipCurrentAd() и skipCurrentAdGroup(), а также соответствующие методы, чтобы пропускать объявления и группы объявлений по индексу.
    • Добавьте HlsInterstitialsAdsLoader.Listener.onAdStarted, чтобы получать отчеты о начале рекламного периода (#2859).
    • В строках даты и времени ISO 8601 в качестве разделителя можно использовать пробел.
    • Исправлена ошибка, из-за которой не удавалось получить следующий фрагмент для HlsMediaPlaylist без сегментов (#2821).
    • Используйте позицию по умолчанию для рекламы в начале трансляции.
  • Расширение DASH:
    • Исправлена ошибка UnsupportedOperationException, возникавшая при воспроизведении потоков DASH с неиерархическим манифестом URI data: (#2688).
    • Сброс LiveConfiguration до значения, предоставленного MediaItem DashMediaSource при выпуске и когда пользователь обновляет мультимедийный объект (#2606).
    • Устранена проблема, из-за которой происходили сбои, вызванные недопустимыми обновлениями манифеста, которые не регистрировались как ошибки проигрывателя (#2805).
  • Расширение RTSP:
    • Обработка ошибки отсутствия пакетов RTP при обработке фрагментированных блоков NAL для H264 и H265 (#2613).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Расширение AV1. Программный декодер AV1 теперь использует высокопроизводительную библиотеку dav1d вместо предыдущей реализации libgav1, что повышает скорость декодирования.
    • Расширение FFmpeg. Исправлена ошибка, из-за которой не воспроизводились некоторые файлы FLAC. Теперь блок STREAMINFO правильно анализируется и передается декодеру (#2887).
  • Расширение Cast:
    • Добавьте CastPlayer.Builder, чтобы CastPlayer мог воспроизводить контент как локально, так и через Cast. Чтобы сохранить старое поведение CastPlayer, при котором поддерживается только воспроизведение Cast, можно использовать RemoteCastPlayer. Существующие конструкторы CastPlayer сохраняют прежнее поведение, но считаются устаревшими. Вместо них рекомендуется использовать конструкторы CastPlayer или RemoteCastPlayer.
    • Прекратить принудительное применение ненулевого MIME-типа в DefaultMediaItemConverter.
    • Используйте MediaItem.mediaMetadata.mediaType, чтобы определить, какой тип медиаконтента (MEDIA_TYPE) нужно использовать в DefaultCastOptionsProvider#toMediaQueueItem, если он доступен.
    • Включите передачу данных с удаленного устройства на локальное в DefaultCastOptionsProvider.
    • Добавьте поддержку Cast в демоверсию Session.
    • Добавьте поддержку кнопки маршрута медиа в интерфейсе Composable.
    • Добавьте поддержку кнопки выбора устройства воспроизведения на панели действий.
    • Добавьте поддержку показа кнопки передачи медиаконтента в виде View UI.
  • Инструменты для тестирования:
    • Добавьте максимальную разницу во времени для автоперехода в FakeClock. По умолчанию это значение равно 1 секунде, но его можно изменить с помощью FakeClock.Builder.
    • Добавьте максимальную разницу во времени между сообщениями для RobolectricUtil.runMainLooperUntil (и runLooperUntil). По умолчанию она составляет 1 секунду, но ее можно настроить с помощью новых перегрузок этих методов.
    • Перенесите CapturingRenderersFactory из кампании "test-utils" в кампанию "test-utils-robolectric".
  • Удалите устаревшие символы:
    • Удалите устаревший конструктор DefaultPreloadManager. Используйте вместо него DefaultPreloadManager.Builder.
    • Удалены устаревшие конструкторы EditedMediaItemSequence. Используйте вместо него EditedMediaItemSequence.Builder.
    • Удалить BitmapFactoryImageDecoder.BitmapDecoder Используйте вместо него ExternallyLoadedImageDecoder.
    • Удалите устаревший параметр ShadowMediaCodecConfig.forAllSupportedMimeTypes(). Используйте вместо него ShadowMediaCodecConfig.withAllDefaultSupportedCodecs().
    • Удалите устаревший элемент ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes(). Используйте вместо него ShadowMediaCodecConfig.withNoDefaultSupportedCodecs().

1.9.0-rc01

1 декабря 2025 г.

Используйте стабильную версию 1.9.0.

1.9.0-beta01

20 ноября 2025 г.

Используйте стабильную версию 1.9.0.

1.9.0-alpha01

22 октября 2025 г.

Используйте стабильную версию 1.9.0.

Версия 1.8.0

1.8.1

21 мая 2026 г.

Версия 1.8.1 содержит следующие коммиты.

  • Эффект:
    • Явно задайте GL_DRAW_BUFFER и GL_READ_BUFFER при переходе из контекста без поверхности.

Версия 1.8.0

30 июля 2025 г.

Версия 1.8.0 содержит эти коммиты.

  • Общая библиотека:
    • Добавлена поддержка замены проигрывателя в ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Добавлен метод получения для режима воспроизведения в случайном порядке в интерфейс ExoPlayer (#2522).
    • Теперь при попытке доступа к DefaultAudioSink из нескольких потоков будет выдаваться более понятное исключение. Если это происходит из-за вызова RendererCapabilities.getFormatSupport вне проигрывателя, убедитесь, что этот метод вызывается в том же потоке, что и поток воспроизведения ExoPlayer, или используйте экземпляр, отличный от того, который используется для воспроизведения (#1191).
    • Исправлена ошибка, из-за которой аудиоформаты, отличные от стерео, на телевизорах могли помечаться как неподдерживаемые в DefaultTrackSelector.
    • Убедитесь, что последний кадр правильно отображается при использовании флага DECODE_ONLY MediaCodec (который включен по умолчанию в режиме прокрутки).
    • Добавлена поддержка использования идентификатора виртуального устройства из Context, переданного в ExoPlayer.Builder.
    • Включить динамическое планирование по умолчанию в режиме прокрутки.
    • Избегайте ненужной перезагрузки источника при переходе к концу элемента.
    • Использовать MediaCodec.BUFFER_FLAG_DECODE_ONLY по умолчанию в режиме прокрутки.
    • Теперь при вызове метода IllegalStateException, когда PreloadMediaSource воспроизводится объектом ExoPlayer с потоком воспроизведения, отличным от потока предварительной загрузки, генерируется исключение (#2495).
    • Добавлен метод cloneAndMove в ShuffleMode с реализацией по умолчанию (#2226).
    • Измените режим работы по умолчанию для Renderer.getMinDurationToProgressUs, чтобы возвращалось большее значение, если вызов render не требуется.
    • Исправлена ошибка, из-за которой внутреннее планирование задерживало последний кадр при перемотке до конца в режиме паузы. Пока исправление ошибок действует, только если включен параметр ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled.
    • Добавьте метод ExoPlayer.setScrubbingModeEnabled(boolean). Это оптимизирует проигрыватель для частых перемоток (например, когда пользователь перетаскивает ползунок). Поведение режима прокрутки можно настроить с помощью setScrubbingModeParameters(..) в ExoPlayer и ExoPlayer.Builder.
    • Разрешить настройку допустимого отклонения при перемотке в режиме прокрутки.
    • Увеличьте рабочую частоту кодека в режиме прокрутки.
    • Исправлена ошибка, из-за которой могло не появляться сообщение об ошибке подготовки в контенте AdsMediaSource (#2337).
    • Устранена утечка памяти в MergingMediaSource, например при загрузке субтитров из неизвестного источника (#2338).
    • Разрешено возвращать null в CmcdConfiguration.Factory, чтобы отключать ведение журнала CMCD для определенных мультимедийных объектов (#2386).
    • Размер буфера изображений по умолчанию увеличен со 128 КБ (ошибка копирования и вставки из текстовых дорожек) до 26 МБ, чего достаточно для изображений Ultra HDR с разрешением 50 Мп (#2417).
    • Добавлен метод PreCacheHelper, который позволяет приложениям предварительно кешировать один медиафайл с указанной начальной позицией и продолжительностью.
    • Добавлена поддержка предварительной загрузки с указанной позиции в DefaultPreloadManager.
  • Трансформер:
    • Добавьте CodecDbLite, чтобы включить оптимизацию настроек кодирования видео для конкретного чипсета.
    • Чтобы включить оптимизацию настроек CodecDB Lite, добавьте флаг setEnableCodecDbLite в DefaultEncoderFactory. По умолчанию для этого параметра задано значение false.
    • Чтобы заполнить начальный пробел (добавленный с помощью addGap()) тишиной, теперь нужно явно задать experimentalSetForceAudioTrack(true) в EditedMediaItemSequence.Builder. Если пробел находится в середине последовательности, этот флаг не требуется.
    • Переместите интерфейс Muxer из media3-transformer в media3-muxer.
    • Чтобы импортировать мультимедийный объект как изображение, задайте для параметра MediaItem.Builder().setImageDuration(long) значение "Обязательно".
    • Добавьте Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean), который включает список изменений MP4 при обрезке, чтобы проигрыватели игнорировали фрагменты между ключевым кадром перед начальной точкой обрезки и начальной точкой обрезки.
    • Обновите приложение Composition Demo, чтобы использовать Kotlin и Jetpack Compose, и добавьте пользовательский VideoCompositorSettings, чтобы упорядочить последовательности в макете 2x2 или PiP.
  • Экстракторы:
    • Добавлена обработка метаданных из фрагментированных файлов MP4 (#2084).
    • JPEG: добавлена поддержка фото с движением, у которых нет сегмента Exif в начале (#2552).
    • Добавлена поддержка перемотки во фрагментированных файлах MP4 с несколькими атомами sidx. Это поведение можно включить с помощью флага FLAG_MERGE_FRAGMENTED_SIDX в FragmentedMp4Extractor (#9373).
    • Игнорирование пустых таблиц поиска в файлах FLAC (включая те, которые содержат только плейсхолдеры точек поиска) и возврат к двоичному поиску, если известна продолжительность файла (#2327).
    • Исправлен синтаксический анализ блоков SEI в H.265, чтобы полностью пропускать нераспознанные типы SEI (#2456).
    • Обновите WavExtractor, чтобы использовать данные SubFormat расширения заголовка для аудиоформата при синтаксическом анализе файла типа WAVE_FORMAT_EXTENSIBLE.
    • MP4: добавлена поддержка блоков ipcm и fpcm, определяющих необработанные аудиодорожки PCM (64-битная PCM с плавающей запятой не поддерживается).
    • MP4: обрабатывать часть матрицы преобразования tkhd, которая отвечает за поворот, если матрица поворачивает и отражает видео. Это гарантирует, что видео, снятые на фронтальную камеру iPhone, будут отображаться правильно, но с неправильным отражением по оси Y (#2012).
    • MP3: при переходе на поиск по постоянному битрейту из-за FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) используются длительность и размер данных из метаданных Xing, VBRI и других метаданных с переменным битрейтом, в которых поиск невозможен (#2194).
  • Аудио:
    • Исправлена ошибка, из-за которой метод AnalyticsListener.onAudioPositionAdvancing не вызывался, когда воспроизведение аудио начиналось незадолго до конца медиафайла.
    • Добавьте поддержку всех форматов выборки линейной ИКМ в ChannelMappingAudioProcessor и TrimmingAudioProcessor.
    • Добавлена поддержка пробелов в аудио для CompositionPlayer.
    • Удалите ложный вызов BaseAudioProcessor#flush() из BaseAudioProcessor#reset().
    • Разрешить постоянное повышающее/понижающее микширование мощности в DefaultAudioMixer.
    • Сделайте ChannelMappingAudioProcessor, TrimmingAudioProcessor и ToFloatPcmAudioProcessor общедоступными (#2339).
    • Используйте AudioTrack#getUnderrunCount() в AudioTrackPositionTracker, чтобы обнаруживать недовыполнение в DefaultAudioSink, а не полагаться на приблизительную оценку.
    • Улучшено сглаживание временных меток аудио при неожиданном смещении позиции на устройстве вывода звука.
    • Исправлена ошибка, из-за которой аудио и видео не синхронизировались в течение первых 10 секунд после возобновления воспроизведения при подключении к устройствам Bluetooth.
    • Исправлена ошибка, из-за которой AnalyticsListener.onAudioPositionAdvancing сообщал не время начала воспроизведения аудио, а время первого измерения.
    • Исправлена ошибка, из-за которой на некоторых устройствах не восстанавливалось многоканальное аудио после перехода на стерео (#2258).
  • Видео:
    • Обходное решение для отсоединенной поверхности теперь работает на устройствах Lenovo и Motorola (#2059).
    • Улучшено плавное воспроизведение кадров видео при запуске, когда аудиозаписи начинаются не точно с запрошенной позиции.
    • Расширен обходной путь для отсоединенной поверхности на устройствах realme (#2059).
    • Добавлен экспериментальный API ExoPlayer, позволяющий включать флаг MediaCodec.BUFFER_FLAG_DECODE_ONLY при постановке в очередь входных буферов, предназначенных только для декодирования. Этот флаг сообщает декодеру, что нужно пропустить буферы, предназначенные только для декодирования, что ускоряет поиск. Включите его с помощью DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Улучшена проверка производительности программных видеокодеков. В результате некоторые дополнительные треки могут быть помечены как EXCEEDS_CAPABILITIES.
    • Исправлены ошибки воспроизведения VP9 Widevine на некоторых устройствах (#2408).
  • Текст:
    • Добавлена поддержка дорожек VobSub в файлах MP4 (#2510).
    • Исправлена ошибка, из-за которой воспроизведение останавливалось, если сегмент субтитров сначала не загружался, а затем загружался успешно, после чего следовало несколько пустых сегментов субтитров (#2517).
    • Исправлена ошибка, из-за которой при включении субтитров в форматах SSA и SubRip не показывалась текущая реплика (#2309).
    • Исправлена ошибка, из-за которой воспроизведение зависало при переключении с трансляции с ошибкой субтитров на прямую трансляцию с пустой дорожкой субтитров (#2328).
    • Исправлена ошибка, из-за которой субтитры CEA-608 искажались при воспроизведении потоков H.262, содержащих B-кадры (#2372).
    • Добавлена поддержка субтитров SSA с CodecId = S_TEXT/SSA в файлах Matroska. Ранее MatroskaExtractor поддерживал только CodecId = S_TEXT/ASS, который представляет собой расширенный вариант (v4+) субтитров SubStation Alpha (но логика синтаксического анализа ExoPlayer одинакова для обоих вариантов) (#2384).
    • Добавлена поддержка свойства layer в файлах субтитров SubStation Alpha (SSA), которое используется для определения порядка наложения подсказок, когда на экране одновременно показывается несколько подсказок (#2124).
  • Метаданные:
    • Добавлена поддержка получения длительности медиаконтента и Timeline в MetadataRetriever, а также осуществлен переход на API AutoCloseable на основе экземпляров. Используйте новый Builder, чтобы создать экземпляр для MediaItem, а затем вызовите retrieveTrackGroups(), retrieveTimeline() и retrieveDurationUs(), чтобы получить ListenableFuture для метаданных. Предыдущие статические методы больше не поддерживаются (#2462).
  • Изображение:
    • Ограничьте декодированные растровые изображения размером экрана в BitmapFactoryImageDecoder, чтобы избежать сбоя приложения с ошибкой Canvas: trying to draw too large bitmap. из PlayerView при попытке отобразить очень большие изображения (например, 50 Мп).
    • Измените сигнатуру DefaultRenderersFactory.getImageDecoderFactory(), чтобы она принимала параметр Context.
    • Согласуйте максимальный размер выходного растрового изображения, используемый в CompositionPlayer, с размером, который уже используется в Transformer (это означает, что CompositionPlayer не учитывает размер экрана при декодировании растровых изображений, в отличие от ExoPlayer).
  • DRM:
    • Добавлена новая перегрузка OfflineLicenseHelper.newWidevineInstance, принимающая MediaItem.DrmConfiguration, чтобы заголовки HTTP-запросов применялись правильно (#2169).
  • Эффект:
    • Добавьте Presentation.createForShortSide(int), который создает Presentation, чтобы самая короткая сторона всегда соответствовала заданному значению независимо от ориентации входных данных.
  • Мультиплексоры:
    • Исправлена ошибка, из-за которой для аудиофрагментов во фрагментированных файлах MP4 не устанавливались правильные флаги.
    • В API writeSampleData() теперь используется класс BufferInfo, а не MediaCodec.BufferInfo.
    • Добавьте Muxer.Factory#supportsWritingNegativeTimestampsInEditList, значение по умолчанию – false.
  • Расширение IMA:
    • Исправлена ошибка, из-за которой ошибка загрузки в одном объявлении могла случайно сделать недействительной другую группу объявлений.
    • Исправлена ошибка, из-за которой группы объявлений после окончания окна видео по запросу останавливали воспроизведение. Группы объявлений, время начала которых выходит за пределы окна, больше не добавляются в очередь MediaPeriodQueue (#2215).
  • Сеанс:
    • Исправлена ошибка, из-за которой игнорировались подключения от сторонних непривилегированных контроллеров Media3.
    • Удалить проверку доступных команд при отправке специальных команд в устаревшую версию MediaBrowserServiceCompat. Это соответствует поведению устаревших контроллеров и браузеров при подключении к устаревшему приложению.
    • Исправлена ошибка, из-за которой первая ошибка воспроизведения у пользователя неправильно обрабатывалась как постоянное специальное исключение. Это не позволяет приложению восстановиться.
    • Исправлена ошибка, из-за которой некоторые изменения контроллера, не обрабатываемые сеансом, могли вызывать IllegalStateExceptions.
    • Исправлена ошибка, из-за которой действия контроллера, не обрабатываемые сеансом, могли привести к недопустимому состоянию контроллера.
    • Исправлено предупреждение о нарушении небезопасного запуска StrictMode (#2330).
    • Исправлена ошибка, из-за которой вызов setSessionExtras из основного потока при запуске проигрывателя из другого потока приложения приводил к IllegalStateException (#2265).
    • Уведомление не показывается автоматически, если в проигрывателе настроены мультимедийные объекты, но они не подготовлены и не воспроизводятся (#2423https://github.com/androidx/media/issues/2423). Это поведение можно настроить с помощью MediaSessionService.setShowNotificationForIdlePlayer.
    • Добавьте настраиваемый PlaybackException для всех или выбранных контроллеров.
    • Исправлена ошибка, из-за которой перемотка трансляции на устройстве MediaController могла привести к ошибке IllegalArgumentException.
    • Для прямых трансляций прекращена публикация позиции воспроизведения и возможности перемотки текущего элемента для контроллеров мультимедиа платформы, чтобы избежать артефактов позиционирования в интерфейсе Android Auto (и других контроллерах, использующих эту информацию из сеанса мультимедиа платформы) (#1758).
    • Исправлена ошибка, из-за которой передача значения null в getLibraryRoot объекта MediaBrowser, подключенного к устаревшему объекту MediaBrowserServiceCompat, приводила к ошибке NullPointerException.
    • Исправлена ошибка, из-за которой при отправке настраиваемых действий, результата поиска или запроса getItem приложение устаревшего сеанса аварийно завершало работу с ошибкой ClassNotFoundException.
    • Исправлена ошибка, из-за которой MediaItem.LocalConfiguration.uri передавался в MediaMetadata сеанса платформы. Чтобы намеренно поделиться URI и разрешить контроллерам повторно запрашивать медиаконтент, задайте MediaItem.RequestMetadata.mediaUri.
  • Интерфейс:
    • Исправлена ошибка, из-за которой PlayerSurface внутри повторно используемых компонентов, таких как LazyColumn, не работал должным образом (#2493).
    • Исправлена ошибка в Compose, из-за которой возникала задержка между установкой начального состояния кнопок и отслеживанием изменения состояния (например, формы значков или включения). Теперь учитываются любые изменения, внесенные в проигрыватель вне периода наблюдения (#2313).
    • Добавьте хранилища состояния и composable-функции в модуль media3-ui-compose для SeekBackButtonState и SeekForwardButtonState.
    • Добавлена поддержка режима перемотки ExoPlayer в PlayerControlView. Если этот параметр включен, то при перетаскивании ползунка проигрыватель переходит в режим перемотки, при каждом движении ползунка выполняется вызов player.seekTo, а когда пользователь убирает палец с экрана, режим перемотки отключается. Интеграцию можно включить с помощью атрибута time_bar_scrubbing_enabled = true в XML или метода setTimeBarScrubbingEnabled(boolean) в Java/Kotlin.
    • Сделайте так, чтобы PlayerSurface принимал аргумент Player, допускающий значение NULL.
  • Скачивания:
    • Добавлена поддержка частичного скачивания для прогрессивных потоков. Приложения могут подготовить прогрессивный поток с помощью DownloadHelper и запросить DownloadRequest у помощника, указав начальную и конечную позиции медиаконтента на основе времени, которые должно охватывать скачивание. Возвращенный объект DownloadRequest содержит диапазон байтов, с помощью которого можно создать объект ProgressiveDownloader и скачать контент.
    • Добавьте DownloadHelper.Factory, которым заменяются статические методы DownloadHelper.forMediaItem().
    • Добавьте Factory для реализаций SegmentDownloader.
    • Добавлена поддержка частичного скачивания для адаптивных потоков. Приложения могут подготовить адаптивный поток с помощью DownloadHelper и запросить DownloadRequest у помощника, указав временные позиции начала и конца медиафайла, которые должны быть охвачены скачиванием. Возвращенный объект DownloadRequest содержит разрешенный диапазон дат, с помощью которого можно создать конкретный объект SegmentDownloader и скачать соответствующий контент.
  • Расширение Cronet:
    • Добавлена автоматическая обработка файлов cookie (#5975).
  • Расширение HLS:
    • Исправлена ошибка, из-за которой HlsSampleStreamWrapper пытался выполнить поиск в буфере, когда в нем не было доступных фрагментов #2598.
    • Исправлена ошибка, из-за которой изменения в выборе трека после загрузки фрагментов с низкой задержкой и подсказки по предварительной загрузке могли привести к зависанию воспроизведения (#2299).
    • Предотвращение чрезмерного количества перезагрузок за счет ожидания половины целевой продолжительности, когда сервер не учитывает CAN-BLOCK-RELOAD=YES (#2317).
    • Исправлена ошибка, из-за которой воспроизведение останавливалось при запуске потока межстраничных объявлений перед рекламой в середине видео, а также при попытке разрешения списка объектов для неправильного объявления (#2558).
    • Исправлена обработка плейлистов, чтобы в значениях атрибутов в строках в кавычках принимался символ \f (перевод страницы) (#2420).
    • Добавлена поддержка обновления межстраничных объявлений с одинаковым идентификатором (#2427).
    • Исправлена ошибка, из-за которой ошибки загрузки плейлиста иногда не распространялись, когда в трансляции заканчивались сегменты для загрузки (#2401https://github.com/androidx/media/issues/2401).
    • Добавлена группировка субтитров по тегу NAME, аналогичная группировке аудио (#1666).
    • Поддержка X-ASSET-LIST и прямых трансляций с HlsInterstitialsAdsLoader.
  • Расширение DASH:
    • Исправлена ошибка, из-за которой набор для адаптации Trick Play объединялся с основным набором для адаптации, что приводило к созданию недопустимого элемента TrackGroup (#2148).
    • Исправлена ошибка, из-за которой сокращение периода DASH могло вызывать исключение, если образцы за пределами нового периода уже были прочитаны конвейером рендеринга (#2440).
    • Исправлена ошибка, из-за которой не выполнялась переадресация при использовании параметров запроса CMCD (#2475).
  • Расширение RTSP:
    • Добавлена поддержка пакета агрегации RTP для H265 в соответствии с RFC 7798#4.4.2 (#2413).
    • Исправлена ошибка RtspClient, из-за которой при обработке ответа HTTP 302 использовался URI местоположения (#2398).
    • Добавлена поддержка синтаксического анализа для SessionDescriptions, содержащих строки с конечными пробелами (#2357).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Исправлена ошибка, из-за которой метод DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange не работал для расширений декодера аудио (#2258).
  • Расширение Cast:
    • Добавлена поддержка setVolume() и getVolume() (#2279).
    • Предотвратите переход CastPlayer в состояние STATE_BUFFERING, когда временная шкала пуста.
    • Добавлена поддержка getDeviceVolume(), setDeviceVolume(), getDeviceMuted() и setDeviceMuted() (#2089).
  • Инструменты для тестирования:
    • Добавьте advance(player).untilPositionAtLeast и untilMediaItemIndex в TestPlayerRunHelper, чтобы продвинуть проигрыватель до достижения указанной позиции. В большинстве случаев эти методы более надежны, чем существующие методы untilPosition и untilStartOfMediaItem.
    • Переместите модуль FakeDownloader в модуль test-utils-robolectric, чтобы использовать его в других тестах.
    • Удалены следующие элементы: transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...) и transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). Вместо этого используйте ShadowMediaCodecConfig для настройки теневых кодировщиков и декодеров.
    • Префикс exotest в названиях кодеков, которые сообщает ShadowMediaCodecConfig, заменен на media3.
  • Удалите устаревшие символы:
    • Удален устаревший конструктор SegmentDownloader SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) и соответствующие конструкторы в его подклассах DashDownloader, HlsDownloader и SsDownloader.
    • Удалены устаревшие Player.hasNext(), Player.hasNextWindow(). Используйте вместо него Player.hasNextMediaItem().
    • Удален устаревший метод Player.next(). Используйте вместо него Player.seekToNextMediaItem().
    • Удален устаревший метод Player.seekToPreviousWindow(). Используйте вместо него Player.seekToPreviousMediaItem().
    • Удален устаревший метод Player.seekToNextWindow(). Используйте вместо него Player.seekToNextMediaItem().
    • Удален устаревший метод BaseAudioProcessor в модуле exoplayer. Используйте BaseAudioProcessor в модуле common.
    • Удалите устаревший конструктор MediaCodecVideoRenderer. MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)

Версия 1.8.0-rc02

24 июля 2025 г.

Используйте стабильную версию 1.8.0.

Версия 1.8.0-rc01

16 июля 2025 г.

Используйте стабильную версию 1.8.0.

Версия 1.8.0-beta01

2 июля 2025 г.

Используйте стабильную версию 1.8.0.

Версия 1.8.0-alpha01

19 мая 2025 г.

Используйте стабильную версию 1.8.0.

Версия 1.7.0

Версия 1.7.1

16 мая 2025 г.

Код этой версии совпадает с кодом версии 1.6.1. Она выпущена, чтобы считаться более новой, чем версия 1.7.0, которая была альфа-версией, случайно помеченной как стабильная (см. ниже).

Версия 1.7.0

16 мая 2025 г.

Этот выпуск должен был иметь версию 1.7.0-alpha01, но был случайно помечен как 1.7.0 (стабильная версия) на сайте maven.google.com. Не используйте его. Останьтесь на версии 1.6.1 или обновитесь до 1.7.1 (в ней используется тот же код, что и в 1.6.1).

Версия 1.6.0

1.6.1

14 апреля 2025 г.

Данные "androidx.media3:media3-*:1.6.1" опубликованы. Версия 1.6.1 содержит эти коммиты.

  • Общая библиотека:
    • Добавлен метод PlaybackParameters.withPitch(float), позволяющий легко копировать PlaybackParameters с новым значением pitch (#2257).
  • ExoPlayer:
    • Исправлена ошибка, из-за которой не удавалось перейти к следующему мультимедийному объекту из-за устранимой ошибки рендеринга при его инициализации (#2229).
    • Исправлена ошибка, из-за которой ProgressiveMediaPeriod выдает IllegalStateException, когда PreloadMediaSource пытается вызвать getBufferedDurationUs() до того, как он будет подготовлен (#2315).
    • Исправлена ошибка, из-за которой в запросах манифеста для DASH, HLS и SmoothStreaming отправлялся параметр CmcdData (#2253).
    • Убедитесь, что AdPlaybackState.withAdDurationsUs(long[][]) можно использовать после удаления групп объявлений. Пользователю по-прежнему нужно передавать массив длительностей для удаленных групп объявлений, который может быть пустым или иметь значение null (#2267).
  • Экстракторы:
    • MP4: извлекайте alternate_group из поля tkhd и представляйте как запись Mp4AlternateGroupData в Format.metadata каждой дорожки (#2242).
  • Аудио:
    • Исправлена ошибка, из-за которой при воспроизведении плейлиста с короткими видео могла зависать позиция (#1920).
  • Сеанс:
    • Уменьшено время ожидания агрегирования для обратных вызовов платформы MediaSession с 500 до 100 миллисекунд и добавлен экспериментальный метод установки, позволяющий приложениям настраивать это значение.
    • Исправлена ошибка, из-за которой уведомления появлялись снова после того, как пользователь их закрыл (#2302).
    • Исправлена ошибка, из-за которой сеанс возвращал временную шкалу с одним элементом, когда упакованный проигрыватель на самом деле был пуст. Это происходило, когда у обернутого проигрывателя не было доступного COMMAND_GET_TIMELINE, но было доступно COMMAND_GET_CURRENT_MEDIA_ITEM, а сам проигрыватель был пустым (#2320).
    • Исправлена ошибка, из-за которой вызов MediaSessionService.setMediaNotificationProvider игнорировался без уведомления после других взаимодействий с сервисом, например setForegroundServiceTimeoutMs (#2305).
  • Интерфейс:
    • Включите PlayerSurface, чтобы работать с ExoPlayer.setVideoEffects и CompositionPlayer.
    • Исправлена ошибка, из-за которой PlayerSurface не удавалось перекомпоновать с новым Player.
  • Расширение HLS:
    • Исправлена ошибка, из-за которой в CmcdData не задавалась длительность фрагмента для медиаконтента HLS, что приводило к сбою утверждения при обработке зашифрованных медиасегментов (#2312).
  • Расширение RTSP:
    • Добавлена поддержка URI со схемой RTSPT, чтобы можно было настроить сеанс RTSP для использования TCP (#1484).
  • Расширение Cast:
    • Добавлена поддержка метаданных плейлистов (#2235).

1.6.0

26 марта 2025 г.

Данные "androidx.media3:media3-*:1.6.0" опубликованы. Версия 1.6.0 содержит эти коммиты.

  • Общая библиотека:
    • Добавьте AudioManagerCompat и AudioFocusRequestCompat, чтобы заменить эквивалентные классы в androidx.media.
    • Обновите Kotlin с версии 1.9.20 до 2.0.20 и используйте плагин Compose Compiler Gradle. Библиотека KotlinX Coroutines обновлена с версии 1.8.1 до 1.9.0.
    • Удалите метод Format.toBundle(boolean excludeMetadata) и используйте вместо него Format.toBundle().
    • Исправлена ошибка в SimpleBasePlayer, из-за которой при установке нового currentMediaItemIndex в State после setPlaylist с null MediaMetadata не выполнялась повторная оценка метаданных (#1940).
    • Уровень доступа SimpleBasePlayer.State изменен с защищенного на общедоступный, чтобы упростить обработку обновлений в других классах (#2128).
  • ExoPlayer:
    • Добавьте MediaExtractorCompat – новый класс, который предоставляет функции, эквивалентные платформе MediaExtractor.
    • Добавлена экспериментальная поддержка предварительного прогрева ExoPlayer для воспроизведения с помощью MediaCodecVideoRenderer. Вы можете настроить DefaultRenderersFactory через experimentalSetEnableMediaCodecVideoRendererPrewarming, чтобы предоставить дополнительный MediaCodecVideoRenderer для ExoPlayer. Если этот параметр включен, ExoPlayer предварительно обрабатывает видео последовательных мультимедийных объектов во время воспроизведения, чтобы уменьшить задержку перехода между ними.
    • Уменьшите значения по умолчанию для bufferForPlaybackMs и bufferForPlaybackAfterRebufferMs в DefaultLoadControl до 1000 и 2000 мс соответственно.
    • Инициализируйте DeviceInfo и громкость устройства асинхронно (если включено с помощью setDeviceVolumeControlEnabled). Эти значения недоступны сразу после ExoPlayer.Builder.build(), а Player.Listener уведомляет об изменениях через onDeviceInfoChanged и onDeviceVolumeChanged.
    • Идентификатор начального аудиосеанса больше не доступен сразу после создания проигрывателя. При необходимости вы можете использовать AnalyticsListener.onAudioSessionIdChanged, чтобы прослушать первоначальное обновление.
    • При выборе видеодорожки учитывайте язык. По умолчанию выбирается основная видеодорожка, которая соответствует языку выбранной аудиодорожки (если доступна). Явные языковые настройки для видео можно задать с помощью атрибута TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Добавьте параметр selectedAudioLanguage в метод DefaultTrackSelector.selectVideoTrack().
    • Добавьте параметр retryCount в методы MediaSourceEventListener.onLoadStarted и соответствующие методы MediaSourceEventListener.EventDispatcher.
    • Исправлена ошибка, из-за которой элементы плейлиста или периоды в многопериодных потоках DASH с длительностью, не соответствующей фактическому контенту, могли вызывать зависание кадров в конце элемента (#1698).
    • Переместить BasePreloadManager.Listener на верхний уровень PreloadManagerListener.
    • RenderersFactory.createSecondaryRenderer можно использовать для предоставления дополнительных средств отрисовки для предварительного прогрева. Предварительный прогрев позволяет быстрее переключаться между мультимедийными объектами во время воспроизведения.
    • Включена отправка CmcdData для запросов манифестов в форматах адаптивной потоковой передачи DASH, HLS и SmoothStreaming (#1951).
    • Добавьте MediaCodecInfo кодека, который будет инициализирован в MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Измените AdsMediaSource, чтобы разрешить рост AdPlaybackStates за счет добавления групп объявлений. Недопустимые изменения обнаруживаются и вызывают исключение.
    • Исправлена ошибка, из-за которой при переходе к контенту после рекламы в середине видео могли быстро показываться дополнительные кадры, предназначенные только для декодирования.
    • Сделайте так, чтобы DefaultRenderersFactory добавлял два экземпляра MetadataRenderer. Это позволит приложениям по умолчанию получать метаданные двух разных схем.
    • Повторно оценивать, нужно ли отменять текущую загрузку фрагмента, когда воспроизведение приостановлено (#1785).
    • Добавьте параметр в ClippingMediaSource, чтобы разрешить обрезку в медиафайлах без возможности перемотки.
    • Исправлена ошибка, из-за которой перемотка с предварительным прогревом могла блокировать переход к следующему мультимедийному объекту.
    • Исправлена ошибка, из-за которой ExoPlayer.isLoading() оставалось true, когда оно переходило в STATE_IDLE или STATE_ENDED (#2133).
    • Добавьте lastRebufferRealtimeMs в LoadControl.Parameter (#2113).
  • Трансформер:
    • Добавьте поддержку трансмультиплексирования в альтернативные обратно совместимые форматы.
    • Добавлена поддержка транскодирования и трансмультиплексирования формата Dolby Vision (профиль 8).
    • Обновите параметры VideoFrameProcessor.registerInputStream и VideoFrameProcessor.Listener.onInputStreamRegistered, чтобы использовать Format.
    • Создание статических метаданных HDR при использовании DefaultEncoderFactory.
    • Включите поддержку диагностики платформы Android с помощью MediaMetricsManager. Transformer передает платформе события редактирования и данные об эффективности, что позволяет получать сведения о производительности системы и сведения для отладки на устройстве. Google также может собирать эти данные, если пользователь устройства разрешил отправку данных об использовании и диагностике. Приложения могут отказаться от передачи данных для диагностики платформы в Transformer с помощью Transformer.Builder.setUsePlatformDiagnostics(false).
    • Разделите InAppMuxer на InAppMp4Muxer и InAppFragmentedMp4Muxer. InAppMp4Muxer используется для создания нефрагментированного файла MP4, а InAppFragmentedMp4Muxer – для создания фрагментированного файла MP4.
    • Переместите интерфейс Muxer из media3-muxer в media3-transformer.
    • Добавьте MediaProjectionAssetLoader, который предоставляет медиафайлы из MediaProjection для записи экрана, и добавьте поддержку записи экрана в демо-приложение Transformer.
    • Добавьте #getInputFormat() в интерфейс Codec.
    • По возможности переложите ответственность за освобождение GlObjectsProvider на вызывающий объект в DefaultVideoFrameProcessor и DefaultVideoCompositor.
  • Экстракторы:
    • AVI: исправлена обработка файлов со сжатым аудио с постоянным битрейтом, в которых в заголовке потока хранится количество байтов, а не фрагментов.
    • Исправлена обработка блоков NAL, длина которых выражена в 1 или 2 байтах (а не в 4).
    • Исправлена ошибка ArrayIndexOutOfBoundsException в монтажных листах MP4, когда монтажный лист начинается с несинхронизированного кадра без предшествующего синхронизированного кадра (#2062).
    • Исправлена ошибка, из-за которой потоки TS могли зависать на некоторых устройствах (#2069).
    • FLAC: добавлена поддержка 32-битных файлов FLAC. Ранее при попытке воспроизвести их возникала ошибка IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Аудио:
    • Исправлена ошибка, из-за которой метод onAudioPositionAdvancing вызывался при приостановке воспроизведения, а не при его возобновлении.
    • Не обходить SonicAudioProcessor, если SpeedChangingAudioProcessor настроен с параметрами по умолчанию.
    • Исправлена ошибка, из-за которой в Sonic#getOutputSize() возникало отрицательное переполнение, что могло привести к остановке DefaultAudioSink.
    • Исправьте MediaCodecAudioRenderer.getDurationToProgressUs() и DecoderAudioRenderer.getDurationToProgressUs(), чтобы при перемотке правильно сбрасывалась указанная продолжительность.
    • Сделайте androidx.media3.common.audio.SonicAudioProcessor окончательным.
    • Добавлена поддержка float PCM для ChannelMappingAudioProcessor и TrimmingAudioProcessor.
  • Видео:
    • Измените MediaCodecVideoRenderer.shouldUsePlaceholderSurface на защищенный, чтобы приложения могли переопределять его для блокировки использования поверхностей-плейсхолдеров (#1905).
    • Добавлен экспериментальный синтаксический анализ зависимостей образцов ExoPlayer AV1 для ускорения поиска. Включите ее с помощью нового API DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies.
    • Добавлен экспериментальный API ExoPlayer, который позволяет удалять неиспользуемые входные буферы декодера MediaCodecVideoRenderer. Включите ее с помощью DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Исправлена ошибка, из-за которой проигрыватель без поверхности сразу переходил в состояние готовности и очень медленно декодировал ожидающие кадры (#1973).
    • Исключены устройства Xiaomi и OPPO из режима отсоединенной поверхности, чтобы избежать мерцания экрана (#2059).
  • Текст:
    • Добавлена поддержка субтитров VobSub (#8260).
    • Прекращена упреждающая загрузка всех файлов субтитров, настроенных с помощью MediaItem.Builder.setSubtitleConfigurations. Теперь загружается только один файл, если он выбран в настройках дорожки (#1721).
    • TTML: добавлена поддержка ссылок на tts:origin и tts:extent с помощью style (#2953).
    • Временные метки в файлах WebVTT и SubRip должны содержать ровно три десятичных знака. Ранее мы неправильно анализировали любое количество десятичных знаков, но всегда предполагали, что значение указано в миллисекундах, что приводило к неверным временным меткам (#1997).
    • Исправлена ошибка, из-за которой воспроизведение зависало, если в плейлисте были обрезанные элементы с субтитрами CEA-608 или CEA-708.
    • Исправлена ошибка IllegalStateException, возникавшая, когда файл SSA содержал подсказку с нулевой продолжительностью (время начала и окончания совпадало) (#2052).
    • Исправлена ошибка, из-за которой при синтаксическом анализе субтитров, мультиплексированных в один контейнер с аудио и видео, не подавлялись и не регистрировались ошибки (#2052).
    • Исправлена обработка многобайтовых символов UTF-8 в файлах WebVTT с использованием символов CR в конце строки (#2167).
  • DRM:
    • Исправлена ошибка MediaCodec$CryptoException: Operation not supported in this configuration, возникавшая при воспроизведении контента ClearKey на устройствах с API < 27 (#1732).
  • Эффект:
    • Функции OverlaySettings перенесены в StaticOverlaySettings. На основе OverlaySettings можно создать подкласс, чтобы динамически настраивать оверлей.
  • Мультиплексоры:
    • MuxerException перемещен из интерфейса Muxer, чтобы избежать слишком длинного полного имени.
    • Метод setSampleCopyEnabled() переименован в setSampleCopyingEnabled() в Mp4Muxer.Builder и FragmentedMp4Muxer.Builder.
    • Mp4Muxer.addTrack() и FragmentedMp4Muxer.addTrack() теперь возвращают идентификатор трека int вместо TrackToken.
    • Mp4Muxer и FragmentedMp4Muxer больше не реализуют интерфейс Muxer.
    • Отключить по умолчанию пакетную обработку и копирование образцов Mp4Muxer.
    • Исправлена ошибка в FragmentedMp4Muxer, из-за которой при записи только аудиодорожки создавалось много фрагментов.
  • Сеанс:
    • Сохранять состояние активной службы в течение дополнительных 10 минут, когда воспроизведение приостановлено, остановлено или произошел сбой. Это позволяет пользователям возобновлять воспроизведение в течение этого времени ожидания, не рискуя столкнуться с ограничениями активных служб на различных устройствах. Обратите внимание, что вызов player.pause() больше не может использоваться для остановки активной службы до stopSelf(). При переопределении onTaskRemoved используйте MediaSessionService.pauseAllPlayersAndStopSelf().
    • Уведомление остается видимым, когда воспроизведение останавливается или возникает ошибка. Уведомление удаляется, только если очистить плейлист или закрыть проигрыватель.
    • Улучшена обработка действий ACTION_PLAY и ACTION_PAUSE в MediaSession на платформе Android. Теперь в соответствии с доступными командами устанавливается только одно из них. Также принимается ситуация, когда установлено только одно из этих действий.
    • Добавьте Context в качестве параметра в MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Исправлена ошибка, из-за которой вызов метода Player для объекта MediaController, подключенного к устаревшему сеансу, приводил к потере изменений из ожидающего обновления.
    • Добавлена поддержка нулевых значений для MediaSession.setSessionActivity(PendingIntent) (#2109).
    • Исправлена ошибка, из-за которой устаревшее уведомление оставалось видимым после очистки плейлиста (#2211).
  • Интерфейс:
    • Добавьте хранилища состояния и composable-функции в модуль media3-ui-compose для PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState и PlaybackSpeedState.
  • Скачивания:
    • Исправлена ошибка в CacheWriter, из-за которой источники данных оставались открытыми, а области кеша – заблокированными, если источник данных выдавал ошибку Exception, отличную от IOException (#9760).
  • Расширение HLS:
    • Добавьте первую версию HlsInterstitialsAdsLoader. Загрузчик объявлений считывает межстраничные объявления HLS из плейлиста медиаконтента HLS и сопоставляет их с объектом AdPlaybackState, который передается в AdsMediaSource. В первой версии поддерживаются только видео по запросу, передаваемые по протоколу HLS и имеющие атрибуты X-ASSET-URI.
    • Добавьте HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Приложения могут использовать его для создания экземпляров AdsMediaSource, которые используют HlsInterstitialsAdsLoader удобным и безопасным способом.
    • Добавлена обработка тега SUPPLEMENTAL-CODECS из плейлиста HLS для обнаружения форматов Dolby Vision (#1785).
    • Смягчено условие для поиска позиций синхронизации в потоке HLS (#2209).
  • Расширение DASH:
    • Добавлена поддержка формата AC-4 Level-4 для DASH (#1898).
    • Исправлена ошибка, возникавшая при расчете интервала обновления для вставки объявлений в прямые трансляции с несколькими периодами (#1698).
    • Добавлена обработка атрибута scte214:supplementalCodecs из манифеста DASH для обнаружения форматов Dolby Vision (#1785).
    • Улучшена обработка переходов между периодами в прямых трансляциях, когда период содержит медиафрагменты, выходящие за пределы заявленной длительности периода (#1698).
    • Исправлена ошибка, из-за которой наборы адаптации, помеченные как adaptation-set-switching, но с разными языками или флагами ролей, объединялись (#2222).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Добавлен модуль декодера MPEG-H, который использует встроенный декодер MPEG-H для декодирования аудио MPEG-H (#1826).
  • Расширение MIDI:
    • Добавьте экземпляры AudioSink и AudioRendererEventListener в MidiRenderer.
  • Расширение Cast:
    • Зависимость play-services-cast-framework обновлена до версии 21.5.0, чтобы устранить сбой FLAG_MUTABLE в приложениях, предназначенных для API 34 и более поздних версий, на устройствах, где сервисы Google Play установлены, но отключены (#2178).
  • Демонстрационное приложение:
    • Добавьте дополнительные кнопки в demo-compose и улучшите интеграцию с PlayerSurface, добавив поддержку масштабирования и затвора.
  • Удалите устаревшие символы:
    • Удалите устаревший метод AudioMixer.create(). Используйте вместо него DefaultAudioMixer.Factory().create().
    • Удалите следующие устаревшие методы Transformer.Builder:
      • setTransformationRequest(), используйте вместо него правила setAudioMimeType(), setVideoMimeType() и setHdrMode().
      • setAudioProcessors(), задайте аудиопроцессор в EditedMediaItem.Builder.setEffects() и передайте его в Transformer.start().
      • setVideoEffects(), задайте видеоэффект в EditedMediaItem.Builder.setEffects() и передайте его в Transformer.start().
      • setRemoveAudio(), используйте EditedMediaItem.Builder.setRemoveAudio(), чтобы удалить аудио из EditedMediaItem, переданного в Transformer.start().
      • setRemoveVideo(), используйте EditedMediaItem.Builder.setRemoveVideo(), чтобы удалить видео из EditedMediaItem, переданного в Transformer.start().
      • setFlattenForSlowMotion(), используйте EditedMediaItem.Builder.setFlattenForSlowMotion(), чтобы выровнять EditedMediaItem, переданный в Transformer.start().
      • setListener(), используйте вместо него addListener(), removeListener() или removeAllListeners().
    • Удалите следующие устаревшие методы Transformer.Listener:
      • onTransformationCompleted(MediaItem), используйте вместо него onCompleted(Composition, ExportResult).
      • onTransformationCompleted(MediaItem, TransformationResult), используйте вместо него onCompleted(Composition, ExportResult).
      • onTransformationError(MediaItem, Exception), используйте вместо него onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationException), используйте вместо него onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationResult, TransformationException), используйте onError(Composition, ExportResult, ExportException).
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), используйте onFallbackApplied(Composition, TransformationRequest, TransformationRequest).
    • Удалите устаревший класс TransformationResult. Используйте вместо него ExportResult.
    • Удалите устаревший класс TransformationException. Используйте вместо него ExportException.
    • Удалите устаревший параметр Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Используйте вместо него Transformer.PROGRESS_STATE_NOT_STARTED.
    • Удалите устаревший параметр Transformer.setListener(). Используйте Transformer.addListener(), Transformer.removeListener() или Transformer.removeAllListeners().
    • Удалите устаревший параметр Transformer.startTransformation(). Используйте вместо него Transformer.start(MediaItem, String).
    • Удалите устаревший параметр SingleFrameGlShaderProgram. Используйте вместо него BaseGlShaderProgram.
    • Удалить Transformer.flattenForSlowMotion Используйте вместо него EditedMediaItem.flattenForSlowMotion.
    • Удалены следующие элементы: ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent и ExoPlayer.DeviceComponent.
    • Контакт (androidx.media3.exoplayer.audio.SonicAudioProcessor) удален.
    • Удалены следующие устаревшие методы DownloadHelper:
      • Конструктор DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), используйте вместо него DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • getRendererCapabilities(RenderersFactory), эквивалентную функциональность можно получить, создав DefaultRendererCapabilitiesList с RenderersFactory и вызвав DefaultRendererCapabilitiesList.getRendererCapabilities().
      • Удален метод PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). Используйте PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) и передавайте (MediaSession.Token) compatToken.getToken().

1.6.0-rc02

19 марта 2025 г.

Используйте стабильную версию 1.6.0.

1.6.0-rc01

12 марта 2025 г.

Используйте стабильную версию 1.6.0.

1.6.0-beta01

26 февраля 2025 г.

Используйте стабильную версию 1.6.0.

Версия 1.6.0-alpha03

6 февраля 2025 г.

Используйте стабильную версию 1.6.0.

Версия 1.6.0-alpha02

30 января 2025 г.

Используйте стабильную версию 1.6.0.

Версия 1.6.0-alpha01

20 декабря 2024 г.

Используйте стабильную версию 1.6.0.

Версия 1.5

Версия 1.5.1

19 декабря 2024 г.

Данные "androidx.media3:media3-*:1.5.1" опубликованы. Версия 1.5.1 содержит эти коммиты.

  • ExoPlayer:
    • Отключено использование асинхронной расшифровки в MediaCodec, чтобы избежать проблем с тайм-аутом кодека при работе с этим API платформы (#1641).
  • Экстракторы:
    • MP3: исправлена ошибка, из-за которой воспроизведение останавливалось раньше времени, если оглавление фрейма VBRI не охватывало все данные MP3 в файле (#1904).
  • Видео:
    • Откат использования MediaCodecAdapter предоставленных значений соотношения сторон пикселя при обработке onOutputFormatChanged (#1371).
  • Текст:
    • Исправлена ошибка в ReplacingCuesResolver.discardCuesBeforeTimeUs, из-за которой реплика, активная в timeUs (началась раньше, но ещё не закончилась), неправильно отбрасывалась (#1939).
  • Метаданные:
    • Извлечение номеров дисков/треков и жанров из комментариев Vorbis в MediaMetadata (#1958).

Версия 1.5.0

27 ноября 2024 г.

Данные "androidx.media3:media3-*:1.5.0" опубликованы. Версия 1.5.0 содержит эти коммиты.

  • Общая библиотека:
    • Добавлен класс ForwardingSimpleBasePlayer, который позволяет перенаправлять данные другому проигрывателю с небольшими корректировками, обеспечивая при этом полную согласованность и обработку слушателей (#1183).
    • Замените метод SimpleBasePlayer.State.playlist на getPlaylist().
    • Добавьте переопределение для SimpleBasePlayer.State.Builder.setPlaylist(), чтобы напрямую указать Timeline и текущие Tracks и Metadata вместо создания структуры плейлиста.
    • Увеличьте значение minSdk до 21 (Android Lollipop). Это соответствует всем другим библиотекам AndroidX.
    • Добавьте артефакт androidx.media3:media3-common-ktx, который предоставляет функции Kotlin, созданные на основе общей библиотеки.
    • Добавьте функцию приостановки расширения Player.listen, чтобы запустить сопрограмму для прослушивания Player.Events в библиотеке media3-common-ktx.
    • Удалите аннотации @DoNotInline из внутренних классов, которые были вручную вынесены за пределы внешних классов, чтобы избежать ошибок проверки классов во время выполнения. Последние версии R8 теперь автоматически выносят такие вызовы, чтобы избежать сбоев во время выполнения (поэтому выносить их вручную больше не требуется). Все пользователи Gradle, работающие с библиотекой, уже должны использовать версию плагина Android Gradle, которая использует версию R8, выполняющую это действие, в связи с compileSdk = 35. Пользователям библиотеки, которые не работают с Gradle, нужно убедиться, что на этапе сжатия и обфускации, эквивалентном R8, выполняется аналогичный автоматический процесс вынесения за пределы строки. Это позволит избежать ошибок проверки классов во время выполнения. Это изменение уже было внесено в другие библиотеки AndroidX.
  • ExoPlayer:
    • Теперь MediaCodecRenderer.onProcessedStreamChange() можно вызывать для каждого мультимедийного объекта. Ранее он не вызывался для первого. Чтобы включить эту функцию, используйте MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart().
    • Добавьте PreloadMediaSource.PreloadControl.onPreloadError, чтобы разрешить реализациям PreloadMediaSource.PreloadControl выполнять действия при возникновении ошибки.
    • Добавьте BasePreloadManager.Listener, чтобы передавать события предзагрузки в приложения.
    • Добавлена возможность изменять время ожидания клиента SNTP и повторно запрашивать альтернативные адреса по истечении времени ожидания (#1540).
    • Удалите MediaCodecAdapter.Configuration.flags, так как значение поля всегда было равно нулю.
    • Разрешить пользователю выбирать встроенный динамик для воспроизведения на Wear OS API 35+ (если устройство поддерживает эту функцию).
    • Отложите блокирующий вызов Context.getSystemService(Context.AUDIO_SERVICE) до тех пор, пока не будет включена обработка фокуса воспроизведения аудио. Это гарантирует, что блокирующий вызов не будет выполнен, если обработка аудиофокуса не включена (#1616).
    • Разрешено воспроизведение независимо от длительности буферизации при сбое загрузки (#1571).
    • Добавьте AnalyticsListener.onRendererReadyChanged(), чтобы получать сигнал, когда отдельные средства визуализации готовы к воспроизведению.
    • Исправлена ошибка, из-за которой MediaCodec.CryptoException иногда сообщал о непредвиденной ошибке выполнения, когда MediaCodec работал в асинхронном режиме (режим работы по умолчанию в API 31 и более поздних версиях).
    • Передавайте bufferedDurationUs вместо bufferedPositionUs с помощью PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Также изменяет DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS на DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS. После этого приложения должны передавать значение, представляющее определенную продолжительность от позиции начала по умолчанию, для которой соответствующий источник мультимедиа должен быть предварительно загружен с помощью этого IntDef, вместо позиции.
    • Добавлена реализация ForwardingRenderer, которая перенаправляет все вызовы методов другому средству визуализации (1703).
    • Добавьте предварительную загрузку следующего элемента в плейлисте. Приложения могут включить предзагрузку, вызвав метод ExoPlayer.setPreloadConfiguration(PreloadConfiguration). По умолчанию предзагрузка отключена. При включении и чтобы не мешать воспроизведению, DefaultLoadControl ограничивает предзагрузку, запуская и продолжая ее только тогда, когда проигрыватель не загружает контент для воспроизведения. Приложения могут менять это поведение, реализуя LoadControl.shouldContinuePreloading() соответствующим образом (например, переопределяя этот метод в DefaultLoadControl). Реализация LoadControl по умолчанию отключает предзагрузку, если приложение использует пользовательскую реализацию LoadControl.
    • Добавлен метод MediaSourceEventListener.EventDispatcher.dispatchEvent(), позволяющий вызывать события прослушивателей подклассов (1736).
    • Добавьте DefaultPreloadManager.Builder, который создает экземпляры DefaultPreloadManager и ExoPlayer с согласованными общими конфигурациями.
    • Удалите параметр Renderer[] из LoadControl.onTracksSelected(), так как реализация DefaultLoadControl может получать типы потоков из ExoTrackSelection[].
    • Метод DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) объявлен устаревшим и помечен как окончательный, чтобы предотвратить переопределения. Вместо него следует использовать новый тип DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Регистрировать события MediaSourceEventListener из дополнительных источников в MergingMediaSource. В результате для субтитров, загруженных из неизвестного источника (добавленных с помощью MediaItem.LocalConfiguration.subtitleConfigurations), будут регистрироваться события начала, ошибки, отмены и завершения загрузки. Они могут выглядеть как дублирующиеся события загрузки, отправленные из AnalyticsListener.
    • Предотвращение полной остановки воспроизведения из-за ошибок в субтитрах и метаданных. Вместо этого проблемный трек отключается, а воспроизведение остальных продолжается (#1722).
      • При новой обработке субтитров (во время извлечения) связанные ошибки синтаксического анализа (например, недопустимые данные субтитров) и загрузки (например, HTTP 404) передаются через обратные вызовы onLoadError.
      • При устаревшей обработке субтитров (во время рендеринга) через обратные вызовы onLoadError передаются только связанные ошибки загрузки, а ошибки синтаксического анализа игнорируются (это поведение по умолчанию).
    • Исправлена ошибка, из-за которой элементы плейлиста или периоды в многопериодных потоках DASH с длительностью, не соответствующей фактическому контенту, могли вызывать зависание кадров в конце элемента (#1698).
    • Добавлен метод setter в SntpClient, позволяющий задать максимальное время, прошедшее с момента последнего обновления, по истечении которого клиент инициализируется повторно (#1794).
  • Трансформер:
    • Добавлен класс SurfaceAssetLoader, который поддерживает постановку видеоданных в очередь для Transformer с помощью Surface.
    • ImageAssetLoader сообщает о неподдерживаемых входных данных через AssetLoader.onError, а не выдает IllegalStateException.
    • Сделайте так, чтобы при экспорте изображений нужно было обязательно задавать их длительность с помощью MediaItem.Builder.setImageDurationMs.
    • Добавлена поддержка экспорта для пробелов в последовательностях аудио EditedMediaItems.
  • Выбор дорожки:
    • DefaultTrackSelector: если другие факторы равны, отдавайте предпочтение объектно-ориентированному аудио, а не канальному.
  • Экстракторы:
    • Разрешить Mp4Extractor и FragmentedMp4Extractor идентифицировать образцы H264, которые не используются в качестве цифровых отпечатков для последующих образцов.
    • Добавьте параметр, чтобы включить поиск на основе индекса в AmrExtractor.
    • Файлы MP3, в которых между действительными кадрами более 128 КБ, считаются усеченными, а не недействительными. Это означает, что воспроизведение файлов, в конце которых есть данные, не относящиеся к MP3, и нет метаданных, указывающих на длину байтов MP3, теперь останавливается в конце данных MP3, а не завершается с ошибкой ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Исправлена обработка образцов preroll для начальных позиций медиаконтента, не являющихся ключевыми кадрами, при обработке списков редактирования в файлах MP4 (#1659).
    • Улучшен расчет частоты кадров за счет использования продолжительности медиаконтента из поля mdhd в Mp4Extractor и FragmentedMp4Extractor (#1531).
    • Исправлено неправильное масштабирование media_time в списках редактирования MP4. Если segment_duration уже правильно масштабировался с использованием временной шкалы фильма, то media_time теперь правильно масштабируется с использованием временной шкалы дорожки, как указано в стандарте формата MP4 (#1792).
    • Обработка кадров, расположенных не по порядку, при вычислении endIndices для MP4 со списком изменений (#1797).
    • Исправлена обработка длительности медиаконтента в поле mdhd файлов MP4, чтобы обрабатывать значения -1 (#1819).
    • Добавлена поддержка идентификации поля h263 в файлах MP4 для видео H.263 (#1821).
    • Добавлена поддержка формата AC-4 Level-4 ISO base media file (#1265).
  • DataSource:
    • Обновлен метод HttpEngineDataSource, чтобы разрешить использование начиная с версии S, расширение 7, вместо уровня API 34 (#1262).
    • DataSourceContractTest: убедитесь, что DataSource.getUri() возвращает разрешенный URI (как описано в документации). Если он отличается от запрошенного URI, тесты могут указать на это с помощью нового метода DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: убедитесь, что DataSource.getUri() и getResponseHeaders() возвращают значение open после неудачного вызова open() (из-за того, что ресурс не найден) и до последующего вызова close().
      • Переопределение DataSourceContractTest.getNotFoundResources() позволяет подклассам тестов предоставлять несколько ресурсов, которые не были найдены, а также любые ожидаемые заголовки. Это позволяет различать ошибку HTTP 404 (с заголовками) и ошибку "Сервер не найден" (без заголовков).
  • Аудио:
    • Автоматически настраивать метаданные громкости CTA-2075 в кодеке, если они есть в медиафайле.
    • Обеспечьте плавное уменьшение громкости при перемотке.
    • Исправлена проблема, из-за которой при перемотке могли возникать щелчки.
    • Исправлена ошибка усечения, возникавшая при использовании алгоритма Sonic для изменения скорости и высоты звука.
    • Исправлена ошибка в SpeedChangingAudioProcessor, из-за которой пропускались выходные кадры.
  • Видео:
    • MediaCodecVideoRenderer не декодирует фрагменты, которые не отрисовываются и не используются в качестве опорных для других фрагментов.
    • В API 35 и более поздних версиях MediaCodecAdapter теперь может получать null Surface в configure и вызовы нового метода detachOutputSurface, чтобы удалить ранее заданный Surface, если кодек поддерживает это (MediaCodecInfo.detachedSurfaceSupported).
    • При обработке onOutputFormatChanged используются значения соотношения сторон пикселя, предоставленные MediaCodecAdapter (#1371).
    • Добавлено временное решение проблемы с устройством Galaxy Tab S7 FE, из-за которой защищенные потоки H264 с частотой 60 кадров/с помечались как неподдерживаемые (#1619).
    • Добавлено временное решение для кодеков, которые зависают после последнего фрагмента, не возвращая сигнал о конце потока.
  • Текст:
    • Добавлен настраиваемый VoiceSpan и заполнен для диапазонов голоса WebVTT (#1632).
    • Обеспечен показ субтитров WebVTT в HLS с очень большими временными метками, которые переполняют 64-битный long, если представлены в микросекундах и умножены на временную базу MPEG 90,000 (#1763).
    • Добавлена поддержка субтитров CEA-608 в контенте Dolby Vision (#1820).
    • Исправлена ошибка, из-за которой зависало воспроизведение многопериодных потоков DASH, если были включены субтитры CEA-608 (#1863).
  • Метаданные:
    • Тип C.TRACK_TYPE_METADATA назначается дорожкам, содержащим контент icy или vnd.dvb.ait.
  • Изображение:
    • Добавьте ExternallyLoadedImageDecoder для упрощенной интеграции со сторонними библиотеками загрузки изображений, такими как Glide или Coil.
  • DataSource:
    • Добавлен FileDescriptorDataSource – новый DataSource, который можно использовать для чтения из FileDescriptor (#3757).
  • Эффект:
    • Добавлен обходной путь DefaultVideoFrameProcessor для незначительного масштабирования SurfaceTexture. SurfaceTexture может включать небольшое масштабирование, которое отсекает границу в 1 тексель по краю обрезанного буфера. Теперь это обрабатывается так, чтобы результат был ближе к ожидаемому.
    • Ускорить DefaultVideoFrameProcessor.queueInputBitmap(). В результате экспорт видео из картинки с помощью Transformer происходит быстрее.
  • Расширение IMA:
    • Исправлена ошибка, из-за которой очистка плейлиста могла привести к ArrayIndexOutOfBoundsException в ImaServerSideAdInsertionMediaSource.
    • Исправлена ошибка, из-за которой при воспроизведении потоков с динамической вставкой объявлений на стороне сервера без видеорекламы в начале ролика после последней видеорекламы в середине ролика могла возникать ошибка ArrayIndexOutOfBoundsException (#1741).
  • Сеанс:
    • Добавьте MediaButtonReceiver.shouldStartForegroundService(Intent), чтобы приложения могли подавлять команду воспроизведения, поступающую для возобновления воспроизведения, переопределяя этот метод. По умолчанию служба всегда запущена, и воспроизведение нельзя подавить, не вызвав сбой службы с ошибкой ForegroundServiceDidNotStartInTimeException (#1528).
    • Исправлена ошибка, из-за которой специальные команды, отправленные из MediaBrowser, передавались в MediaSessionCompat.Callback вместо MediaBrowserServiceCompat варианта метода при подключении к устаревшему сервису. Это не позволяло MediaBrowser получать фактическое возвращаемое значение, отправленное устаревшим сервисом (#1474).
    • Исправлена ошибка IllegalArgumentException, которая возникала на устройствах некоторых производителей при настройке широковещательного приемника для намерений, связанных с кнопками управления медиа (#1730).
    • Добавьте кнопки команд для мультимедийных объектов. Это добавляет Media3 API для того, что было известно как Custom browse actions с устаревшей библиотекой с MediaBrowserCompat. Обратите внимание, что в Media3 командные кнопки для мультимедийных объектов доступны как для MediaBrowser, так и для MediaController. Подробнее о том, как реализовать специальные действия для просмотра… * Исправлена ошибка, из-за которой контроллер Media3 иногда не позволял приложению сеанса запустить активную службу после запроса play().
    • Ограничьте CommandButton.Builder.setIconUri, чтобы принимались только URI контента.
    • Передавать подсказки о подключении браузера Media3 в исходный MediaBrowserCompat при подключении к устаревшему MediaBrowserCompat. Сервис может получать подсказки о подключении, переданные в качестве корневых подсказок при первом вызове onGetRoot().
    • Исправлена ошибка, из-за которой MediaBrowser, подключенный к устаревшему сервису браузера, не получал ошибку, отправленную сервисом после того, как браузер подписался на parentid.
    • Улучшена совместимость, чтобы браузер Media3, подключенный к устаревшему MediaBrowserService, не запрашивал дочерние элементы parentId дважды при подписке на родительский элемент.
  • Интерфейс:
    • Сделайте растянутое/обрезанное видео в обходном решении PlayerView-in-Compose-AndroidView необязательным из-за проблем с общими переходами на основе XML. Приложения, использующие PlayerView внутри AndroidView, должны вызывать PlayerView.setEnableComposeSurfaceSyncWorkaround, чтобы включить эту функцию (#1237, #1594).
    • Добавьте setFullscreenButtonState в PlayerView, чтобы разрешить обновление значка кнопки полноэкранного режима по запросу, то есть внеполосно и не реактивно по отношению к клику (#1590, #184).
    • Исправлена ошибка, из-за которой вариант "Нет" в выборе текста не работал, если в приложении были заданы настройки выбора текстовых дорожек.
  • Расширение DASH:
    • Добавлена поддержка периодов, начинающихся в середине сегмента (#1440).
  • Расширение Smooth Streaming:
    • Исправлена ошибка Bad magic number for Bundle, возникавшая при воспроизведении потоков SmoothStreaming с текстовыми дорожками (#1779).
  • Расширение RTSP:
    • Исправлена ошибка, из-за которой не удалялась информация о пользователе из URL, содержащих закодированные символы @ (#1138).
    • Исправлен сбой при обработке RTP-пакетов с расширениями заголовков (#1225).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Добавлен модуль декодера IAMF, который обеспечивает поддержку воспроизведения файлов MP4, содержащих треки IAMF, с использованием нативной библиотеки libiamf для синтеза аудио.
      • Поддерживается воспроизведение в стереоформате и формате 5.1 с пространственным звучанием и отслеживанием движений головы (необязательно). Бинауральное воспроизведение пока не поддерживается.
    • Добавлена поддержка страниц размером 16 КБ для расширений декодера на Android 15 (#1685).
  • Расширение Cast:
    • Очистка хронологии прекращается после отключения CastSession, что позволяет приложению отправителя возобновить воспроизведение на устройстве после отключения.
    • Заполнять DeviceInfo CastPlayer, если указан Context. Это позволяет связать MediaSession с RoutingSession, что необходимо для интеграции переключателя вывода (#1056).
  • Инструменты для тестирования:
    • Теперь DataSourceContractTest включает тесты для проверки:
      • Входной поток read position обновлен.
      • Буфер вывода offset применен правильно.
  • Демонстрационное приложение
    • Устранены утечки памяти в демонстрационном приложении для коротких видео (#1839).
  • Удалите устаревшие символы:
    • Удалите устаревшие Player.hasPrevious, Player.hasPreviousWindow(). Используйте вместо него Player.hasPreviousMediaItem().
    • Удалите устаревший метод Player.previous(). Используйте вместо него Player.seekToPreviousMediaItem().
    • Удалите устаревший метод DrmSessionEventListener.onDrmSessionAcquired.
    • Удалите устаревшие конструкторы DefaultEncoderFactory. Используйте вместо него DefaultEncoderFactory.Builder.

Версия 1.5.0-rc02

19 ноября 2024 г.

Используйте стабильную версию 1.5.0.

Версия 1.5.0-rc01

13 ноября 2024 г.

Используйте стабильную версию 1.5.0.

Версия 1.5.0-beta01

30 октября 2024 г.

Используйте стабильную версию 1.5.0.

Версия 1.5.0-alpha01

10 сентября 2024 г.

Используйте стабильную версию 1.5.0.

Версия 1.4.0

Версия 1.4.1

27 августа 2024 г.

Данные "androidx.media3:media3-*:1.4.1" опубликованы. Версия 1.4.1 содержит эти коммиты.

  • ExoPlayer:
    • Обратные вызовы предварительной загрузки в PreloadMediaSource теперь обрабатываются асинхронно (#1568).
    • Разрешено воспроизведение независимо от длительности буферизации при сбое загрузки (#1571).
  • Экстракторы:
    • MP3. Исправлена ошибка Searched too many bytes. Теперь данные, не относящиеся к MP3, корректно игнорируются на основе поля длины во фрейме Info (#1480).
  • Текст:
    • TTML: исправлена обработка процентных значений tts:fontSize, чтобы они правильно наследовались от родительских узлов с процентными значениями tts:fontSize.
    • Исправлена ошибка IndexOutOfBoundsException в LegacySubtitleUtil, возникавшая из-за неправильной обработки ситуации, когда запрошенное время начала вывода больше или равно времени последнего события в Subtitle (#1516).
  • DRM:
    • Исправлена ошибка android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE на устройствах с API 31 и более поздних версий при воспроизведении контента L1 Widevine. Эта ошибка возникает из-за неполной реализации метода MediaDrm.requiresSecureDecoder фреймворка (#1603).
  • Эффект:
    • Добавьте метод release() в GlObjectsProvider.
  • Сеанс:
    • Двойное нажатие на KEYCODE_HEADSETHOOK теперь выполняет действие "перейти к следующему", как описано в документации (#1493).
    • Обрабатывать KEYCODE_HEADSETHOOK как команду воспроизведения в MediaButtonReceiver при принятии решения о том, следует ли игнорировать ее, чтобы избежать ForegroundServiceDidNotStartInTimeException (#1581).
  • Расширение RTSP:
    • Пропуск недопустимых описаний медиафайлов при синтаксическом анализе SDP (#1087).

Версия 1.4.0

25 июля 2024 г.

Данные "androidx.media3:media3-*:1.4.0" опубликованы. Версия 1.4.0 содержит эти коммиты.

  • Общая библиотека:
    • Перенаправлять предполагаемые пустые вызовы перемотки в защищенные методы BasePlayer.seekTo() и SimpleBasePlayer.handleSeek() вместо того, чтобы игнорировать их. Если вы реализуете эти методы в собственном проигрывателе, вам может потребоваться обрабатывать эти дополнительные вызовы с помощью mediaItemIndex == C.INDEX_UNSET.
    • Удалена зависимость компиляции от улучшенной десахаризации Java 8 (#1312).
    • Убедитесь, что продолжительность, переданная в MediaItem.Builder.setImageDurationMs(), игнорируется для MediaItem, не являющегося изображением (как указано в документации).
    • Добавьте Format.customData, чтобы хранить предоставленную приложением информацию об экземплярах Format.
  • ExoPlayer:
    • Добавьте BasePreloadManager, который координирует предварительную загрузку для нескольких источников на основе приоритетов, определенных их rankingData. Чтобы настроить его, расширьте этот класс. Добавьте DefaultPreloadManager, который использует PreloadMediaSource для предварительной загрузки медиасемплов источников в память, и целое число rankingData, указывающее индекс элемента в интерфейсе.
    • Добавьте PlayerId в большинство методов LoadControl, чтобы реализации LoadControl поддерживали несколько игроков.
    • Удалить Buffer.isDecodeOnly() и C.BUFFER_FLAG_DECODE_ONLY. Устанавливать этот флаг не нужно, так как средства рендеринга и декодеры будут пропускать буферы на основе временной метки. Специальные реализации Renderer должны проверять, составляет ли время буферизации не менее BaseRenderer.getLastResetPositionUs(), чтобы решить, следует ли показывать образец. Специальные реализации SimpleDecoder могут при необходимости проверять isAtLeastOutputStartTimeUs() или помечать другие буферы с помощью DecoderOutputBuffer.shouldBeSkipped, чтобы пропускать их.
    • Разрешить возвращать нулевое значение с помощью TargetPreloadStatusControl.getTargetPreloadStatus(T), чтобы указать, что не нужно предварительно загружать MediaSource с заданным rankingData.
    • Свойство remove(MediaSource) добавлено в запрос BasePreloadManager.
    • Добавьте reset() в BasePreloadManager, чтобы освободить все удерживаемые источники, сохранив экземпляр менеджера предварительной загрузки.
    • Добавьте ExoPlayer.setPriority() (и Builder.setPriority()), чтобы определить значение приоритета, используемое в PriorityTaskManager и для значимости MediaCodec из API 35.
    • Исправлена ошибка, из-за которой при обновлении времени последней повторной буферизации в CMCD указывался неверный ключ bs (нехватка буфера) (#1124).
    • Добавьте PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource), чтобы указать, что источник загружен до конца. Это позволяет DefaultPreloadManager и пользовательским реализациям PreloadMediaSource.PreloadControl предварительно загружать следующий источник или выполнять другие действия.
    • Исправлена ошибка, из-за которой пропуск тишины в конце объектов мог вызывать исключение воспроизведения.
    • Добавьте clear в PreloadMediaSource, чтобы отменить период предварительной загрузки.
    • Добавлен новый код ошибки PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, который используется, когда ресурсы кодека задействуются для задач с более высоким приоритетом.
    • Теперь AdsMediaSource может загружать объявления в начале ролика до того, как будет завершена подготовка основного контента (#1358).
    • Исправлена ошибка, из-за которой воспроизведение переключалось на STATE_ENDED при повторной подготовке прямой трансляции DASH с несколькими периодами после того, как исходный период уже был удален из манифеста.
    • Переименуйте onTimelineRefreshed() в onSourcePrepared() и onPrepared() в onTracksSelected() в PreloadMediaSource.PreloadControl. Также переименуйте IntDefs в DefaultPreloadManager.Stage.
    • Добавлена экспериментальная поддержка динамического планирования, чтобы лучше согласовывать работу с циклами пробуждения ЦП и откладывать пробуждение до тех пор, пока средства визуализации не смогут продолжить работу. Вы можете включить эту функцию с помощью experimentalSetDynamicSchedulingEnabled() при настройке экземпляра ExoPlayer.
    • Добавьте Renderer.getDurationToProgressUs(). Renderer может реализовать этот метод, чтобы возвращать ExoPlayer длительность, на которую должно продвинуться воспроизведение, чтобы рендерер продолжил работу. Если для ExoPlayer задано значение experimentalSetDynamicSchedulingEnabled(), то ExoPlayer будет вызывать этот метод при расчете времени для планирования рабочей задачи.
    • Добавьте MediaCodecAdapter#OnBufferAvailableListener, чтобы получать оповещения о том, что входные и выходные буферы доступны для использования MediaCodecRenderer. При получении этих обратных вызовов MediaCodecRenderer будет отправлять сигнал ExoPlayer. Если для ExoPlayer задано значение experimentalSetDynamicSchedulingEnabled(), то ExoPlayer будет планировать цикл работы по мере того, как средства визуализации будут выполнять задачи.
    • Используйте класс данных для методов LoadControl вместо отдельных параметров.
    • Добавьте ExoPlayer.isReleased(), чтобы проверить, был ли вызван метод Exoplayer.release().
    • Добавлен параметр ExoPlayer.Builder.setMaxSeekToPreviousPositionMs(), позволяющий задать максимальную позицию, с которой seekToPrevious() переходит к предыдущему элементу (#1425).
    • Исправлены некоторые несоответствия в фокусе аудио, например отсутствие отчетов о полной или временной потере фокуса, когда проигрыватель приостановлен (#1436).
    • Исправлена потенциальная ошибка IndexOutOfBoundsException, возникавшая, когда экстракторы сообщали о дополнительных треках после начального этапа подготовки (#1476).
    • Effects в ExoPlayer.setVideoEffect() будет получать временные метки без смещения средства визуализации (#1098).
    • Исправлена потенциальная ошибка IllegalArgumentException при обработке ошибки проигрывателя, которая возникала при упреждающем чтении другого элемента плейлиста (#1483).
  • Трансформер:
    • Добавьте audioConversionProcess и videoConversionProcess в ExportResult, чтобы указать, как была создана соответствующая дорожка в выходном файле.
    • Ослаблены проверки уровня H.264 для оптимизации обрезки.
    • Добавлена поддержка переключения между входными медиафайлами SDR и HDR в последовательности.
    • Добавлена поддержка аудиоэффектов на уровне композиции.
    • Добавлена поддержка перекодирования изображений Ultra HDR в HDR-видео.
    • Исправлена ошибка, из-за которой DefaultAudioMixer не выводит правильное количество байтов после сброса и повторного использования.
    • Устранена ошибка декодера, из-за которой количество аудиоканалов ограничивалось стерео при обработке входных данных PCM.
    • При выборе дорожек в ExoPlayerAssetLoader игнорируйте ограничения на количество аудиоканалов, так как они применяются только при воспроизведении.
    • Замените интерфейс androidx.media3.transformer.Muxer на androidx.media3.muxer.Muxer и удалите androidx.media3.transformer.Muxer.
    • Исправлена ошибка, из-за которой не загружались изображения HEIC из схем URI контента. (#1373).
    • Чтобы улучшить синхронизацию аудио и видео, настройте длительность звуковой дорожки в AudioGraphInput.
    • Удалить поле "ExportResult.processedInputs". Если вы используете это поле для указания сведений о кодеке, то вместо него используйте поле DefaultDecoderFactory.listener. В случае исключения кодека его сведения будут доступны в ExportException.codecInfo.
  • Экстракторы:
    • MPEG-TS: повторно примените изменение, обеспечивающее рендеринг последнего кадра, передав последний блок доступа потока в очередь выборки (#7909). Добавлены исправления, устраняющие проблемы, которые возникали только в потоках HLS с I-кадрами (#1150) и потоках HLS H.262 (#1126).
    • MP3: размер данных из фрейма Info предпочтительнее размера, указанного в базовом потоке (например, размера файла или заголовка HTTP Content-Length). Это позволяет исключить данные невоспроизводимых трейлеров (например, обложки альбомов) из расчетов поиска по постоянному битрейту, что повышает точность поиска (#1376).
    • MP3.Для вычисления средней скорости передачи данных при поиске с постоянной скоростью передачи данных используется количество кадров и другие данные в кадре Info (если он есть). Это позволяет избежать экстраполяции на основе скорости передачи данных кадра, следующего за кадром Info, которая может быть искусственно занижена, например кадра PCUT (#1376).
    • Исправлено извлечение аудиоформата PCM в контейнерах AVI.
  • Аудио:
    • Исправлены атрибуты кодирования DTS:X Profile 2 для сквозного воспроизведения (#1299).
    • Для разгруженного воспроизведения сбросьте поле отслеживания завершения потока в DefaultAudioSink перед вызовом AudioTrack.stop(), чтобы AudioTrack.StreamEventCallback#onPresentationEnded правильно определял, когда все ожидающие данные были воспроизведены.
    • Исправлена ошибка в SilenceSkippingAudioProcessor, из-за которой переходы между разными аудиоформатами (например, со стерео на моно) могли вызывать исключение процессора (#1352).
    • Реализуйте MediaCodecAudioRenderer.getDurationToProgressUs(), чтобы ExoPlayer динамически планировал основной цикл работы, когда MediaCodecAudioRenderer может выполнять обработку.
  • Видео:
    • Исправлена ошибка, из-за которой Listener.onRenderedFirstFrame() поступал слишком рано при переключении между поверхностями во время воспроизведения.
    • Исправлена логика резервного декодера для Dolby Vision, чтобы при необходимости использовать совместимый декодер AV1 (#1389).
    • Исправлена ошибка кодека, которая могла возникать при включении отрисовщика видео во время воспроизведения.
  • Текст:
    • Исправлена ошибка, из-за которой субтитры, начинающиеся до позиции поиска, пропускались. Эта проблема появилась только в Media3 1.4.0-alpha01.
    • Изменено поведение синтаксического анализа субтитров по умолчанию: теперь он выполняется во время извлечения, а не рендеринга (разницу между извлечением и рендерингом можно посмотреть на схеме архитектуры ExoPlayer).
      • Это изменение можно переопределить, вызвав оба метода: MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) и TextRenderer.experimentalSetLegacyDecodingEnabled(true). Инструкции по добавлению этих компонентов в экземпляр ExoPlayer можно найти в документации по настройке. Эти методы (и вся поддержка устаревшего декодирования субтитров) будут удалены в будущем выпуске.
      • Если в приложении используется собственная реализация SubtitleDecoder, ее нужно заменить на SubtitleParser (а SubtitleDecoderFactory – на SubtitleParser.Factory).
    • PGS. Исправлено декодирование длин серий, чтобы 0 распознавался как индекс цвета, а не как буквальное значение цвета (#1367).
    • CEA-708: игнорировать значение rowLock. Согласно спецификации CEA-708-E S-2023, значения rowLock и columnLock должны считаться истинными независимо от значений в потоке (поддержка columnLock не реализована, поэтому фактически считается, что значение всегда ложно).
      • Изначально это было включено в примечания к выпуску 1.3.0-alpha01, но изменение было случайно отменено до выпуска 1.3.0-rc01. Теперь эта неполадка устранена, и изменение снова доступно.
    • CEA-708: устранена проблема, из-за которой при обработке команды set pen location в ExoPlayer добавлялись лишние символы новой строки (#1315).
    • Исправлена ошибка IllegalArgumentException из LegacySubtitleUtil, возникавшая, когда образец субтитров WebVTT не содержал реплик, например в потоке DASH (#1516).
  • Метаданные:
    • Исправлено сопоставление тегов сортировки MP4 и ID3. Ранее теги MP4 "сортировка альбомов" (soal), "сортировка исполнителей" (soar) и "сортировка исполнителей альбомов" (soaa) неправильно сопоставлялись с тегами ID3 TSO2, TSOA и TSOP (#1302).
    • Исправлено чтение числовых тегов gnre (жанр) и tmpo (темп) в файлах MP4 (/iTunes), если значение занимает больше одного байта.
    • Передача фрейма ID3 TCON в MediaMetadata.genre (#1305).
  • Изображение:
    • Добавлена поддержка неквадратных сеток значков DASH (#1300).
    • Добавлена поддержка AVIF для API 34 и более поздних версий.
    • Разрешить использовать null в качестве параметра для ExoPlayer.setImageOutput(), чтобы очистить ранее заданное значение ImageOutput.
  • DataSource:
    • Реализуйте поддержку URI произвольных необработанных ресурсов android.resource://package/id, где package отличается от пакета текущего приложения. Ранее этот способ не был задокументирован, но он эффективнее, чем доступ к ресурсам в другом пакете по названию.
    • Проверьте, что url не равно null в конструкторах DataSpec. Этот параметр уже был аннотирован как ненулевой.
    • Разрешите ByteArrayDataSource преобразовывать URI в массив байтов во время open(), а не задавать его в коде при создании (#1405).
  • DRM:
    • Разрешить настройку LoadErrorHandlingPolicy в DefaultDrmSessionManagerProvider (#1271).
  • Эффект:
    • Поддержка нескольких изменений скорости в одном EditedMediaItem или Composition в SpeedChangeEffect.
    • Поддержка вывода HLG и PQ из входных данных растрового изображения Ultra HDR.
    • Добавлена поддержка EGL_GL_COLORSPACE_BT2020_HLG_EXT, которая улучшает вывод HLG в ExoPlayer.setVideoEffect и SurfaceView для отладки Transformer.
    • Обновите реализацию матрицы наложения, чтобы она соответствовала документации, поменяв местами значения x и y, применяемые в setOverlayFrameAnchor(). Если вы используете OverlaySettings.Builder.setOverlayFrameAnchor(), поменяйте значения x и y, умножив их на -1.
    • Исправлена ошибка, из-за которой происходил сбой TimestampWrapper при использовании с ExoPlayer#setVideoEffects (#821).
    • Измените рабочее цветовое пространство SDR по умолчанию с линейных цветов на электрическое видео BT 709 SDR. Также добавьте третий вариант, чтобы сохранить исходное цветовое пространство.
    • Добавлена возможность задавать неопределенный порядок по оси Z для EditedMediaItemSequences (#1055).
    • Поддерживайте одинаковый диапазон яркости для разных фрагментов HDR-контента (используется диапазон HLG).
    • Добавлена поддержка оверлеев Ultra HDR (растровых) в контенте HDR.
    • Разрешить использование эффектов SeparableConvolution до API 26.
    • Удалите неиспользуемый параметр OverlaySettings.useHdr, поскольку динамический диапазон оверлея и кадра должен совпадать.
    • Добавлена поддержка HDR для TextOverlay. Яркость наложенного текста можно настроить с помощью OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Расширение IMA:
    • Перевести API, необходимый для воспроизведения рекламных потоков с динамической вставкой объявлений, в стабильную версию.
    • Добавьте в ImaServerSideAdInsertionMediaSource.AdLoader параметр replaceAdTagParameters(Map <String, String>), который позволяет заменять параметры тега объявления во время выполнения.
    • Исправлена ошибка, из-за которой метод VideoAdPlayer.VideoAdPlayerCallback.onError() не вызывался, если во время воспроизведения объявления возникала ошибка проигрывателя (#1334).
    • Версия IMA SDK обновлена до 3.33.0, чтобы устранить ошибку NullPointerException при использовании URI тегов объявлений data:// (#700).
  • Сеанс:
    • Измените значение по умолчанию для CommandButton.enabled на true и убедитесь, что для контроллеров может оставаться значение false, даже если связанная команда доступна.
    • Добавьте константы значков для CommandButton, которые следует использовать вместо ресурсов пользовательских значков.
    • Добавьте MediaSessionService.isPlaybackOngoing(), чтобы приложения могли запрашивать, нужно ли останавливать сервис в onTaskRemoved() (#1219).
    • Добавьте MediaSessionService.pauseAllPlayersAndStopSelf(), чтобы приостанавливать воспроизведение всех сеансов, и вызовите stopSelf(), чтобы завершить жизненный цикл MediaSessionService.
    • Переопределите MediaSessionService.onTaskRemoved(Intent), чтобы обеспечить безопасную реализацию по умолчанию, которая поддерживает работу службы в активном режиме, если воспроизведение продолжается, или останавливает службу в противном случае.
    • Скрывать ползунок перемотки в уведомлении о воспроизведении трансляции, не указывая длительность в метаданных сеанса платформы (#1256).
    • Приведите преобразование MediaMetadata в соответствие с MediaDescriptionCompat, чтобы использовать тот же порядок и логику при выборе свойств метаданных, что и в media1.
    • Добавлен метод MediaSession.sendError(), позволяющий отправлять некритические ошибки в контроллер Media3. При использовании контроллера уведомлений (см. MediaSession.getMediaNotificationControllerInfo()) собственная ошибка используется для обновления PlaybackState сеанса платформы до состояния ошибки с заданной информацией об ошибке (#543).
    • Добавьте MediaSession.Callback.onPlayerInteractionFinished(), чтобы сообщать сеансам о завершении серии взаимодействий игрока с определенным контроллером.
    • Добавьте SessionError и используйте его в SessionResult и LibraryResult вместо кода ошибки, чтобы предоставить больше информации об ошибке и способах ее устранения, если это возможно.
    • Опубликовать код для тестового приложения контроллера media3, которое можно использовать для проверки взаимодействия с приложениями, публикующими медиасеанс.
    • Передавать дополнительные данные из MediaSession[Builder].setSessionExtras() media3 в PlaybackStateCompat.getExtras() контроллера media1.
    • Сопоставляйте критические и некритические ошибки с сеансом платформы. PlaybackException сопоставляется с критической ошибкой PlaybackStateCompat. Объект SessionError, отправленный контроллеру уведомлений мультимедиа с помощью MediaSession.sendError(ControllerInfo, SessionError), сопоставляется с некритической ошибкой в PlaybackStateCompat. Это означает, что код ошибки и сообщение заданы, но состояние сеанса платформы отличается от STATE_ERROR.
    • Разрешить задавать активность сеанса для каждого контроллера, чтобы переопределять глобальную активность сеанса. Действие сеанса можно определить для контроллера во время подключения, создав ConnectionResult с помощью AcceptedResultBuilder.setSessionActivivty(PendingIntent). После подключения данные о сеансе можно будет обновить с помощью MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Улучшено воспроизведение ошибок при вызовах MediaLibrarySession.Callback. Теперь вы можете настроить репликацию ошибок с помощью MediaLibrarySession.Builder.setLibraryErrorReplicationMode(), выбрав тип ошибки или отказавшись от репликации ошибок, которая включена по умолчанию.
  • Интерфейс:
    • Добавлена поддержка показа изображений в PlayerView при подключении к ExoPlayer (#1144).
    • Добавлена возможность настраивать различные значки в PlayerControlView с помощью атрибутов XML, чтобы можно было использовать разные объекты Drawable для каждого экземпляра PlayerView, а не переопределять их глобально (#1200).
    • Устранена ошибка платформы, из-за которой видео растягивалось или обрезалось при использовании SurfaceView внутри Compose AndroidView в API 34 (#1237).
  • Скачивания:
    • Убедитесь, что DownloadHelper не допускает утечки невыпущенных экземпляров Renderer, что может привести к сбою приложения с ошибкой IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Расширение Cronet:
    • Исправьте SocketTimeoutException в CronetDataSource. В некоторых версиях Cronet запрос, предоставляемый обратным вызовом, не всегда одинаков. Это приводит к тому, что обратный вызов не завершается и время ожидания запроса истекает (https://issuetracker.google.com/328442628).
  • Расширение HLS:
    • Исправлена ошибка, из-за которой ожидающие образцы EMSG, ожидающие разрыва, делегировались в HlsSampleStreamWrapper с неправильным смещением, что приводило к IndexOutOfBoundsException или IllegalArgumentException (#1002).
    • Исправлена ошибка, из-за которой неосновные плейлисты постоянно перезагружались для потоков LL-HLS (#1240).
    • Исправлена ошибка, из-за которой включение CMCD для HLS с сегментами инициализации приводило к Source Error и IllegalArgumentException.
    • Исправлена ошибка, из-за которой неосновные плейлисты не обновлялись во время прямой трансляции (#1240).
    • Исправлена ошибка, из-за которой включение CMCD для прямых трансляций HLS вызывало ArrayIndexOutOfBoundsException (#1395).
  • Расширение DASH:
    • Исправлена ошибка, из-за которой повторная подготовка многопериодной трансляции могла вызывать ошибку IndexOutOfBoundsException (#1329).
    • Добавлена поддержка URL лицензий dashif:Laurl (#1345).
  • Расширение Cast:
    • Исправлена ошибка, из-за которой название альбома MediaQueueItem преобразовывалось в имя исполнителя в мультимедийном объекте Media3 (#1255).
  • Инструменты для тестирования:
    • Реализуйте onInit() и onRelease() в FakeRenderer.
    • Измените методы TestPlayerRunHelper.runUntil()/playUntil(), чтобы они не выполнялись при некритических ошибках (например, тех, о которых сообщается в AnalyticsListener.onVideoCodecError()). Чтобы отключить это поведение, используйте новую цепочку методов TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX().
  • Демонстрационное приложение:
    • Используйте DefaultPreloadManager в демоприложении для коротких видео.
    • Добавлена возможность задавать режим повтора с помощью аргументов Intent из командной строки (#1266).
    • Использовать HttpEngineDataSource в качестве HttpDataSource, если устройство поддерживает эту функцию.
  • Удалите устаревшие символы:
    • Удалить CronetDataSourceFactory Используйте вместо него CronetDataSource.Factory.
    • Удалите некоторые конструкторы DataSpec. Используйте вместо него DataSpec.Builder.
    • Удалите метод setContentTypePredicate(Predicate) из DefaultHttpDataSource, OkHttpDataSource и CronetDataSource. Вместо этого используйте эквивалентный метод для каждого объекта XXXDataSource.Factory.
    • Удалите конструкторы OkHttpDataSource и OkHttpDataSourceFactory. Используйте вместо него OkHttpDataSource.Factory.
    • Удалить PlayerMessage.setHandler(Handler) Используйте вместо него setLooper(Looper).
    • Удалить поле "Timeline.Window.isLive". Вместо этого используйте метод isLive().
    • Удалите DefaultHttpDataSource конструктор. Используйте вместо него DefaultHttpDataSource.Factory.
    • Удалить DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS Используйте вместо него DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Удалить MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) Используйте вместо него MediaCodecInfo.canReuseCodec(Format, Format).
    • Удалите методы DrmSessionManager.DUMMY и getDummyDrmSessionManager(). Используйте вместо него DrmSessionManager.DRM_UNSUPPORTED.
    • Удалить AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Используйте перегрузки, которые принимают DecoderReuseEvaluation.
    • Удалите IntDef RendererSupport.FormatSupport и константы FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE. Используйте вместо них эквивалентные IntDef и константы в androidx.media3.common.C (например, C.FORMAT_HANDLED).
    • Удалите интерфейс Bundleable. В частности, будут удалены все поля констант Bundleable.Creator<Foo> CREATOR. Вместо этого вызывающие объекты должны использовать методы Bundle toBundle() и static Foo fromBundle(Bundle) для каждого типа.

Версия 1.4.0-rc01

10 июля 2024 г.

Используйте стабильную версию 1.4.0.

Версия 1.4.0-beta01

26 июня 2024 г.

Используйте стабильную версию 1.4.0.

Версия 1.4.0-alpha02

7 июня 2024 г.

Используйте стабильную версию 1.4.0.

Версия 1.4.0-alpha01

17 апреля 2024 г.

Используйте стабильную версию 1.4.0.

Версия 1.3.0

Версия 1.3.1

11 апреля 2024 г.

Данные "androidx.media3:media3-*:1.3.1" опубликованы. Версия 1.3.1 содержит эти коммиты.

  • Общая библиотека:
    • Добавьте Format.labels, чтобы разрешить локализованные или другие альтернативные ярлыки.
  • ExoPlayer:
    • Исправлена ошибка, из-за которой PreloadMediaPeriod не может сохранить потоки при повторной предварительной загрузке.
    • При повторном выборе трека примените правильный соответствующий TrackSelectionResult к периоду воспроизведения.
    • Запуск средств визуализации, включенных на раннем этапе, только после перехода к периоду воспроизведения при переключении между мультимедийными объектами (#1017).
    • Добавлен отсутствующий тип возвращаемого значения в правило proguard -keepclasseswithmembers для DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Трансформер:
    • Добавлено временное решение для исключения, которое возникает из-за того, что MediaMuxer не поддерживает отрицательные временные метки до API 30.
  • Выбор дорожки:
    • DefaultTrackSelector: отдавать предпочтение видеодорожкам с "разумной" частотой кадров (>=10 кадров/с) по сравнению с дорожками с более низкой или неустановленной частотой кадров. Это гарантирует, что проигрыватель выберет "настоящую" видеодорожку в файлах MP4, извлеченных из фото с движением, которые могут содержать две дорожки HEVC, одна из которых имеет более высокое разрешение, но очень небольшое количество кадров (#1051).
  • Экстракторы:
    • Исправлена ошибка, из-за которой при чтении фрагментов нечетного размера из файлов WAV не пропускались отступы (#1117).
    • MP3: заполните поле Format.averageBitrate, используя фреймы метаданных, например XING и VBRI.
    • MPEG-TS: отменено изменение, которое должно было обеспечить рендеринг последнего кадра путем передачи последнего блока доступа потока в очередь выборки (#7909). Это связано с тем, что изменение вызывает новые проблемы с потоками HLS, содержащими только I-кадры (#1150), и потоками HLS H.262 (#1126).
  • Аудио:
    • Разрешить восстановление средства визуализации путем отключения разгрузки, если аудиодорожка не инициализируется в режиме разгрузки.
  • Видео:
    • Добавлено временное решение проблемы, из-за которой на Galaxy Tab S7 FE, Chromecast с Google TV и Lenovo M10 FHD Plus потоки H265 с частотой 60 кадров/с помечались как неподдерживаемые.
    • Добавлено обходное решение, которое обеспечивает рендеринг первого кадра при туннелировании, даже если устройство не делает это автоматически, как требуется API (#1169). (#966).
    • Исправлена ошибка, из-за которой обработка информации о цвете HDR приводила к неправильной работе кодека и мешала адаптивному переключению форматов для видеодорожек SDR (#1158).
  • Текст:
    • WebVTT: предотвращено создание ложных дополнительных экземпляров CuesWithTiming из WebvttParser.parse (#1177) при использовании непосредственно следующих друг за другом подсказок.
  • DRM:
    • Устранена ошибка NoSuchMethodError, которая могла возникать в фреймворке MediaDrm вместо ResourceBusyException или NotProvisionedException на некоторых устройствах Android 14 (#1145).
  • Эффект:
    • Улучшено тональное отображение PQ в SDR за счет преобразования цветовых пространств.
  • Сеанс:
    • Исправлена ошибка, из-за которой текущая позиция возвращалась назад, когда контроллер заменял текущий элемент (#951).
    • Исправлена ошибка, из-за которой MediaMetadata с ненулевым extras не передавался между контроллерами мультимедиа и сеансами (#1176).
  • Интерфейс:
    • Если Locale не может определить отображаемое название, используется название языка звуковой дорожки (#988).
  • Расширение DASH:
    • Заполните все элементы Label из манифеста в Format.labels (#1054).
  • Расширение RTSP:
    • Пропуск пустых значений информации о сеансе (теги i) при синтаксическом анализе SDP (#1087).
  • Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
    • Отключите расширение MIDI как локальную зависимость по умолчанию, поскольку для него требуется настроить дополнительный репозиторий Maven. Пользователи, которым нужен этот модуль из локальной зависимости, могут включить его повторно.

Версия 1.3.0

6 марта 2024 г.

Данные "androidx.media3:media3-*:1.3.0" опубликованы. Версия 1.3.0 содержит эти коммиты.

  • Общая библиотека:
    • Реализуйте поддержку URI необработанных ресурсов android.resource://package/[type/]name, где package отличается от пакета текущего приложения. Эта возможность всегда была задокументирована, но до сих пор не была реализована.
    • Нормализуйте MIME-типы, заданные кодом приложения или считанные из медиафайла, чтобы они были полностью в нижнем регистре.
    • Определяйте объявления с помощью полного MediaItem вместо одного Uri в AdPlaybackState.
    • Увеличьте значение minSdk до 19 (Android KitKat). Это соответствует всем остальным библиотекам AndroidX и необходимо для обновления до последних версий зависимостей AndroidX.
    • Заполняйте оба поля artworkUri и artworkData в MediaMetadata.Builder.populate(MediaMetadata), если хотя бы одно из них не равно null (#964).
  • ExoPlayer:
    • Добавлены методы PreloadMediaSource и PreloadMediaPeriod, которые позволяют приложениям предварительно загружать источник медиаконтента с определенной начальной позиции перед воспроизведением. PreloadMediaSource подготавливает источник медиаконтента для получения Timeline, подготавливает и кеширует период в заданной начальной позиции, выбирает треки и загружает медиаданные для периода. Приложения управляют процессом предварительной загрузки, реализуя PreloadMediaSource.PreloadControl и устанавливая предварительно загруженный источник в проигрыватель для воспроизведения.
    • Добавьте ExoPlayer.setImageOutput, чтобы приложения могли задавать ImageRenderer.ImageOutput.
    • Теперь DefaultRenderersFactory по умолчанию предоставляет проигрывателю ImageRenderer с нулевыми значениями ImageOutput и ImageDecoder.Factory.DEFAULT.
    • Добавлена отправка события Player.Listener.onPositionDiscontinuity при пропуске тишины (#765).
    • Добавлена экспериментальная поддержка синтаксического анализа субтитров во время извлечения. Включить эту функцию можно с помощью MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Поддержка адаптивных источников медиаконтента с помощью PreloadMediaSource.
    • Реализуйте HttpEngineDataSource, HttpDataSource, используя API HttpEngine.
    • Запретите создание подклассов CompositeSequenceableLoader. Этот компонент ранее был расширяемым, но в библиотеке не было его подклассов. Настройки можно задать, обернув экземпляр с помощью шаблона декоратора и реализовав собственный CompositeSequenceableLoaderFactory.
    • Исправлена ошибка, из-за которой повторение одного и того же времени приводило к удалению метаданных из этого элемента (#1007).
    • Переименуйте методы experimentalSetSubtitleParserFactory в BundledChunkExtractor.Factory и DefaultHlsExtractorFactory в setSubtitleParserFactory и запретите передачу null. Используйте новые методы experimentalParseSubtitlesDuringExtraction(boolean), чтобы управлять поведением синтаксического анализа.
    • Добавьте поддержку настройки SubtitleParser.Factory, используемого при извлечении. Для этого можно использовать MediaSource.Factory.setSubtitleParserFactory().
    • Добавить префикс источника ко всем полям Format.id, сгенерированным из MergingMediaSource. Это помогает определить, какой источник создал Format (#883).
    • Исправлено регулярное выражение, используемое для проверки пользовательских имен ключей Common Media Client Data (CMCD). Теперь оно проверяет только дефис (#1028).
    • Прекращено двойное кодирование параметров запроса CMCD (#1075).
  • Трансформер:
    • Добавлена поддержка замедленных видео в формате H.265/HEVC SEF.
    • Увеличена скорость трансмультиплексирования, особенно при удалении видео.
    • Добавьте API, чтобы выходной файл начинался с кадра видео. Это может сделать выходные данные операций обрезки более совместимыми с реализациями проигрывателя, которые не показывают первый кадр видео до его временной метки (#829).
    • Добавлена поддержка оптимизации операций обрезки MP4 для отдельных объектов.
    • Добавьте поддержку, чтобы у кадра видео была первая временная метка в выходном файле. Исправлена ошибка, из-за которой выходные файлы начинались с черного кадра в проигрывателях на базе iOS (#829).
  • Выбор дорожки:
    • Добавьте DefaultTrackSelector.selectImageTrack, чтобы включить выбор дорожки изображения.
    • Добавьте TrackSelectionParameters.isPrioritizeImageOverVideoEnabled, чтобы определить, нужно ли выбирать дорожку изображения, если доступны и дорожка изображения, и видеодорожка. Значение по умолчанию – false, то есть приоритет отдается выбору видеодорожки.
  • Экстракторы:
    • Добавлен дополнительный синтаксический анализ AV1C в экстрактор MP4 для получения значений ColorInfo.colorSpace, ColorInfo.colorTransfer и ColorInfo.colorRange (#692).
    • MP3: используйте поиск по постоянному битрейту (CBR) для файлов с заголовком Info (эквивалент заголовка Xing для CBR). Ранее мы использовали таблицу поиска из заголовка Info, но это приводило к менее точной перемотке, чем если бы мы игнорировали ее и предполагали, что файл имеет постоянный битрейт.
    • MPEG2-TS: добавлена поддержка DTS, DTS-LBR и DTS:X Profile2 (#275).
    • Извлекайте типы аудио из дескрипторов TS и сопоставляйте их с флагами ролей, чтобы пользователи могли выбирать аудиодорожки (#973).
  • Аудио:
    • Улучшен алгоритм пропуска тишины с плавным изменением громкости. Сохранена минимальная тишина и более естественная продолжительность тишины (#7423).
    • Более детерминированное сообщение о пропущенной тишине (#1035).
  • Видео:
    • Измените конструктор MediaCodecVideoRenderer, который принимает аргумент VideoFrameProcessor.Factory, и замените его конструктором, который принимает аргумент VideoSinkProvider. Приложения, в которые нужно внедрить собственный объект VideoFrameProcessor.Factory, могут создать экземпляр CompositingVideoSinkProvider, использующий этот объект VideoFrameProcessor.Factory, и передать поставщика приемника видео в MediaCodecVideoRenderer.
  • Текст:
    • Исправлена сериализация битовых карт, чтобы устранить ошибку Tried to marshall a Parcel that contained Binder objects при использовании DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: игнорировать значение rowLock. Согласно спецификации CEA-708-E S-2023, значения rowLock и columnLock должны считаться истинными независимо от значений в потоке (поддержка columnLock не реализована, поэтому фактически считается, что значение всегда ложно).
  • Изображение:
    • Добавлена поддержка значков DASH. Изображения сетки обрезаются, и отдельные значки передаются в ImageOutput незадолго до времени их показа.
  • DRM:
    • По умолчанию сразу воспроизводить незашифрованные фрагменты в контенте с DRM, даже если ключи для последующих зашифрованных фрагментов ещё не готовы. Это может привести к остановке воспроизведения, если ключи не будут готовы, когда позиция воспроизведения достигнет зашифрованных фрагментов (но ранее воспроизведение вообще не начиналось бы в этот момент). Это поведение можно отключить с помощью MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey или DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
      • Расширение IMA:
    • Исправлена ошибка, из-за которой не воспроизводились объявления DASH и HLS без подходящего расширения имени файла.
  • Сеанс:
    • Отключено распознавание двойного нажатия в приложениях для телевизоров (#962).
    • Исправлена ошибка, из-за которой MediaItem.RequestMetadata с ненулевыми дополнительными данными не передавался между контроллерами мультимедиа и сеансами.
    • Добавлен конструктор для MediaLibrarySession.Builder, который принимает только Context вместо MediaLibraryService.
  • Расширение HLS:
    • Уменьшите видимость HlsMediaPeriod до package-private. Этот тип не должен напрямую зависеть от внешнего пакета HLS.
    • Более эффективный переход к началу сегмента (#1031).
  • Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
    • Декодер MIDI: игнорирование сообщений о событиях SysEx (#710).
  • Инструменты для тестирования:
    • Не приостанавливать воспроизведение в TestPlayerRunHelper.playUntilPosition. Тест сохраняет воспроизведение в состоянии воспроизведения, но приостанавливает прогресс до тех пор, пока тест не сможет добавить утверждения и дальнейшие действия.
  • Демонстрационное приложение:
    • Добавьте модуль с демонстрацией коротких видео, чтобы показать, как использовать PreloadMediaSource для создания коротких видео.

Версия 1.3.0-rc01

22 февраля 2024 г.

Используйте стабильную версию 1.3.0.

Версия 1.3.0-beta01

7 февраля 2024 г.

Используйте стабильную версию 1.3.0.

Версия 1.3.0-alpha01

15 января 2024 г.

Используйте стабильную версию 1.3.0.

Версия 1.2.0

Версия 1.2.1

9 января 2024 г.

  • ExoPlayer:
    • Исправлена ошибка, из-за которой при ручном поиске за пределами диапазона LiveConfiguration.min/maxOffset смещение постоянно сбрасывалось на min/maxOffset.
    • Исправлена ошибка, из-за которой макеты каналов OPUS и VORBIS были неправильными для 3, 5, 6, 7 и 8 каналов (#8396).
    • Исправлена ошибка, из-за которой при выборе трека после перемотки к началу трансляции она начиналась с позиции по умолчанию (#9347).
    • Исправлена ошибка, из-за которой новые экземпляры CmcdData.Factory получали отрицательные значения для bufferedDurationUs из источников фрагментов, что приводило к IllegalArgumentException (#888).
  • Трансформер:
    • Устранена проблема, из-за которой кодировщик выдавал ошибку во время настройки из-за высокой рабочей скорости.
  • Экстракторы:
    • Отмечайте дополнительные (невоспроизводимые) дорожки HEVC в фото с движением в формате JPEG как ROLE_FLAG_ALTERNATE, чтобы они не выбирались автоматически для воспроизведения из-за более высокого разрешения.
    • Исправлена ошибка, из-за которой неправильно определялись ключевые кадры для потоков TS H264 (#864).
    • Исправлена оценка продолжительности потоков TS, которые длятся дольше 47 721 секунды (#855).
  • Аудио:
    • Исправлена обработка EOS для SilenceSkippingAudioProcessor при многократном вызове (#712).
  • Видео:
    • Добавлено временное решение проблемы, из-за которой на устройствах Galaxy Tab S7 FE, Chromecast с Google TV и Lenovo M10 FHD Plus потоки AVC с частотой 60 кадров/с помечались как неподдерживаемые (#693).
  • Метаданные:
    • Исправлена ошибка, из-за которой MediaMetadata заполнялся только из комментариев Vorbis с ключами в верхнем регистре (#876).
    • Исправлена ошибка OutOfMemoryError, возникавшая при обработке очень больших фреймов ID3. Теперь воспроизведение продолжается без информации из тегов, а не прерывается полностью.
  • DRM:
    • Расширен обходной путь для ложного URL лицензии ClearKey https://default.url до API 33+ (ранее обходной путь применялся только к API 33) (#837).
    • Исправлена ошибка ERROR_DRM_SESSION_NOT_OPENED, возникавшая при переключении с зашифрованного контента на незашифрованный, если к проигрывателю не была подключена поверхность. Ошибка возникла из-за неправильного использования защищенного декодера для воспроизведения незащищенного контента.
  • Сеанс:
    • Специальные ключи и значения помещаются в MediaMetadataCompat для MediaMetadata.extras и MediaMetadata.extras для MediaMetadataCompat (#756, #802).
    • Исправлена трансляция notifyChildrenChanged для устаревших контроллеров (#644).
    • Исправлена ошибка, из-за которой установка отрицательного времени для отключенного таймера setWhen уведомления приводила к сбою на некоторых устройствах (#903).
    • Исправлена ошибка IllegalStateException, возникавшая, когда контроллер уведомлений мультимедиа не успевал подключиться к моменту запроса первого обновления уведомлений (#917).
  • Интерфейс:
    • Исправлена ошибка, из-за которой кнопки перемотки вперед и назад не отображались при использовании с Material Design в BottomSheetDialogFragment (#511).
    • Исправлена ошибка, из-за которой цифры на кнопке перемотки вперед в PlayerControlView были выровнены неправильно (#547).
  • Расширение DASH:
    • Значение f800 в манифесте DASH для Dolby теперь интерпретируется как 5 каналов (#688).
  • Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
    • MIDI: исправлена ошибка, из-за которой при перемотке вперед пропускались события Program Change (#704).
    • Переход на FFmpeg 6.0 и обновление поддерживаемого NDK до r26b (#707, #867).
  • Расширение Cast:
    • Исправлена ошибка, из-за которой при сбое загрузки медиаконтента на устройстве Cast приложение аварийно завершало работу во время создания Timeline (#708).

Версия 1.2.0

15 ноября 2023 г.

  • Общая библиотека:
    • Добавьте параметр @Nullable Throwable в методы интерфейса Log.Logger. Параметр message этих методов больше не содержит информацию о Throwable, переданном методам Log.{d,i,w,e}(), поэтому при необходимости реализации должны добавлять эту информацию вручную (например, с помощью Logger.appendThrowableString(String, Throwable)).
    • Исправлена проблема совместимости с Kotlin, из-за которой допускающие значение NULL параметры обобщенного типа и типы элементов массива не определялись как допускающие значение NULL. Примеры: параметры методов TrackSelectorResult и SimpleDecoder (#6792).
    • Измените интерфейс по умолчанию и поведение уведомлений в Util.shouldShowPlayButton, чтобы показывать кнопку воспроизведения, когда оно временно приостановлено (например, из-за потери аудиофокуса). Чтобы сохранить прежнее поведение, используйте PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) или MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Чтобы устранить проблему, обновите androidx.annotation:annotation-experimental до версии 1.3.1. https://issuetracker.google.com/251172715.
    • Перенесите ExoPlayer.setAudioAttributes в интерфейс Player.
  • ExoPlayer:
    • Исправлены проблемы с перемоткой в потоках AC4, вызванные неправильной идентификацией фрагментов, предназначенных только для декодирования (#11000).
    • Добавлено подавление воспроизведения на неподходящих устройствах вывода звука (например, на встроенном динамике устройств Wear OS), когда эта функция включена через ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Если воспроизведение будет запущено, когда нет подходящих аудиовыходов, или если все подходящие выходы будут отключены во время воспроизведения, причина подавления воспроизведения будет изменена на Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT. Причина подавления будет удалена, когда будет подключен подходящий выход.
    • Добавьте MediaSource.canUpdateMediaItem и MediaSource.updateMediaItem, чтобы принимать обновления MediaItem после создания через Player.replaceMediaItem(s).
    • Разрешено обновлять MediaItem для всех классов MediaSource, предоставляемых библиотекой через Player.replaceMediaItem(s) (#33, #9978).
    • Переименуйте MimeTypes.TEXT_EXOPLAYER_CUES в MimeTypes.APPLICATION_MEDIA3_CUES.
    • Добавьте PngExtractor, который отправляет и считывает весь PNG-файл в TrackOutput как один образец.
    • Улучшите метод SequenceableLoader.continueLoading(long) в интерфейсе SequenceableLoader до SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo содержит дополнительные параметры, в том числе playbackSpeed и lastRebufferRealtimeMs, а также существующий параметр playbackPositionUs.
    • Улучшите метод ChunkSource.getNextChunk(long, long, List, ChunkHolder) в интерфейсе ChunkSource до ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Добавлены дополнительные поля в журнал Common Media Client Data (CMCD): buffer starvation (bs), deadline (dl), скорость воспроизведения (pr) и startup (su) (#8699).
    • Добавлена глубина цвета для яркости и цветности в ColorInfo (#491).
    • В журнал Common Media Client Data (CMCD) добавлены дополнительные поля: запрос следующего объекта (nor) и запрос следующего диапазона (nrr) (#8699).
    • Добавлена возможность передавать данные CMCD с помощью параметров запроса (#553).
    • Исправлена ошибка ConcurrentModificationException в ExperimentalBandwidthMeter (#612).
    • Добавьте параметр MediaPeriodId в CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Добавлена поддержка ClippingMediaSource (и других источников со смещением по времени периода/окна) в ConcatenatingMediaSource2 (#11226).
    • Измените BaseRenderer.onStreamChanged(), чтобы также получать аргумент MediaPeriodId.
  • Трансформер:
    • Анализировать данные EXIF о повороте для входных изображений.
    • Удалите тип аннотации TransformationRequest.HdrMode и связанные с ним константы. Используйте вместо него Composition.HdrMode и связанные с ним константы.
    • Чтобы устранить проблемы с поворотом, упростите OverlaySettings.
    • Параметры frameRate и durationUs для SampleConsumer.queueInputBitmap изменены на TimestampIterator.
  • Выбор дорожки:
    • Добавьте DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness, чтобы явно разрешить или запретить адаптацию с задержкой. По умолчанию будет использоваться текущее поведение true.
  • Экстракторы:
    • MPEG-TS: обеспечена отрисовка последнего кадра за счет передачи последнего блока доступа потока в очередь выборки (#7909).
    • Исправлена опечатка при определении rotationDegrees. projectionPosePitch заменено на projectionPoseRoll (#461).
    • Удалите предположение о том, что экземпляры Extractor можно напрямую проверять с помощью instanceof. Если вам нужен доступ к сведениям о реализации Extractor во время выполнения, сначала вызовите Extractor.getUnderlyingInstance.
    • Добавьте BmpExtractor.
    • Добавьте WebpExtractor.
    • Добавьте HeifExtractor.
    • Добавьте поддержку QuickTime classic в Mp4Extractor.
  • Аудио:
    • Добавлена поддержка 24- и 32-битных PCM с обратным порядком байтов в MP4 и Matroska, а также синтаксический анализ кодировки PCM для lpcm в MP4.
    • Добавлена поддержка извлечения аудио Vorbis в MP4.
    • Добавьте AudioSink.getFormatOffloadSupport(Format), который получает уровень поддержки разгрузки, который приемник может обеспечить для формата через DefaultAudioOffloadSupportProvider. Возвращает новый объект AudioOffloadSupport, содержащий isFormatSupported, isGaplessSupported и isSpeedChangeSupported.
    • Добавьте AudioSink.setOffloadMode(), с помощью которого настраивается конфигурация разгрузки на приемнике аудио. Значение по умолчанию — AudioSink.OFFLOAD_MODE_DISABLED.
    • Включить выгрузку можно в TrackSelectionParameters, выбрав setAudioOffloadPreference. Если в настройках указано, что разгрузка должна быть включена, устройство поддерживает разгрузку для формата, а в качестве дорожки выбрана одна аудиодорожка, то разгрузка аудио будет включена.
    • Если для audioOffloadModePreference задано значение AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, то DefaultTrackSelector выберет только аудиодорожку и только в том случае, если ее формат поддерживается при разгрузке. Если ни одна звуковая дорожка не поддерживается в режиме разгрузки, то ни одна дорожка не будет выбрана.
    • Поддержка непрерывного воспроизведения для разгрузки отключена на устройствах с уровнем API ниже 33 из-за проблемы с позицией воспроизведения после перехода между треками.
    • Удалите параметр enableOffload из сигнатуры метода DefaultRenderersFactory.buildAudioSink.
    • Удалить способ "DefaultAudioSink.Builder.setOffloadMode".
    • Удалить значение intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Добавлена поддержка метаданных Opus для непрерывного воспроизведения при разгрузке.
    • Добавлена возможность восстанавливать рендерер, отключая разгрузку, если первая запись не удалась (#627).
    • Включить планирование разгрузки по умолчанию для воспроизведения только аудио в режиме разгрузки.
    • Удалите ExoPlayer.experimentalSetOffloadSchedulingEnabled и AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Название onExperimentalSleepingForOffloadChanged изменено на onSleepingForOffloadChanged, а onExperimentalOffloadedPlayback – на onOffloadedPlayback.
    • Переместите интерфейсы и определения TrackSelectionParameters, связанные с режимом разгрузки аудио, во внутренний класс AudioOffloadPreferences.
    • Добавьте обратные вызовы onAudioTrackInitialized и onAudioTrackReleased в AnalyticsListener, AudioRendererEventListener и AudioSink.Listener.
    • Исправлена ошибка, из-за которой происходило опустошение буфера аудио DTS Express (#650).
    • Исправлена ошибка, из-за которой проверка возможностей для E-AC3-JOC вызывала исключение IllegalArgumentException (#677).
  • Видео:
    • Разрешить MediaCodecVideoRenderer использовать собственный VideoFrameProcessor.Factory.
    • Исправлена ошибка, из-за которой первый кадр не мог быть отрисован, если аудиопоток начинался с отрицательных временных меток (#291).
  • Текст:
    • Удалить ExoplayerCuesDecoder Текстовые дорожки с sampleMimeType = application/x-media3-cues теперь обрабатываются напрямую с помощью TextRenderer без необходимости в экземпляре SubtitleDecoder.
  • Метаданные:
    • MetadataDecoder.decode больше не будет вызываться для семплов, предназначенных только для декодирования, поскольку реализация в любом случае должна возвращать значение null.
  • Эффект:
    • Добавьте VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>), чтобы поставить в очередь входные данные битовой карты по временной метке.
    • Сделайте VideoFrameProcessor.registerInputStream() неблокирующим. В приложениях должен быть реализован метод VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Параметры frameRate и durationUs для VideoFrameProcessor.queueInputBitmap изменены на TimestampIterator.
  • Расширение IMA:
    • Исправлена ошибка, из-за которой прямая трансляция DASH с несколькими периодами, не являющаяся первым элементом в плейлисте, могла вызывать исключение (#571).
    • Освободите StreamManager перед вызовом AdsLoader.destroy().
    • Версия IMA SDK обновлена до 3.31.0.
  • Сеанс:
    • Для активной службы уведомлений задано поведение FOREGROUND_SERVICE_IMMEDIATE в DefaultMediaNotificationProvider (#167).
    • Используйте только android.media.session.MediaSession.setMediaButtonBroadcastReceiver() выше API 31, чтобы избежать проблем с устаревшим API на устройствах Samsung (#167).
    • Используйте контроллер уведомлений мультимедиа в качестве прокси-сервера, чтобы задать доступные команды и макет, который будет использоваться для заполнения уведомления и сеанса платформы.
    • Преобразуйте события кнопок мультимедиа, полученные MediaSessionService.onStartCommand(), в Media3, а не направляйте их в сеанс платформы и обратно в Media3. Таким образом, контроллер звонящего всегда является контроллером уведомлений мультимедиа, и приложения могут легко распознавать звонки, поступающие из уведомления, одинаково на всех поддерживаемых уровнях API.
    • Исправлена ошибка, из-за которой MediaController.getCurrentPosition() не продвигается при подключении к устаревшему MediaSessionCompat.
    • Добавьте MediaLibrarySession.getSubscribedControllers(mediaId) для удобства.
    • Переопределите MediaLibrarySession.Callback.onSubscribe(), чтобы подтвердить доступность родительского идентификатора, на который подписан контроллер. Если все в порядке, подписка принимается и сразу же вызывается notifyChildrenChanged(), чтобы сообщить об этом браузеру (#561).
    • Добавьте демонстрационный модуль сеанса для Automotive OS и включите демонстрацию сеанса для Android Auto.
    • Не настраивайте очередь сеанса фреймворка, если COMMAND_GET_TIMELINE недоступен для контроллера уведомлений мультимедиа. Поскольку Android Auto выступает в качестве клиентского контроллера, считывающего данные из сеанса фреймворка, кнопка queue в интерфейсе Android Auto не показывается (#339).
    • По умолчанию вместо SimpleBitmapLoader используется DataSourceBitmapLoader (#271, #327).
    • Добавлен метод MediaSession.Callback.onMediaButtonEvent(Intent), который позволяет приложениям переопределять обработку событий кнопок мультимедиа по умолчанию.
  • Интерфейс:
    • Добавьте реализацию Player.Listener для устройств Wear OS, которая обрабатывает подавление воспроизведения из-за Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT, запуская системное диалоговое окно, позволяющее пользователю подключить подходящий аудиовыход (например, наушники Bluetooth). Воспроизведение автоматически возобновится, если подходящее устройство будет подключено в течение настраиваемого времени ожидания (по умолчанию – 5 минут).
  • Скачивания:
    • Объявите тип активной службы "Синхронизация данных" для приложения "DownloadService", чтобы обеспечить совместимость с Android 14. При использовании этого сервиса приложение также должно добавить dataSync как foregroundServiceType в манифест и добавить разрешение FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Расширение HLS:
    • Обновление плейлиста трансляции HLS с интервалом, рассчитанным на основе времени начала последней загрузки, а не времени ее завершения (#663).
  • Расширение DASH:
    • Разрешить несколько одинаковых идентификаторов DASH в URL шаблона сегмента.
    • Добавлена экспериментальная поддержка синтаксического анализа субтитров во время извлечения. В нем лучше поддерживается объединение перекрывающихся субтитров, в том числе устранено мерцание при переходе между сегментами субтитров. Включить ее можно с помощью DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Расширение RTSP:
    • Исправлено состояние гонки, которое могло приводить к ошибке IndexOutOfBoundsException при возврате к TCP или зависанию воспроизведения в некоторых ситуациях.
    • Проверка состояния в настройках RTSP при возврате состояния загрузки RtspMediaPeriod (#577).
    • Игнорирование специальных методов запроса RTSP в общедоступном заголовке ответа Options (#613).
    • Использовать значение тайм-аута ответа на запрос настройки RTSP в интервале времени отправки запросов RTSP Options для поддержания активности (#662).
  • Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
    • Выпущен модуль декодера MIDI, который обеспечивает поддержку воспроизведения стандартных MIDI-файлов с помощью библиотеки Jsyn для синтеза аудио.
    • Добавьте DecoderOutputBuffer.shouldBeSkipped, чтобы напрямую помечать выходные буферы, которые не нужно показывать. Это предпочтительный вариант по сравнению с C.BUFFER_FLAG_DECODE_ONLY, поддержка которого будет прекращена.
    • Добавьте Decoder.setOutputStartTimeUs и SimpleDecoder.isAtLeastOutputStartTimeUs, чтобы декодеры могли удалять образцы, предназначенные только для декодирования, до времени начала. Рекомендуем использовать его вместо правила Buffer.isDecodeOnly, поддержка которого будет прекращена.
    • Исправлена ошибка, из-за которой не удавалось опубликовать артефакт декодера MIDI в репозитории Maven. Артефакт переименован в media3-exoplayer-midi (#734).
  • Расширение Leanback:
    • Исправлена ошибка, из-за которой отключение поверхности могло вызвать ArithmeticException в коде Leanback (#617).
  • Инструменты для тестирования:
    • Сделайте TestExoPlayerBuilder и FakeClock совместимыми с тестами Espresso UI и Compose UI. Это исправляет ошибку, из-за которой воспроизведение продвигается недетерминированно во время взаимодействий с представлениями Espresso или Compose.
  • Удалите устаревшие символы:
    • Удалите TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) и TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Используйте Composition.Builder.setHdrMode(int) и передайте Composition в Transformer.start(Composition, String).
    • Удалите устаревший метод DownloadNotificationHelper.buildProgressNotification и используйте вместо него актуальный метод, который принимает параметр notMetRequirements.

Версия 1.2.0-rc01

1 ноября 2023 г.

Используйте стабильную версию 1.2.0.

Версия 1.2.0-beta01

19 октября 2023 г.

Используйте стабильную версию 1.2.0.

Версия 1.2.0-alpha02

29 сентября 2023 г.

Используйте стабильную версию 1.2.0.

Версия 1.2.0-alpha01

17 августа 2023 г.

Используйте стабильную версию 1.2.0.

Версия 1.1.0

Версия 1.1.1

16 августа 2023 г.

  • Общая библиотека:
    • Удалена случайно добавленная зависимость multidex из всех модулей (#499).
  • ExoPlayer:
    • Исправлена ошибка в PlaybackStatsListener, из-за которой после очистки плейлиста создавались ложные PlaybackStats.
    • Добавлены дополнительные поля в журнал Common Media Client Data (CMCD): формат потоковой передачи (sf), тип потока (st), версия (v), максимальная скорость передачи данных (tb), продолжительность объекта (d), измеренная пропускная способность (mtp) и тип объекта (ot) (#8699).
  • Аудио:
    • Исправлена ошибка, из-за которой Player.getState() не переходил в STATE_ENDED при воспроизведении очень коротких файлов (#538).
  • Разгрузка аудио:
    • Добавьте заголовок идентификатора Ogg и страницы заголовка комментария к битовому потоку для разгруженного воспроизведения Opus в соответствии с RFC 7845.
  • Видео:
    • H.265/HEVC: исправлена обработка информации о краткосрочных и долгосрочных опорных кадрах в SPS.
  • Текст:
    • CEA-608: изменена логика усечения подсказок, чтобы учитывался только видимый текст. Ранее при ограничении длины реплики до 32 символов учитывались отступы и табуляция (что технически соответствовало спецификации) (#11019).
  • Расширение IMA:
    • Версия IMA SDK обновлена до 3.30.3.
  • Сеанс:
    • Добавьте собственный макет в состояние контроллера и предоставьте метод получения для доступа к нему. При изменении специального макета вызывается MediaController.Listener.onCustomLayoutChanged. Приложения, которые хотят отправлять разные макеты разным контроллерам Media3, могут делать это в MediaSession.Callback.onConnect с помощью AcceptedResultBuilder. Так макет будет доступен контроллеру, когда подключение завершится.
    • Исправлены случаи, когда MediaLibraryServiceLegacyStub отправлял ошибку в Result, который не поддерживал это, что приводило к UnsupportedOperationException (#78).
    • Исправлена ошибка, из-за которой PlayerWrapper создавал VolumeProviderCompat, определяя volumeControlType как с помощью устаревших команд (COMMAND_ADJUST_DEVICE_VOLUME и COMMAND_SET_DEVICE_VOLUME), так и с помощью новых (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS и COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Версия 1.1.0

5 июля 2023 г.

  • Общая библиотека:
    • Добавьте причину подавления для неподходящего аудиомаршрута и воспроизведите, когда будете готовы. Измените причину слишком долгого подавления. (#15).
    • Добавьте команды в проигрыватель:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Добавьте в Player перегруженные методы, которые позволяют пользователям указывать флаги громкости:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Добавьте Builder для DeviceInfo и прекратите поддержку существующего конструктора.
    • Добавьте DeviceInfo.routingControllerId, чтобы указать идентификатор контроллера маршрутизации для удаленного воспроизведения.
    • Добавлен ярлык Player.replaceMediaItem(s) для добавления и удаления элементов в одной позиции (#8046).
  • ExoPlayer:
    • Разрешите ExoPlayer управлять громкостью устройства, только если пользователь явно дал на это согласие. Используйте ExoPlayer.Builder.setDeviceVolumeControlEnabled, чтобы получить доступ к следующим возможностям:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) и setDeviceVolume(int, int)
      • increaseDeviceVolume(int) и increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) и decreaseDeviceVolume(int, int)
    • Добавьте FilteringMediaSource, чтобы фильтровать доступные типы треков из MediaSource.
    • Добавлена поддержка включения данных Common Media Client Data (CMCD) в исходящие запросы адаптивных форматов потоковой передачи DASH, HLS и SmoothStreaming. Добавлены поля br, bl, cid, rtp и sid (#8699). Структура и методы API:
      • По умолчанию ведение журнала CMCD отключено. Чтобы включить его, используйте MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory).
      • По умолчанию включены все ключи. Чтобы отфильтровать ключи, которые регистрируются, переопределите CmcdConfiguration.RequestConfig.isKeyAllowed(String key).
      • Переопределите CmcdConfiguration.RequestConfig.getCustomData(), чтобы включить ведение журнала специальных ключей.
    • В манифест основного демоприложения добавлено дополнительное действие, которое упрощает запуск приложения с пользовательским файлом *.exolist.json (#439).
    • Добавьте ExoPlayer.setVideoEffects(), чтобы использовать Effect во время воспроизведения видео.
    • Обновите SampleQueue, чтобы хранить sourceId как long, а не int. Это изменяет сигнатуры общедоступных методов SampleQueue.sourceId и SampleQueue.peekSourceId.
    • Добавьте параметры в методы shouldStartPlayback и onTracksSelected класса LoadControl, чтобы связать эти методы с соответствующим объектом MediaPeriod.
    • Измените сигнатуру ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), добавив параметр временной шкалы, который содержит периоды с UID, используемыми в качестве ключей в карте. Это необходимо, чтобы избежать проблем с параллельной обработкой в трансляциях с несколькими периодами.
    • Прекратить поддержку EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) и BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Вместо этого можно вызвать вариант методов без mediaTimeOffsetUs. Обратите внимание, что даже для устаревших вариантов смещение больше не добавляется к startTimeUs и endTimeUs объектов MediaLoadData, отправляемых диспетчером.
    • Переименуйте ExoTrackSelection.blacklist в excludeTrack, а isBlacklisted – в isTrackExcluded.
    • Исправлено несоответствие между ExoPlayer.setMediaItem(s) и addMediaItem(s) при вызове пустого плейлиста.
  • Трансформер:
    • Удалить Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) Используйте вместо него правила ExoPlayerAssetLoader.Factory(MediaSource.Factory) и Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Удалить Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
    • Исправлена ошибка, из-за которой преобразование могло зависнуть (что приводило к тайм-ауту мультиплексора), если конец видеопотока был зафиксирован в момент, когда входной кадр ожидал обработки.
    • Запрашивайте кодеки через MediaCodecList, а не утилиты findDecoder/EncoderForFormat, чтобы расширить поддержку.
    • Удалите конфигурацию B-кадров в DefaultEncoderFactory, так как она не работает на некоторых устройствах.
  • Выбор трека:
    • Добавьте DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange которая по умолчанию отключена. Если включить DefaultTrackSelector, то при изменении возможностей средства отрисовки будет запускаться выбор нового трека.
  • Экстракторы:
    • Ogg: исправлена ошибка при поиске в файлах с большой продолжительностью (#391).
    • FMP4: исправлена ошибка, из-за которой TimestampAdjuster инициализирует неправильное смещение временной метки со временем выборки метаданных из атома emsg (#356).
  • Аудио:
    • Исправлена ошибка, из-за которой не воспроизводились некоторые видео, если включено туннелирование и активны AudioProcessors, например при обрезке без пауз (#10847).
    • Инкапсулировать фреймы Opus в пакеты Ogg при прямом воспроизведении (разгрузка).
    • Экстраполировать текущее положение во время сна с планированием разгрузки.
    • Добавьте Renderer.release() и AudioSink.release(), чтобы освобождать ресурсы в конце жизненного цикла проигрывателя.
    • Отслеживание изменений в возможностях аудио в DefaultAudioSink Добавьте обязательный параметр context в конструктор DefaultAudioSink, с помощью которого DefaultAudioSink будет регистрироваться как прослушиватель AudioCapabilitiesReceiver и обновлять свое свойство audioCapabilities при получении информации об изменении функций.
    • Передавать изменения возможностей аудио через новое событие onAudioCapabilitiesChanged в интерфейсе AudioSink.Listener и новый интерфейс RendererCapabilities.Listener, который запускает события onRendererCapabilitiesChanged.
    • Добавьте ChannelMixingAudioProcessor, чтобы применить масштабирование или микширование к аудиоканалам.
    • Добавьте новое целочисленное значение DISCARD_REASON_AUDIO_BYPASS_POSSIBLE в DecoderDiscardReasons, чтобы отключать декодер аудио, когда после изменения возможностей аудио можно использовать режим обхода.
    • Добавлена поддержка прямого воспроизведения для DTS Express и DTS:X (#335).
  • Видео:
    • Сделайте так, чтобы MediaCodecVideoRenderer сообщал о VideoSize с шириной и высотой, равными 0, когда средство визуализации отключено. Player.Listener.onVideoSizeChanged вызывается при изменении Player.getVideoSize(). Теперь размер видео ExoPlayer с MediaCodecVideoRenderer имеет ширину и высоту 0, если Player.getCurrentTracks не поддерживает видео или размер поддерживаемой видеодорожки ещё не определен.
  • DRM:
    • Снижена видимость нескольких внутренних методов в DefaultDrmSession, которые не должны вызываться за пределами пакета DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Мультиплексор:
    • Добавлена новая библиотека мультиплексора, которую можно использовать для создания файла контейнера MP4.
  • Расширение IMA:
    • Включите многопериодные трансляции DASH для динамической вставки объявлений. Обратите внимание, что текущая реализация пока не поддерживает перемотку в прямых трансляциях (#10912).
    • Исправлена ошибка, из-за которой в прямые трансляции вставлялась новая группа объявлений, поскольку рассчитанная позиция контента в последовательных временных шкалах немного различалась.
  • Сеанс:
    • Добавьте вспомогательный метод MediaSession.getControllerForCurrentRequest, чтобы получать информацию о контроллере, который в данный момент вызывает метод Player.
    • Добавьте androidx.media3.session.MediaButtonReceiver, чтобы приложения могли возобновлять воспроизведение с помощью событий кнопок мультимедиа, отправляемых, например, Bluetooth-гарнитурой (#167).
    • Добавлена реализация по умолчанию для MediaSession.Callback.onAddMediaItems, чтобы запрашиваемые MediaItems можно было передавать в Player, если у них есть LocalConfiguration (например, URI) (#282).
    • Добавлены кнопки "Перейти к предыдущему" и "Перейти к следующему" в компактном режиме уведомлений медиа по умолчанию для Android 12 и более ранних версий (#410).
    • Добавлена реализация по умолчанию для MediaSession.Callback.onAddMediaItems, чтобы запрашиваемые MediaItems можно было передавать в Player, если у них есть LocalConfiguration (например, URI) (#282).
    • Добавлены кнопки "Перейти к предыдущему" и "Перейти к следующему" в компактном режиме уведомлений медиа по умолчанию для Android 12 и более ранних версий (#410).
  • Интерфейс:
    • Добавьте методы Util shouldShowPlayButton и handlePlayPauseButtonAction, чтобы создать собственные элементы интерфейса с кнопкой воспроизведения/паузы.
  • Расширение RTSP:
    • Для MPEG4-LATM используется значение profile-level-id по умолчанию, если оно отсутствует в сообщении SDP Describe Response (#302).
    • Использовать базовый URI для разрешения относительного пути из сеанса RTSP, если он присутствует в заголовке ответа DESCRIBE (#11160).
  • Расширение DASH:
    • Удалите смещение по времени из MediaLoadData.startTimeMs и MediaLoadData.endTimeMs для потоков DASH с несколькими периодами.
    • Исправлена ошибка, из-за которой повторная подготовка источника медиаконтента DASH с несколькими периодами приводила к возникновению ошибки IndexOutOfBoundsException (#10838).
  • Расширение HLS:
    • Добавьте HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), чтобы задать время ожидания инициализации TimestampAdjuster для потока загрузки. Если инициализация не завершится до истечения времени ожидания, будет выдана ошибка PlaybackException, чтобы избежать бесконечной остановки воспроизведения. По умолчанию время ожидания равно нулю (#323).
  • Инструменты для тестирования:
    • Проверьте, не зависит ли схема URI от регистра в DataSourceContractTest.
  • Удалите устаревшие символы:
    • Удалите конструкторы DefaultAudioSink и используйте вместо них DefaultAudioSink.Builder.
    • Удалите HlsMasterPlaylist и используйте HlsMultivariantPlaylist.
    • Удалить Player.stop(boolean) Вместо него используйте Player.stop() и Player.clearMediaItems() (если reset – это true).
    • Удалены два устаревших конструктора SimpleCache. Вместо них используйте конструктор, который принимает DatabaseProvider, чтобы повысить производительность.
    • Удалите конструктор DefaultBandwidthMeter и используйте вместо него DefaultBandwidthMeter.Builder.
    • Удалите конструкторы DefaultDrmSessionManager и используйте вместо них DefaultDrmSessionManager.Builder.
    • Удалите два устаревших конструктора HttpDataSource.InvalidResponseCodeException и используйте конструктор, который принимает дополнительные поля (cause, responseBody), чтобы улучшить ведение журнала ошибок.
    • Удалите DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash и DownloadHelper.forSmoothStreaming и используйте вместо них DownloadHelper.forMediaItem.
    • Удалите устаревший конструктор DownloadService и используйте вместо него конструктор, который позволяет указать параметр channelDescriptionResourceId.
    • Удалите устаревшие строковые константы для наборов символов (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME и UTF16LE_NAME). Вместо них используйте наборы символов Kotlin из пакета kotlin.text, java.nio.charset.StandardCharsets или com.google.common.base.Charsets.
    • Удалите устаревший конструктор WorkManagerScheduler и используйте вместо него конструктор, который позволяет указать параметр Context.
    • Удалите устаревшие методы createVideoSampleFormat, createAudioSampleFormat, createContainerFormat и createSampleFormat, которые использовались для создания экземпляра класса Format. Для создания экземпляров Format используйте Format.Builder.
    • Удалите устаревшие методы copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate и copyWithVideoSize. Вместо них используйте Format.buildUpon() и методы setter.
    • Удалите устаревший элемент ExoPlayer.retry() и используйте вместо него prepare().
    • Удалите устаревший конструктор DefaultTrackSelector с нулевым аргументом и используйте вместо него DefaultTrackSelector(Context).
    • Удалите устаревший конструктор OfflineLicenseHelper и используйте вместо него OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Удалите устаревший конструктор DownloadManager и используйте вместо него конструктор, который принимает Executor.
    • Удалите устаревшие конструкторы Cue и используйте вместо них Cue.Builder.
    • Удалите устаревший конструктор OfflineLicenseHelper и используйте вместо него OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Удалите четыре устаревших метода AnalyticsListener:
      • onDecoderEnabled, используйте вместо него onAudioEnabled и/или onVideoEnabled.
      • onDecoderInitialized, используйте вместо него onAudioDecoderInitialized и/или onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, используйте вместо него onAudioInputFormatChanged и/или onVideoInputFormatChanged.
      • onDecoderDisabled, используйте вместо него onAudioDisabled и/или onVideoDisabled.
    • Удалите устаревшие Player.Listener.onSeekProcessed и AnalyticsListener.onSeekProcessed и используйте вместо них onPositionDiscontinuity с DISCONTINUITY_REASON_SEEK.
    • Удалите ExoPlayer.setHandleWakeLock(boolean) и используйте вместо него setWakeMode(int).
    • Удалите устаревший атрибут DefaultLoadControl.Builder.createDefaultLoadControl() и используйте вместо него build().
    • Удалите устаревший атрибут MediaItem.PlaybackProperties и используйте вместо него MediaItem.LocalConfiguration. Поле MediaItem.playbackProperties больше не поддерживается и теперь относится к типу MediaItem.LocalConfiguration.

Версия 1.1.0-rc01

21 июня 2023 г.

Используйте стабильную версию 1.1.0.

Версия 1.1.0-beta01

7 июня 2023 г.

Используйте стабильную версию 1.1.0.

Версия 1.1.0-alpha01

10 мая 2023 г.

Используйте стабильную версию 1.1.0.

Версия 1.0.0

Версия 1.0.2

18 мая 2023 г.

Данные "androidx.media3:media3-*:1.0.2" опубликованы. Версия 1.0.2 содержит эти коммиты.

Этот выпуск соответствует ExoPlayer 2.18.7.

В этой версии внесены следующие изменения по сравнению с версией 1.0.1:

  • Основная библиотека:
    • Добавьте Buffer.isLastSample(), чтобы указать, содержит ли Buffer флаг C.BUFFER_FLAG_LAST_SAMPLE.
    • Исправлена ошибка, из-за которой последний кадр мог не отрисовываться, если последний образец с кадрами удалялся из очереди без считывания образца "конец потока". (#11079).
  • Экстракторы:
    • Исправлена обработка H.265 SPS в файлах MPEG-TS за счет повторного использования логики обработки, которая уже применяется экстракторами RTSP и MP4 (#303).
  • Текст:
    • SSA: добавлена поддержка файлов UTF-16, если они начинаются с маркера последовательности байтов (#319).
  • Сеанс:
    • Исправлена ошибка, из-за которой MediaController не обновляет доступные команды при подключении к устаревшему устройству MediaSessionCompat, которое обновляет свои действия.
    • Исправлена ошибка, из-за которой MediaLibraryService не возвращал значение null при вызове из системного интерфейса в Callback.onGetLibraryRoot с params.isRecent == true в API 30 (#355).
    • Устранена утечка памяти MediaSessionService или MediaLibraryService (#346).
    • Исправлена ошибка, из-за которой одновременное обновление Timeline и позиции в MediaSession могло привести к тому, что MediaController выдавал IllegalStateException.

Версия 1.0.1

18 апреля 2023 г.

Данные "androidx.media3:media3-*:1.0.1" опубликованы. Версия 1.0.1 содержит эти коммиты.

Этот выпуск соответствует ExoPlayer 2.18.6.

  • Основная библиотека:
    • Исправлена ошибка, из-за которой при переходе к позиции по умолчанию сбрасывалась переопределенная целевая трансляция (#11051).
    • Исправлена ошибка, из-за которой пустые потоки в медиаконтенте могли приводить к зависанию воспроизведения.
  • Сеанс:
    • Исправлена ошибка, из-за которой несколько идентичных элементов очереди, опубликованных устаревшим MediaSessionCompat, приводили к исключению в MediaController (#290).
    • Добавлена отсутствовавшая переадресация MediaSession.broadcastCustomCommand на устаревший MediaControllerCompat.Callback.onSessionEvent (#293).
    • Исправлена ошибка, из-за которой вызов MediaSession.setPlayer не обновлял доступные команды.
    • Исправлена ошибка, из-за которой экземпляры TrackSelectionOverride, отправленные из MediaController, игнорировались, если они ссылались на группу с Format.metadata (#296).
    • Исправлена ошибка, из-за которой для доступа к метаданным через устаревший MediaSessionCompat требовалось наличие Player.COMMAND_GET_CURRENT_MEDIA_ITEM.
    • Исправлена ошибка, из-за которой экземпляры MediaSession в фоновом потоке приводили к сбоям при использовании в MediaSessionService (#318).
    • Исправлена ошибка, из-за которой библиотека объявляла получатель кнопки мультимедиа без намерения приложения (#314).
  • DASH:
    • Исправлена обработка пустых временных шкал сегментов (#11014).
  • RTSP:
    • Повторите попытку с TCP, если настройка RTSP с UDP не удалась и возникла ошибка RTSP 461 UnsupportedTransport (#11069).

Версия 1.0.0

22 марта 2023 г.

Данные "androidx.media3:media3-*:1.0.0" опубликованы. Версия 1.0.0 содержит эти коммиты.

Этот выпуск соответствует ExoPlayer 2.18.5.

Изменений по сравнению с версией 1.0.0-rc02 нет.

Версия 1.0.0-rc02

2 марта 2023 г.

Данные "androidx.media3:media3-*:1.0.0-rc02" опубликованы. Версия 1.0.0-rc02 содержит эти коммиты.

Этот выпуск соответствует ExoPlayer 2.18.4.

  • Основная библиотека:
    • Исправлено определение типа сети в API 33 (#10970).
    • Исправлена ошибка NullPointerException при вызове ExoPlayer.isTunnelingEnabled (#10977).
  • Скачивания:
    • Добавлена возможность настраивать максимальную разницу между временем начала двух сегментов, которые нужно объединить, в SegmentDownloader и подклассах (#248).
  • Аудио:
    • Исправлена ошибка, из-за которой на устройствах Samsung не работало непрерывное воспроизведение MP3-файлов (#8594).
    • Исправлена ошибка, из-за которой скорость воспроизведения, заданная сразу после отключения аудио, могла быть переопределена предыдущим изменением скорости (#10882).
  • Видео:
    • Сопоставлять формат HEVC HDR10 с HEVCProfileMain10HDR10 вместо HEVCProfileMain10.
    • Добавлено временное решение проблемы с устройством на Chromecast с Google TV и Lenovo M10 FHD Plus, из-за которой потоки AVC с частотой 60 кадров/с помечаются как неподдерживаемые (#10898).
    • Исправлены проблемы производительности при воспроизведении медиаконтента с частотой кадров, которая намного выше частоты обновления экрана.
  • В ролях:
    • Исправлена временная ошибка STATE_IDLE при переходе между мультимедийными объектами (#245).
  • RTSP:
    • Добавлена обработка исключения IllegalArgumentException, которое возникает при синтаксическом анализе недопустимых сообщений с ответом DESCRIBE в протоколе RTSP (#10971).
  • Сеанс:
    • Исправлена ошибка, из-за которой кнопка воспроизведения/паузы в уведомлении не обновлялась в соответствии с состоянием проигрывателя (#192).
  • Расширение IMA:
    • Исправлена ошибка, из-за которой не запускались трансляции с динамической вставкой объявлений, в которых не было рекламы. Это происходило потому, что не поступало первое (и единственное, если рекламы нет) событие LOADED.

Версия 1.0.0-rc01

16 февраля 2023 г.

Данные "androidx.media3:media3-*:1.0.0-rc01" опубликованы. В версию 1.0.0-rc01 входят эти коммиты.

Этот выпуск соответствует ExoPlayer 2.18.3.

  • Основная библиотека:
    • Измените логику упорядочивания декодеров в средстве визуализации, чтобы сохранить настройки MediaCodecSelector, даже если декодер сообщает, что не может воспроизвести медиаконтент. Например, при использовании селектора по умолчанию аппаратный декодер, который поддерживает только функциональные возможности, будет предпочтительнее программного декодера, который полностью поддерживает формат (#10604).
    • Добавьте ExoPlayer.Builder.setPlaybackLooper, который задает существующий поток воспроизведения для нового экземпляра ExoPlayer.
    • Добавлена возможность очищать помощники менеджера скачивания (#10776).
    • Добавьте параметр в BasePlayer.seekTo, чтобы также указать команду, используемую для поиска.
    • Использование темы при загрузке графических объектов в API 21+ (#220).
    • Добавлен метод ConcatenatingMediaSource2, который позволяет объединять несколько мультимедийных объектов в одном окне (#247).
  • Экстракторы:
    • При синтаксическом анализе атомов trak выбрасывать ParserException вместо NullPointerException, если в таблице выборки (stbl) отсутствует обязательное описание выборки (stsd).
    • Исправлена ошибка, из-за которой при переходе к кадру синхронизации в fMP4 пропускались фрагменты (#10941).
  • Аудио:
    • Используйте битрейт сжатого аудиоформата, чтобы рассчитать минимальный размер буфера для AudioTrack при прямом воспроизведении (сквозной передаче).
  • Текст:
    • Исправлена ошибка, из-за которой TextRenderer передавал недопустимый (отрицательный) индекс в Subtitle.getEventTime, если в файле субтитров не было подсказок.
    • SubRip: добавлена поддержка файлов UTF-16, если они начинаются с маркера последовательности байтов.
  • Метаданные:
    • Выполнить синтаксический анализ нескольких значений, разделенных нулями, из фреймов ID3, как разрешено в ID3 v2.4.
    • Добавьте MediaMetadata.mediaType, чтобы указать тип контента или папки, описанных в метаданных.
    • Добавьте MediaMetadata.isBrowsable вместо MediaMetadata.folderType. В следующем выпуске поддержка типа папки будет прекращена.
  • DASH:
    • Добавлен полный синтаксический анализ для наборов адаптации изображений, включая количество фрагментов (#3752).
  • Интерфейс:
    • Исправлена устаревшая функция PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener), чтобы изменения видимости передавались зарегистрированному прослушивателю (#229).
    • Исправлен порядок панелей управления проигрывателем в центре в PlayerView при использовании макета с направлением письма справа налево (#227).
  • Сеанс:
    • Добавлен абстрактный класс SimpleBasePlayer, который помогает реализовать интерфейс Player для пользовательских проигрывателей.
    • Добавлен вспомогательный метод для преобразования токена сеанса платформы в Media3 SessionToken (#171).
    • Используйте onMediaMetadataChanged, чтобы запускать обновления медиасеанса платформы (#219).
    • Добавьте сеанс воспроизведения медиаконтента в качестве аргумента getMediaButtons() в DefaultMediaNotificationProvider и используйте неизменяемые списки во избежание неясности (#216).
    • Добавьте прослушиватель обратного вызова onSetMediaItems, чтобы изменять и задавать список MediaItem, начальный индекс и позицию по сеансу перед настройкой проигрывателя (#156).
    • Устранена проблема, из-за которой двойное нажатие на кнопку воспроизведения медиаконтента, подключенную не по Bluetooth, распознавалось как два отдельных нажатия (#233).
    • Повышена надежность QueueTimeline в случае сомнительного состояния устаревшего сеанса (#241).
  • Метаданные:
    • Выполнить синтаксический анализ нескольких значений, разделенных нулями, из фреймов ID3, как разрешено в ID3 v2.4.
    • Добавьте MediaMetadata.mediaType, чтобы указать тип контента или папки, описанных в метаданных.
    • Добавьте MediaMetadata.isBrowsable вместо MediaMetadata.folderType. В следующем выпуске поддержка типа папки будет прекращена.
  • Расширение Cast:
    • Версия Cast SDK обновлена до 21.2.0.
  • Расширение IMA:
    • Удалите прослушиватель проигрывателя ImaServerSideAdInsertionMediaSource в потоке приложения, чтобы избежать проблем с потоками.
    • Добавьте свойство focusSkipButtonWhenAvailable в ImaServerSideAdInsertionMediaSource.AdsLoader.Builder, чтобы запрашивать фокусировку на кнопке пропуска на телевизорах, и по умолчанию задайте для него значение true.
    • Добавьте метод focusSkipButton() в ImaServerSideAdInsertionMediaSource.AdsLoader, чтобы программно запрашивать фокус на кнопке пропуска.
    • Версия IMA SDK обновлена до 3.29.0.
  • Демонстрационное приложение:
    • Запрос разрешения на уведомления о скачивании во время выполнения (#10884).

Версия 1.0.0-beta03

22 ноября 2022 г.

Данные "androidx.media3:media3-*:1.0.0-beta03" опубликованы. Версия 1.0.0-beta03 содержит эти коммиты.

Этот выпуск соответствует ExoPlayer 2.18.2.

  • Основная библиотека:
    • Добавьте ExoPlayer.isTunnelingEnabled, чтобы проверить, включено ли туннелирование для выбранных треков (#2518).
    • Добавлен метод WrappingMediaSource, упрощающий упаковку одного объекта MediaSource (#7279).
    • Удалить задний буфер, прежде чем воспроизведение остановится из-за нехватки памяти.
    • Закройте блок doSomeWork в Tracing, когда разгрузка включена.
    • Исправлена проблема с отслеживанием сеансов при быстрой перемотке в PlaybackStatsListener (#180).
    • Отправка отсутствующего обратного вызова onMediaItemTransition при вызове seekToNext или seekToPrevious в плейлисте с одним элементом (#10667).
    • Добавьте Player.getSurfaceSize, который возвращает размер поверхности, на которой воспроизводится видео.
    • Исправлена ошибка, из-за которой удаление прослушивателей во время выпуска проигрывателя могло вызвать ошибку IllegalStateException (#10758).
  • Сборка:
    • Принудительно используйте compileSdkVersion, чтобы избежать ошибок компиляции (#10684).
    • Избегайте публикации блока, если он включен в другую сборку Gradle.
  • Выбор трека:
    • Если дисплей не поддерживает Dolby Vision, отдавайте предпочтение другим дорожкам. (#8944).
  • Скачивания:
    • Исправлена потенциальная бесконечная петля в ProgressiveDownloader, вызванная одновременным скачиванием и воспроизведением с одним и тем же PriorityTaskManager (#10570).
    • Уведомление о скачивании появляется сразу (#183).
    • Ограничено количество параллельных удалений скачанных файлов (не более одного), чтобы избежать создания лишних потоков (#10458).
  • Видео:
    • Если экран не поддерживает Dolby Vision, попробуйте альтернативный декодер. (#9794).
  • Аудио:
    • Используйте SingleThreadExecutor для освобождения экземпляров AudioTrack, чтобы избежать ошибок OutOfMemory при одновременном освобождении нескольких проигрывателей (#10057).
    • Добавляет AudioOffloadListener.onExperimentalOffloadedPlayback для состояния разгрузки AudioTrack. (#134).
    • Сделайте AudioTrackBufferSizeProvider общедоступным интерфейсом.
    • Добавьте ExoPlayer.setPreferredAudioDevice, чтобы задать предпочтительное устройство вывода аудио (#135).
    • Переименуйте androidx.media3.exoplayer.audio.AudioProcessor в androidx.media3.common.audio.AudioProcessor.
    • Сопоставление 8- и 12-канального аудио с масками каналов 7.1 и 7.1.4 соответственно во всех версиях Android (#10701).
  • Метаданные:
    • Теперь MetadataRenderer можно настроить так, чтобы метаданные отображались сразу, как только они становятся доступны. Создайте экземпляр с помощью MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), чтобы указать, будет ли средство визуализации выводить метаданные раньше или синхронно с позицией проигрывателя.
  • DRM:
    • Исправлена ошибка в реализации ClearKey в Android 13, из-за которой возвращался непустой, но недействительный URL лицензии.
    • Исправлена ошибка setMediaDrmSession failed: session not opened, возникавшая при переключении между схемами DRM в плейлисте (например, с Widevine на ClearKey).
  • Текст:
    • CEA-608: обеспечена корректная обработка команд переключения сервисов в поле 2 (#10666).
  • DASH:
    • Добавлена обработка EventStream.presentationTimeOffset из манифестов (#10460).
  • Интерфейс:
    • Использовать текущие переопределения проигрывателя в качестве набора настроек в TrackSelectionDialogBuilder (#10429).
  • Сеанс:
    • Обеспечьте выполнение команд в правильном порядке, даже если некоторые из них требуют асинхронного разрешения (#85).
    • Добавьте DefaultMediaNotificationProvider.Builder, чтобы построить DefaultMediaNotificationProvider. Конструктор может настроить идентификатор уведомления, идентификатор канала уведомлений и название канала уведомлений, используемые поставщиком. Также добавьте метод DefaultMediaNotificationProvider.setSmallIcon(int), чтобы задать маленький значок уведомлений. (#104).
    • Команды, отправленные до MediaController.release(), больше не удаляются (#99).
    • SimpleBitmapLoader может загружать растровые изображения из URI file:// (#108).
    • Исправлено утверждение, которое не позволяло MediaController пропускать объявление в период (#122).
    • Когда воспроизведение заканчивается, MediaSessionService останавливается в активном режиме и появляется уведомление о том, что можно перезапустить воспроизведение последнего мультимедийного объекта (#112).
    • Не запускайте активную службу с отложенным намерением для паузы (#167).
    • Вручную скрывайте значок, связанный с уведомлением, созданным DefaultNotificationProvider в API 26 и API 27 (в API 28 и более поздних версиях значок скрывается автоматически) (#131).
    • Исправлена ошибка, из-за которой второе подключение связывателя от устаревшего MediaSession к MediaController Media3 вызывало исключения IllegalStateException (#49).
  • RTSP:
    • Добавлена обработка фрагментированных пакетов H263 (#119).
    • Добавлена поддержка MP4A-LATM (#162).
  • IMA:
    • Добавлен тайм-аут для загрузки информации об объявлении, чтобы обрабатывать случаи, когда IMA SDK зависает при загрузке объявления (#10510).
    • Запрещен пропуск рекламы в середине видео при перемотке до конца контента (#10685).
    • Правильно рассчитывать продолжительность окна для прямых трансляций с объявлениями, вставленными на стороне сервера, например IMA DAI (#10764).
  • Расширение FFmpeg:
    • Добавлены новые обязательные флаги для связывания библиотек FFmpeg с NDK 23.1.7779620 и более поздними версиями (#9933).
  • Расширение AV1:
    • Обновлена версия CMake, чтобы избежать несовместимости с последними выпусками Android Studio (#9933).
  • Расширение Cast:
    • Реализуйте getDeviceInfo(), чтобы идентифицировать CastPlayer при управлении воспроизведением с помощью MediaController (#142).
  • Трансформер:
    • Добавлен сторожевой таймер мультиплексора, который определяет, когда создание выходного образца происходит слишком медленно.
  • Удалите устаревшие символы:
    • Удалить Transformer.Builder.setOutputMimeType(String) Эта функция удалена. Если используется мультиплексор по умолчанию, MIME-тип всегда будет MP4.

Версия 1.0.0-beta02

21 июля 2022 г.

Данные "androidx.media3:media3-*:1.0.0-beta02" опубликованы. Версия 1.0.0-beta02 содержит эти коммиты.

Этот выпуск соответствует ExoPlayer 2.18.1.

  • Основная библиотека:
    • Убедитесь, что изменение ShuffleOrder с помощью ExoPlayer.setShuffleOrder приводит к вызову Player.Listener#onTimelineChanged с reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • Для прогрессивных медиафайлов включайте в буферизованную позицию только выбранные треки (#10361).
    • Разрешено использовать пользовательский регистратор для всех выходных данных журнала ExoPlayer (#9752).
    • Исправлена реализация setDataSourceFactory в DefaultMediaSourceFactory, которая в некоторых случаях не работала (#116).
  • Экстракторы:
    • Исправлена обработка наборов краткосрочных опорных изображений H.265 (#10316).
    • Исправлен синтаксический анализ битрейтов из полей esds (#10381).
  • DASH:
    • Добавлена возможность анализировать URL лицензии ClearKey из манифестов (#10246).
  • Интерфейс:
    • Убедитесь, что TalkBack озвучивает выбранную скорость воспроизведения в меню элементов управления воспроизведением (#10298).
  • RTSP:
    • Добавлена обработка фрагментированных пакетов VP8 (#110).
  • Расширение Leanback:
    • Прослушивать изменения playWhenReady в LeanbackAdapter (10420).
  • В ролях:
    • Используйте MediaItem, переданный методам плейлиста как Window.mediaItem в CastTimeline (#25, #8212).
    • Поддержка Player.getMetadata() и Listener.onMediaMetadataChanged() с CastPlayer (#25).

Версия 1.0.0-beta01

16 июня 2022 г.

Данные "androidx.media3:media3-*:1.0.0-beta01" опубликованы. Версия 1.0.0-beta01 содержит эти коммиты.

Это соответствует выпуску ExoPlayer 2.18.0.

  • Основная библиотека:
    • Включить поддержку диагностики платформы Android через MediaMetricsManager. ExoPlayer будет передавать платформе данные о событиях воспроизведения и эффективности, что позволит получать сведения о производительности системы и отладке на устройстве. Google также может собирать эти данные, если пользователь устройства разрешил отправку данных об использовании и диагностике. Приложения могут отказаться от передачи данных для диагностики платформы ExoPlayer с помощью ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Исправлена ошибка, из-за которой треки сбрасывались слишком часто при использовании MergingMediaSource, например при загрузке субтитров и изменении выбранных субтитров в середине воспроизведения (#10248).
    • Прекратить обнаружение сетей 5G-NSA в API 29 и 30. Для этих воспроизведений будет предполагаться сеть 4G.
    • Запретить передачу null в MediaSource.Factory.setDrmSessionManagerProvider и MediaSource.Factory.setLoadErrorHandlingPolicy. При необходимости можно явно передать экземпляры DefaultDrmSessionManagerProvider и DefaultLoadErrorHandlingPolicy.
    • Добавьте MediaItem.RequestMetadata, чтобы представить метаданные, необходимые для воспроизведения медиаконтента, когда точный LocalConfiguration неизвестен. Также удалите MediaMetadata.mediaUrl, так как теперь это включено в RequestMetadata.
    • Добавьте Player.Command.COMMAND_SET_MEDIA_ITEM, чтобы игроки могли устанавливать один предмет.
  • Выбор трека:
    • Объединить класс TrackSelectionOverrides с классом TrackSelectionParameters и сделать класс TrackSelectionOverride классом верхнего уровня.
    • Переименуйте TracksInfo в Tracks, а TracksInfo.TrackGroupInfo – в Tracks.Group. Player.getCurrentTracksInfo и Player.Listener.onTracksInfoChanged теперь называются Player.getCurrentTracks и Player.Listener.onTracksChanged. В частности, мы восстановили метод Player.Listener.onTracksChanged, но с другими типами параметров.
    • Измените DefaultTrackSelector.buildUponParameters и DefaultTrackSelector.Parameters.buildUpon, чтобы возвращать DefaultTrackSelector.Parameters.Builder вместо устаревшего DefaultTrackSelector.ParametersBuilder.
    • Добавьте DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities (включено по умолчанию). Если этот параметр включен, DefaultTrackSelector будет отдавать предпочтение аудиодорожкам, количество каналов в которых не превышает возможности вывода устройства. На мобильных устройствах DefaultTrackSelector предпочитает стерео- и моноформаты многоканальным, за исключением случаев, когда многоканальный формат поддерживает пространственное звучание (Android 12L и более поздние версии) или является форматом объемного звука Dolby. Кроме того, на устройствах, поддерживающих пространственное звучание, DefaultTrackSelector будет отслеживать изменения в свойствах пространственного звучания и на их основе выбирать новый трек. Устройства с режимом интерфейса television исключаются из этих ограничений, и предпочтение отдается формату с наибольшим количеством каналов. Чтобы включить эту функцию, экземпляр DefaultTrackSelector должен быть создан с помощью Context.
  • Видео:
    • Переименовать DummySurface в PlaceholderSurface.
    • Добавьте поддержку AV1 в MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Аудио:
    • Использовать аудиодекодер LG AC3, рекламирующий нестандартный MIME-тип.
    • Измените тип возвращаемого значения AudioAttributes.getAudioAttributesV21() с android.media.AudioAttributes на новый класс-оболочку AudioAttributesV21, чтобы предотвратить медленную проверку ART в API < 21.
    • Запрашивать платформу (API 29+) или предполагать количество каналов кодирования аудио для сквозной передачи аудио, когда количество аудиоканалов формата не задано, что происходит при подготовке HLS без фрагментов (10204).
    • Настройте AudioTrack с маской канала AudioFormat.CHANNEL_OUT_7POINT1POINT4, если декодер выводит 12-канальный звук PCM (#10322).
  • DRM
    • Исправлена ошибка, из-за которой сеанс DRM не обновлялся при перемотке сразу после изменения формата (10274).
  • Текст:
    • Измените Player.getCurrentCues(), чтобы возвращать CueGroup вместо List<Cue>.
    • SSA: добавлена поддержка настройки стиля OutlineColour, когда используется BorderStyle == 3 (то есть OutlineColour задает фон реплики) (#8435).
    • CEA-708: разбейте данные на несколько блоков и игнорируйте блоки, не связанные с выбранным номером сервиса.
    • Удалите RawCcExtractor, который использовался только для обработки формата субтитров, предназначенного для внутреннего использования в Google.
  • Экстракторы:
    • Добавлена поддержка AVI (#2092).
    • Matroska: для дорожек Opus анализируется DiscardPadding.
    • MP4: анализ битрейтов из блоков esds.
    • Ogg: разрешены дублирующиеся заголовки Opus ID и комментариев (#10038).
  • Интерфейс:
    • Исправлена передача событий в OnClickListener, заданные в PlayerView, в случае, когда useController=false (#9605). Также исправьте передачу событий в OnLongClickListener для всех конфигураций представлений.
    • Исправлена ошибка, из-за которой последовательность событий касания, выходящих за границы PlayerView до ACTION_UP, ошибочно обрабатывалась как клик (#9861).
    • Исправлена ошибка специальных возможностей PlayerView, из-за которой нажатие могло переключать воспроизведение, а не скрывать элементы управления (#8627).
    • Перепишите TrackSelectionView и TrackSelectionDialogBuilder, чтобы они работали с интерфейсом Player, а не ExoPlayer. Это позволяет использовать представления с другими реализациями Player и устраняет зависимость модуля пользовательского интерфейса от модуля ExoPlayer. Это критическое изменение.
    • Принудительные текстовые дорожки не показываются в селекторе дорожек PlayerView. Если выбрано значение "Нет", то сохраняется подходящая принудительная текстовая дорожка (#9432).
  • DASH:
    • Анализ количества каналов из элементов DTS AudioChannelConfiguration. Это позволяет повторно включить сквозную передачу звука для потоков DTS (#10159).
    • Запретить передачу null в DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. При необходимости экземпляры DefaultCompositeSequenceableLoaderFactory можно передавать явным образом.
  • HLS:
    • Если атрибут CODECS плейлиста не содержит аудиокодек, то выполняется переход к подготовке фрагментов (#10065).
    • Запретить передачу null в HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory и HlsMediaSource.Factory.setPlaylistTrackerFactory. При необходимости можно явно передать экземпляры DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory или ссылку на DefaultHlsPlaylistTracker.FACTORY.
  • Smooth Streaming:
    • Запретить передачу null в SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. При необходимости экземпляры DefaultCompositeSequenceableLoaderFactory можно передавать явным образом.
  • RTSP:
    • Добавлен считыватель RTP для H263 (#63).
    • Добавлена поддержка чтения RTP для MPEG4 (#35).
    • Добавлен считыватель RTP для HEVC (#36).
    • Добавлен считыватель RTP для AMR. В настоящее время поддерживаются только одноканальные потоки AMR без чередования. Составная полезная нагрузка AMR RTP не поддерживается. (#46)
    • Добавлено средство чтения RTP для VP8 (#47).
    • Добавлена программа чтения RTP для WAV (#56).
    • Исправлен заголовок базовой авторизации RTSP. (#9544).
    • Прекращена проверка обязательных полей SDP, так как они не нужны ExoPlayer (#10049).
    • Добавлено исключение, которое возникает при обработке времени RTSP (#10165).
    • Добавлена поддержка RTP для VP9 (#47).
    • Добавлено средство чтения RTP для OPUS (#53).
  • Источники данных:
    • Переименовать DummyDataSource в PlaceholderDataSource.
    • Обходной путь для обработки прерываний OkHttp.
  • Сеанс:
    • Замените MediaSession.MediaItemFiller на MediaSession.Callback.onAddMediaItems, чтобы разрешить асинхронную обработку запросов.
    • Поддержка методов setMediaItems(s) при подключении MediaController к устаревшему медиасеансу.
    • Удалите MediaController.setMediaUri и MediaSession.Callback.onSetMediaUri. Такого же результата можно достичь с помощью MediaController.setMediaItem и MediaSession.Callback.onAddMediaItems.
    • Перенаправлять устаревшие вызовы MediaController для воспроизведения медиаконтента в MediaSession.Callback.onAddMediaItems вместо onSetMediaUri.
    • Добавьте MediaNotification.Provider и DefaultMediaNotificationProvider, чтобы настроить уведомление.
    • Добавьте BitmapLoader и SimpleBitmapLoader для скачивания изображений обложек.
    • Добавьте MediaSession.setCustomLayout(), чтобы обеспечить обратную совместимость с устаревшим сеансом.
    • Добавьте MediaSession.setSessionExtras(), чтобы обеспечить паритет функций с устаревшим сеансом.
    • Переименуйте MediaSession.MediaSessionCallback в MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback в MediaLibrarySession.Callback и MediaSession.Builder.setSessionCallback в setCallback.
    • Исправлена ошибка NPE в MediaControllerImplLegacy (#59).
    • Обновление информации о позиции сеанса в изменении хронологии (#51).
    • Исправлена ошибка NPE в MediaControllerImplBase после выпуска контроллера (#74).
  • Воспроизведение объявлений/IMA:
    • Частота опроса объявлений снижена со 100 до 200 мс в соответствии с рекомендациями Совета по медиаизмерениям (MRC).
  • Расширение FFmpeg:
    • Обновите CMake до версии 3.21.0+, чтобы избежать ошибки, из-за которой не выполняется синхронизация Gradle в Android Studio (#9933).
  • Удалите устаревшие символы:
    • Удалить Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) Используйте вместо него Player.Listener.onTracksChanged(Tracks).
    • Удалите Player.getCurrentTrackGroups и Player.getCurrentTrackSelections. Используйте вместо него Player.getCurrentTracks. Вы также можете продолжать использовать ExoPlayer.getCurrentTrackGroups и ExoPlayer.getCurrentTrackSelections, хотя эти методы по-прежнему не рекомендуются.
    • Удалите константы DownloadHelper, DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT и DEFAULT_TRACK_SELECTOR_PARAMETERS. По возможности используйте getDefaultTrackSelectorParameters(Context), а в остальных случаях – DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Удалить конструктор "DefaultTrackSelector(ExoTrackSelection.Factory)". Используйте вместо него DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Удалить Transformer.Builder.setContext Вместо этого Context нужно передать в конструктор Transformer.Builder.

Версия 1.0.0-alpha03

14 марта 2022 г.

Данные "androidx.media3:media3-*:1.0.0-alpha03" опубликованы. Версия 1.0.0-alpha03 содержит эти коммиты.

Это соответствует выпуску ExoPlayer 2.17.1.

  • Аудио:
    • Исправлена ошибка, возникавшая при проверке поддержки Dolby Atmos (E-AC3-JOC) в HLS.
  • Экстракторы:
    • FMP4: исправлена ошибка, из-за которой метаданные образца emsg могли выводиться в неправильном порядке для потоков, содержащих атомы emsg v0 и v1 (#9996).
  • Текст:
    • Исправлено взаимодействие SingleSampleMediaSource.Factory.setTrackId и MediaItem.SubtitleConfiguration.Builder.setId, чтобы приоритет отдавался полю SubtitleConfiguration, а значение Factory использовалось, если оно не задано (#10016).
  • Воспроизведение объявления:
    • Исправлены ошибки, связанные с недостаточным объемом аудиоданных между рекламными паузами в прямых трансляциях HLS с динамической вставкой объявлений.

Версия 1.0.0-alpha02

2 марта 2022 г.

Данные "androidx.media3:media3-*:1.0.0-alpha02" опубликованы. Версия 1.0.0-alpha02 содержит эти коммиты.

Это соответствует выпуску ExoPlayer 2.17.0.

  • Основная библиотека:
    • Добавьте защищенный метод DefaultRenderersFactory.getCodecAdapterFactory(), чтобы подклассы DefaultRenderersFactory, которые переопределяют buildVideoRenderers() или buildAudioRenderers(), могли получить доступ к фабрике адаптеров кодеков и передать ее создаваемым экземплярам MediaCodecRenderer.
    • Поля заголовка ICY name и genre теперь передаются в MediaMetadata.station и MediaMetadata.genre соответственно, чтобы они поступали в приложение через Player.Listener.onMediaMetadataChanged() (#9677).
    • Удалите нулевые ключи из DefaultHttpDataSource#getResponseHeaders.
    • Если не удалось создать экземпляр MediaCodec, подождите и повторите попытку. Это позволяет обойти проблему, которая возникает на некоторых устройствах при переключении поверхности с защищенного кодека на другой (#8696).
    • Добавьте MediaCodecAdapter.getMetrics(), чтобы пользователи могли получать данные показателей из MediaCodec. (#9766).
    • Исправлено разрешение зависимостей Maven (#8353).
    • Отключена автоматическая регулировка скорости для прямых трансляций, в которых не используются функции низкой задержки и не задана скорость по запросу пользователя (#9329).
    • Переименовать DecoderCounters#inputBufferCount в queuedInputBufferCount.
    • Скрыть SimpleExoPlayer.renderers. Доступ к средствам визуализации можно получить через ExoPlayer.getRenderer.
    • Обновлены некоторые значения констант AnalyticsListener.EventFlags, чтобы они соответствовали значениям в Player.EventFlags.
    • Разделите AnalyticsCollector на интерфейс и реализацию по умолчанию, чтобы R8 мог удалить его, если он не нужен приложению.
  • Выбор трека:
    • Добавлена поддержка флагов предпочтительной роли видео при выборе дорожки (#9402).
    • Обновлена логика выбора видеодорожек, чтобы при выборе нескольких дорожек для адаптации учитывались предпочтительные MIME-типы и флаги ролей (#9519).
    • Обновлена логика выбора видео- и аудиодорожек. Теперь для адаптивного выбора используются только форматы с одинаковым уровнем поддержки декодера и аппаратного обеспечения (#9565).
    • Обновлена логика выбора видеодорожки, чтобы отдавать предпочтение более эффективным кодекам, если основные декодеры с аппаратным ускорением поддерживают несколько кодеков (#4835).
    • При выборе аудиодорожки отдавайте предпочтение настройкам аудиоконтента (например, дорожке по умолчанию или дорожке, соответствующей языку системы), а не техническим ограничениям (например, предпочтительному MIME-типу или максимальному количеству каналов).
    • Исправлена ошибка, из-за которой при переопределении одной группы треков не отключались другие группы треков того же типа (#9675).
    • Исправлена ошибка, из-за которой не применялись переопределения пустых и непустых треков (#9649).
    • Запретить дублирование TrackGroup в TrackGroupArray. Объекты TrackGroup всегда можно сделать различимыми, задав id в конструкторе TrackGroup. Исправлен сбой, возникавший при возобновлении воспроизведения после перевода приложения в фоновый режим с активным переопределением трека (#9718).
    • Изменена логика в AdaptiveTrackSelection, чтобы разрешить повышение качества при достаточной пропускной способности сети, даже если воспроизведение очень близко к текущему моменту трансляции (#9784).
  • Видео:
    • Исправлена логика резервного декодера для Dolby Vision, чтобы при необходимости использовать совместимый декодер H264/H265.
  • Аудио:
    • Исправлена логика резервного декодера для Dolby Atmos (E-AC3-JOC), чтобы при необходимости использовать совместимый декодер E-AC3.
    • Измените API AudioCapabilities, чтобы они требовали явной передачи AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES вместо null.
    • Разрешить настройку расчета размера буфера AudioTrack, добавив AudioTrackBufferSizeProvider в DefaultAudioSink. (#8891).
    • Повторите попытку создания AudioTrack, если запрошенный размер буфера превышает 1 МБ. (#9712).
  • Экстракторы:
    • WAV: добавлена поддержка потоков RF64 (#9543).
    • Исправлена ошибка, из-за которой неправильно обрабатывались блоки NAL SPS в формате H.265 (#9719).
    • Анализ комментариев Vorbis (включая METADATA_BLOCK_PICTURE) в файлах Ogg Opus и Ogg Vorbis.
  • Текст:
    • Добавлено поле MediaItem.SubtitleConfiguration.id, которое передается в поле Format.id дорожки субтитров, созданной на основе конфигурации (#9673).
    • Добавлена базовая поддержка субтитров WebVTT в контейнерах Matroska (#9886).
    • Запрещает Cea708Decoder считывать данные, размер которых превышает заявленный размер блока обслуживания.
  • DRM:
    • Удалить данные об устройстве "playbackLooper" из аккаунта DrmSessionManager.(pre)acquireSession? Если приложение использует DrmSessionManager в пользовательском MediaSource, то вместо этого в DrmSessionManager.setPlayer нужно передавать playbackLooper.
  • Воспроизведение объявлений/IMA:
    • Добавлена поддержка динамической вставки объявлений IMA (#8213).
    • Добавлен метод в AdPlaybackState, позволяющий сбрасывать группу объявлений, чтобы ее можно было воспроизвести снова (#9615).
    • Принудительно устанавливать скорость воспроизведения 1.0 во время показа рекламы (#9018).
    • Исправлена ошибка, из-за которой группа объявлений, которую не удалось загрузить, вызывала немедленный сброс воспроизведения (#9929).
  • Интерфейс:
    • Исправлен цвет цифр на кнопках перемотки назад и вперед в StyledPlayerView при использовании определенных тем (#9765).
    • Исправлен перевод строк, связанных со скоростью воспроизведения (#9811).
  • DASH:
    • Добавьте в Representation обработанные основные и дополнительные свойства (#9579).
    • Добавлена поддержка роли дорожки forced-subtitle (#9727).
    • Прекратить интерпретировать роль дорожки main как C.SELECTION_FLAG_DEFAULT.
    • Исправлена логика исключения базового URL для манифестов, в которых не объявлено пространство имен DVB (#9856).
    • Добавлена поддержка относительных URL MPD.Location (#9939).
  • HLS:
    • Исправлено заполнение Format.label для аудиопотоков HLS (#9608).
    • По умолчанию использовать подготовку без фрагментов, чтобы сократить время запуска. Если в ваших версиях есть мультиплексированные дорожки субтитров, которые не объявлены в главном плейлисте, добавьте их в него, чтобы они были доступны для воспроизведения, или отключите подготовку без фрагментов с помощью параметра HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Добавлена поддержка точного поиска по ключевым кадрам в HLS (#2882).
  • RTSP:
    • Добавлен клиентский API для переопределения SocketFactory, используемого для любого подключения к серверу (#9606).
    • Если доступны оба метода аутентификации, DIGEST и BASIC, предпочтение отдается DIGEST (#9800).
    • Добавлена обработка ситуаций, когда недоступны временные метки дорожки RTSP (#9775).
    • Игнорирование недопустимых значений заголовка RTP-Info (#9619).
  • Трансформер:
    • Минимальная требуемая версия API повышена до 21.
    • TransformationException теперь используется для описания ошибок, возникающих во время преобразования.
    • Добавьте TransformationRequest, чтобы указать параметры преобразования.
    • Разрешить регистрацию нескольких слушателей.
    • Исправлена ошибка, из-за которой Transformer зависал, когда выходные данные кодека считывались частично.
    • Исправлена потенциальная ошибка NPE в Transformer.getProgress, когда освобождение мультиплексора вызывает исключение.
    • Добавьте демонстрационное приложение для применения преобразований.
  • Расширение MediaSession:
    • По умолчанию MediaSessionConnector теперь очищает плейлист при остановке. Приложения, которые хотят сохранить плейлист, могут вызвать setClearMediaItemsOnStop(false) в коннекторе.
  • Расширение Cast:
    • Исправлена ошибка, из-за которой CastPlayer не мог правильно вызвать onIsPlayingChanged (#9792).
    • Добавлена поддержка метаданных аудио, включая обложки, с помощью DefaultMediaItemConverter (#9663).
  • Расширение FFmpeg:
    • Сделайте так, чтобы build_ffmpeg.sh зависел от утилит bin LLVM, а не GNU (#9933).
  • Совместимость с Android 12:
    • Обновите расширение Cast, чтобы оно зависело от com.google.android.gms:play-services-cast-framework:20.1.0. Более ранние версии play-services-cast-framework несовместимы с приложениями, предназначенными для Android 12, и при создании PendingIntents будут аварийно завершать работу с ошибкой IllegalArgumentException (#9528).
  • Удалите устаревшие символы:
    • Удалить Player.EventListener Используйте вместо него Player.Listener.
    • Удалить MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory и MediaSourceFactory#setDrmUserAgent. Используйте вместо него MediaSourceFactory#setDrmSessionManagerProvider.
    • Удалить MediaSourceFactory#setStreamKeys Используйте вместо него MediaItem.Builder#setStreamKeys.
    • Удалить MediaSourceFactory#createMediaSource(Uri) Используйте вместо него MediaSourceFactory#createMediaSource(MediaItem).
    • Удалить setTag из DashMediaSource, HlsMediaSource и SsMediaSource. Используйте вместо него MediaItem.Builder#setTag.
    • Удалить DashMediaSource#setLivePresentationDelayMs(long, boolean) Используйте MediaItem.Builder#setLiveConfiguration и MediaItem.LiveConfiguration.Builder#setTargetOffsetMs, чтобы переопределить манифест, или DashMediaSource#setFallbackTargetLiveOffsetMs, чтобы указать резервное значение.
    • Удалить (Simple)ExoPlayer.setThrowsWhenUsingWrongThread Отказаться от принудительного применения цепочек больше нельзя.
    • Удалить ActionFile и ActionFileUpgradeUtil. Используйте ExoPlayer 2.16.1 или более раннюю версию, чтобы с помощью ActionFileUpgradeUtil объединить устаревшие файлы действий в DefaultDownloadIndex.
    • Удалить ProgressiveMediaSource#setExtractorsFactory Вместо него используйте конструктор ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Удалите ProgressiveMediaSource.Factory#setTag и ProgressiveMediaSource.Factory#setCustomCacheKey. Используйте вместо него правила MediaItem.Builder#setTag и MediaItem.Builder#setCustomCacheKey.
    • Удалите конструкторы DefaultRenderersFactory(Context, @ExtensionRendererMode int) и DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Вместо них используйте конструктор DefaultRenderersFactory(Context), а также методы DefaultRenderersFactory#setExtensionRendererMode и DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Удалите все общедоступные конструкторы CronetDataSource. Используйте вместо него CronetDataSource.Factory.
  • Измените IntDefs на @Target(TYPE_USE). Это может нарушить компиляцию в Kotlin. Чтобы исправить проблему, переместите аннотацию к типу (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (в пакете com.google.android.exoplayer2.ext.flac)
    • @FlacExtractor.Flags (в пакете com.google.android.exoplayer2.extractor.flac)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

Версия 1.0.0-alpha01

27 октября 2021 г.

Данные "androidx.media3:media3-*:1.0.0-alpha01" опубликованы. Версия 1.0.0-alpha01 содержит эти коммиты.

Новые функции

Media3 – это новый дом для библиотек поддержки медиа, включая ExoPlayer. Первая альфа-версия содержит ранние функциональные реализации библиотек для реализации вариантов использования мультимедиа, в том числе:

  • ExoPlayer – медиапроигрыватель уровня приложения для Android, который легко настраивать и расширять.
  • Функции медиасеанса для показа и управления воспроизведением. В новом модуле сеансов используется тот же интерфейс Player, что и в ExoPlayer.
  • Компоненты пользовательского интерфейса для создания интерфейсов воспроизведения медиа.
  • Модули, которые добавляют в ExoPlayer функции из других библиотек, например вставку рекламы с помощью IMA SDK.

Дополнительную информацию можно найти на странице проекта Media3 на GitHub.

Ранее ExoPlayer размещался в отдельном проекте ExoPlayer GitHub. В Media3 название пакета – androidx.media3.exoplayer. Мы планируем поддерживать и выпускать проект ExoPlayer на GitHub ещё некоторое время, чтобы у разработчиков было время перейти на Media3. В Media3 есть замена для всех модулей ExoPlayer, кроме устаревших расширений media2 и mediasession, которые заменены новым модулем media3-session. Это обеспечивает прямую интеграцию между проигрывателями и медиасеансами без необходимости использовать класс адаптера/коннектора.