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на JSpecifyorg.jspecify.annotations.Nullable. - Удалите
androidx.media3.common.util.UnknownNullи используйте аннотации JSpecify. Подклассы KotlinRunnableFutureTaskс типом результата, допускающим значение 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), который рекомендует конфигурации видеокодировщика (кодек, настройки кодировщика и битрейт) для текущего устройства на основе измеренных данных о качестве кодировщика.
- Добавлен 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).
- ADTS: исправлена ошибка
- Инспектор:
- Исправлена ошибка, из-за которой отмена будущего, возвращенного
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за счет рендеринга областей субтитров непосредственно в битовые карты размером с область вместо сохранения полноэкранной временной битовой карты.
- Уменьшено использование памяти в
- Эффект:
- Мультиплексоры:
- Проверяйте дорожку
Formatпри ее добавлении вMp4MuxerилиFragmentedMp4Muxer, а не позже, когда записываются образцы или закрывается мультиплексор. - Сделайте так, чтобы повторные вызовы
Muxer.close()не выполняли никаких операций во всех реализациях библиотекиMuxer, и считайте мультиплексор закрытым, даже еслиclose()выдает ошибку. Вызов любого другого метода послеclose()теперь приводит к ошибкеIllegalStateException.
- Проверяйте дорожку
- Расширение IMA:
- Добавлена поддержка интерфейса
ResizablePlayerIMA 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 которой не показывались обложки для устаревших сеансов, в которых задан параметр
nullMETADATA_KEY_DISPLAY_ICON(или URI обложки) вместе с действительным параметромMETADATA_KEY_ALBUM_ART. Теперь при преобразовании устаревших метаданных пустые значения обложек пропускаются.
- Интерфейс:
- Добавьте слот
subtitlesComposable в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, а также сохраняйте длительность, определенную получателем, и статус прямой трансляции при поиске в очереди.
- Исправлена ошибка, из-за которой ресиверы Android TV отклоняли запросы на загрузку
- Демонстрационное приложение:
- Разрешить изменять порядок элементов плейлиста перетаскиванием в демонстрационном приложении.
- Удалите устаревшие символы:
- Удалить
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 в сопоставления цветов ISOMediaFormatUtilиColorInfo. - Добавлен центральный реестр
Flagsдля управления экспериментальными флагами функций и поэтапным внедрением (Flags.setCanaryModeEnabled). Многие существующие методы@ExperimentalApiперенесены для использования нового API флагов. - Добавьте
MediaMetadata.playlistId,MediaMetadata.Builder.setPlaylistId(String),MediaMetadata.categoriesиMediaMetadata.Builder.setCategories(List<String>). - Замените
androidx.media3.common.util.NonNullApiна JSpecifyorg.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 в середине потока.
- Mp4Extractor: исправлена ошибка, из-за которой при синтаксическом анализе поля
- Инспектор:
- Поддержка получения метаданных XMP из файлов MP4 с помощью
MetadataRetriever. - Поддержка извлечения дорожек с метаданными, синхронизированными по времени, в формате
mebxвMediaExtractorCompatкакMimeTypes.APPLICATION_MEBX.
- Поддержка получения метаданных XMP из файлов MP4 с помощью
- Фрейм инспектора:
- Исправлено отсечение цветов широкой гаммы BT.2020 в базовом изображении SDR при извлечении кадров Ultra HDR с помощью
FrameExtractor. Цвета, выходящие за пределы гаммы, теперь мягко сжимаются в гамму sRGB, а не зажимаются.
- Исправлено отсечение цветов широкой гаммы BT.2020 в базовом изображении SDR при извлечении кадров Ultra HDR с помощью
- Аудио:
- Добавлено временное решение для устройств, которые вызывают
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.
- Передавайте события приостановки и возобновления воспроизведения в IMA SDK в
- Сеанс:
- Добавьте
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. Добавлен компонентLiveButtonComposable в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-TSEXT-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.
- Переместите флажок, чтобы включить или отключить метаданные HAGC для прогрессивных медиафайлов, с
- Экстракторы:
- Matroska: исправлена ошибка, из-за которой дорожки, размещенные после кластеров, не позволяли перемещаться по временной шкале (#3377).
- Аудио:
- Исправлен расчет размера буфера в
SilenceSkippingAudioProcessor, чтобы минимальная продолжительность тишины не уменьшалась неправильно из-за размера кадра (#3271). - Исправлена обработка 8-битных PCM в
PcmAudioUtil, чтобы семплы обрабатывались как беззнаковые, как определено в Android (#3271). - Исправлена проблема с разгрузкой, из-за которой воспроизведение могло останавливаться во время видеорекламы в начале ролика или переходов без пауз из-за ограниченного размера аппаратного буфера.
- Исправлена ошибка в
DefaultAudioSink, из-за которой количество выпусков не уменьшалось, когда поток воспроизведения переставал работать (#3338).
- Исправлен расчет размера буфера в
- Сеанс:
- Исправлена ошибка
NullPointerException, возникавшая, когда выполняющийся процессMediaControllerосвобождался из обратного вызоваPlayer.Listener(#3375). - Исправлена взаимная блокировка в основном потоке, когда устаревший
MediaBrowserподключается к сервису, возвращающему асинхронный результат изonGetLibraryRoot()илиonConnectAsync()(#3393).
- Исправлена ошибка
- Расширение HLS:
- Расширение DASH:
- Исправлен неверный расчет временной метки для дорожек изображений с
presentationTimeOffset(#3334).
- Исправлен неверный расчет временной метки для дорожек изображений с
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Opus: исправлена ошибка, из-за которой повреждалась память, когда одновременно инициализировалось несколько экземпляров
OpusDecoder. - MPEG-H: исправлена утечка памяти, усечение символов, не входящих в набор ASCII, и потенциальный сбой на уровне ОС в условиях нехватки памяти при отправке команд в
MpeghUiManager(#3365).
- Opus: исправлена ошибка, из-за которой повреждалась память, когда одновременно инициализировалось несколько экземпляров
Версия 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).
- MP4, MP3 и FLAC. Добавлен метод
- Аудио:
- Добавлен 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и чрезмерное количество пробуждений ЦП в основном потоке.
- Текст:
- Метаданные:
- Добавьте поле
MediaMetadata.discSubtitleи проанализируйте его из данных ID3v2.4TSSTи VorbisDISCSUBTITLE. - Получить номер и количество дисков из фрейма ID3
TPOS.
- Добавьте поле
- Эффект:
- Очистка состояния перерисовки в
FinalShaderProgramWrapperпри сбросе, чтобы предотвратить зависание проигрывателя при поиске.
- Очистка состояния перерисовки в
- Мультиплексоры:
- Добавлена поддержка ссылок на треки (поле
tref) вMp4Muxerс помощью нового APIaddTrackReference. Это позволяет устанавливать связи между дорожками, например связывать дорожку метаданных с дорожкой видео, которую она описывает. - Добавьте
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, чтобы обеспечить поддержку запросов активных сеансов воспроизведения и возврата экземпляров Media3SessionToken. - Измените режим работы по умолчанию для
MediaSession.Callback.onConnect, если метод не переопределен, чтобы предоставлять ненадежным контроллерам доступ только для чтения. - Добавлена поддержка переопределения названия пакета при создании
MediaSessionс помощью нового APIMediaSession.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, отсутствовали исходные идентификаторы UIDTimeline. Теперь сеанс надежно преобразует и распространяет эти 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:
- Расширение 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).
- Разделяйте субтитры CEA на разные элементы
- Расширение RTSP:
- Исправлены временные сбои воспроизведения или ошибки при подготовке воспроизведения RTSP, вызванные ошибками привязки портов UDP.
- Расширение Cast:
- Добавлен новый класс
CastParams, позволяющий настраивать Cast с помощью вызоваCast.initialize(CastParams). - Добавлен новый параметр
CastParams.getShowSystemOutputSwitcherOnCastIconClick(), который позволяет использовать переключатель вывода SystemUI вместо средства выбора устройства Cast в приложении, если оно доступно. - Добавлены методы
MediaRouteButtonStateиrememberMediaRouteButtonState, позволяющие отслеживать видимость средства выбора маршрута медиа, а также параметрstateв методMediaRouteButton(#3172). - Исправлена ошибка, из-за которой
RemoteCastPlayerмог навсегда застрять в состоянии маскирования трека после выбора трека, в результате чего он игнорировал последующие обновления трека от приемника Cast (#3237). - Исправлена ошибка, из-за которой
DefaultMediaItemConverterвыдаетNullPointerExceptionпри попытке присоединиться к сеансу трансляции, запущенному не из Media3. - Запрет на передачу
CastPlayerMediaItems, которые не могут быть воспроизведены при смене активного проигрывателя (#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.
- 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, попытайтесь сопоставить выходную схему динамиков (или пространственного звука, если применимо).
- Исправлена ошибка, из-за которой воспроизведение плейлиста с непрерывным аудио зависало в режиме сжатой разгрузки.
- Базовая библиотека декодирования для расширения декодера IAMF изменена с
- Текст:
- VobSub: для определения длительности подсказки используются команды управления SPU
STARTиSTOP, а не значение по умолчанию, равное 5 секундам (#2935).
- VobSub: для определения длительности подсказки используются команды управления SPU
- Метаданные:
- Количество средств визуализации метаданных по умолчанию увеличено до четырех, чтобы охватить все потенциальные дорожки метаданных, публикуемые вариантами и версиями 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. Он содержитsetPreferredLinearOrientationAPI. Это API, который проходит альфа-тестирование и позволяет задавать предпочтительную ориентацию для линейных объявлений. Если вы хотите присоединиться к группе альфа-тестирования, обратитесь к своему партнеру по аккаунту.
- Сеанс:
- Исправлена ошибка, из-за которой большие массивы в
MediaMetadata.artworkDataмогли приводить к сбою приложения. - Используйте тип int для аргумента
@Player.Commandв интерфейсеActionFactory(#2933). - Сделайте
MediaSessionServiceиMediaLibraryServiceLifecycleService, чтобы можно было прикреплять операции, учитывающие жизненный цикл, к жизненному циклу сервиса (#187). - Прекратить поддержку команд изменения громкости устройства от
MediaControllerиMediaBrowserдля локального воспроизведения. Приложения не должны менять громкость на устройстве. При необходимости для этого можно использовать APIAudioManager. - Обнаруживать устаревшие экземпляры
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, чтобы управлять скоростью воспроизведения. - Добавлен компонент
ProgressSliderComposable вmedia3-ui-compose-material3для отображения прогресса воспроизведения и перемотки с помощью перетаскивания и нажатия (#2288). - Избегайте использования большого буфера за пределами экрана при анимации PlayerControlView.
- Добавьте composable-функцию
Playerвmedia3-ui-compose-material3, которая объединяетContentFrameс настраиваемыми элементами управления, выровненными по верхнему краю, центру и нижнему краю. - Скрыть позицию воспроизведения от службы специальных возможностей, чтобы предотвратить непрерывное обновление объявлений, когда виден элемент
PlayerControlView.
- Добавьте composable-функцию
- Расширение HLS:
- Добавлена поддержка X-PLAYOUT-LIMIT с промежуточными объявлениями HLS (#2484).
- Добавлена поддержка атрибута
QUERYPARAMс#EXT-X-DEFINE(#1854). - Оптимизирован синтаксический анализ плейлистов HLS за счет кеширования сопоставителей регулярных выражений (#3008).
- Добавление дорожки метаданных ID3 (EMSG) в аудиоверсии (#3043).
- Добавлена возможность использовать резервные местоположения при возникновении ошибок загрузки, если доступны избыточные потоки из разных местоположений (#1988).
- Исправлено поведение X-SNAP для межстраничных объявлений HLS, чтобы правильно рассчитывать позицию начала и возобновления (#3013).
- Расширение DASH:
- Расширение 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).
- Исправлена ошибка, из-за которой при оценке поддержки декодера AC-4 в автомобильных сценариях некорректно удалялась поддержка
- Видео:
- Чтобы избежать задержек при воспроизведении, видеокодеки на устройствах с API ниже 30 отключаются, когда меняется частота кадров контента (#2941).
- Текст:
- VobSub: исправлена проблема с отсутствием некоторых субтитров за счет правильной обработки SPU, которые содержат только одну управляющую последовательность или имеют критически важную информацию, разделенную между несколькими управляющими последовательностями (#2935).
- Расширение IMA:
- Исправлена ошибка, из-за которой MIME-тип объявления не соответствовал MIME-типу, указанному в событии IMA LOADED. Теперь MIME-тип объявления сопоставляется с помощью индекса пакета объявлений и позиции объявления.
- Добавьте проверку на null перед доступом к результату
getAdsManager()иAdEvent.getAd().
- Сеанс:
- Исправлена ошибка, из-за которой остановка сеанса
MediaController, подключенного к платформе, приводила к сбою приложения, если остановка происходила во время воспроизведения объявления (#2948). - Добавьте дополнительные проверки экземпляров
extrasBundleв различных классах, чтобы защититься от некорректных экземпляров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).
- Передайте необработанный список объектов в формате JSON в обратный вызов
- Расширение 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 минут после того, как при попытке воспроизведения возникла причина для его подавления.
- Если в течение 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. - Исправлено распространение значений метаданных, отличных от
StringCharSequence, например строк со стилем 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внутри ComposeAndroidView, что влияло на 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 с неиерархическим манифестом URIdata:(#2688). - Сброс
LiveConfigurationдо значения, предоставленногоMediaItemDashMediaSourceпри выпуске и когда пользователь обновляет мультимедийный объект (#2606). - Устранена проблема, из-за которой происходили сбои, вызванные недопустимыми обновлениями манифеста, которые не регистрировались как ошибки проигрывателя (#2805).
- Исправлена ошибка
- Расширение RTSP:
- Обработка ошибки отсутствия пакетов RTP при обработке фрагментированных блоков NAL для H264 и H265 (#2613).
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Расширение AV1. Программный декодер AV1 теперь использует высокопроизводительную библиотеку
dav1dвместо предыдущей реализацииlibgav1, что повышает скорость декодирования. - Расширение FFmpeg. Исправлена ошибка, из-за которой не воспроизводились некоторые файлы FLAC. Теперь блок
STREAMINFOправильно анализируется и передается декодеру (#2887).
- Расширение AV1. Программный декодер AV1 теперь использует высокопроизводительную библиотеку
- Расширение 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_ONLYMediaCodec (который включен по умолчанию в режиме прокрутки). - Добавлена поддержка использования идентификатора виртуального устройства из
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, а также осуществлен переход на APIAutoCloseableна основе экземпляров. Используйте новый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).
- Исправлена ошибка, из-за которой набор для адаптации Trick Play объединялся с основным набором для адаптации, что приводило к созданию недопустимого элемента
- Расширение RTSP:
- Добавлена поддержка пакета агрегации RTP для H265 в соответствии с RFC 7798#4.4.2 (#2413).
- Исправлена ошибка
RtspClient, из-за которой при обработке ответа HTTP 302 использовался URI местоположения (#2398). - Добавлена поддержка синтаксического анализа для SessionDescriptions, содержащих строки с конечными пробелами (#2357).
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Исправлена ошибка, из-за которой метод
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChangeне работал для расширений декодера аудио (#2258).
- Исправлена ошибка, из-за которой метод
- Расширение Cast:
- Инструменты для тестирования:
- Добавьте
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.
- Добавьте
- Удалите устаревшие символы:
- Удален устаревший конструктор
SegmentDownloaderSegmentDownloader(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).
- MP4: извлекайте
- Аудио:
- Исправлена ошибка, из-за которой при воспроизведении плейлиста с короткими видео могла зависать позиция (#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сnullMediaMetadataне выполнялась повторная оценка метаданных (#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). - Добавлен экспериментальный синтаксический анализ зависимостей образцов
ExoPlayerAV1 для ускорения поиска. Включите ее с помощью нового APIDefaultRenderersFactory.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).
- Сохранять состояние активной службы в течение дополнительных 10 минут, когда воспроизведение приостановлено, остановлено или произошел сбой. Это позволяет пользователям возобновлять воспроизведение в течение этого времени ожидания, не рискуя столкнуться с ограничениями активных служб на различных устройствах. Обратите внимание, что вызов
- Интерфейс:
- Добавьте хранилища состояния и composable-функции в модуль
media3-ui-composeдляPlayerSurface,PresentationState,PlayPauseButtonState,NextButtonState,PreviousButtonState,RepeatButtonState,ShuffleButtonStateиPlaybackSpeedState.
- Добавьте хранилища состояния и composable-функции в модуль
- Скачивания:
- Исправлена ошибка в
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).
- MP3: исправлена ошибка, из-за которой воспроизведение останавливалось раньше времени, если оглавление фрейма
- Видео:
- Откат использования
MediaCodecAdapterпредоставленных значений соотношения сторон пикселя при обработкеonOutputFormatChanged(#1371).
- Откат использования
- Текст:
- Исправлена ошибка в
ReplacingCuesResolver.discardCuesBeforeTimeUs, из-за которой реплика, активная вtimeUs(началась раньше, но ещё не закончилась), неправильно отбрасывалась (#1939).
- Исправлена ошибка в
- Метаданные:
- Извлечение номеров дисков/треков и жанров из комментариев Vorbis в
MediaMetadata(#1958).
- Извлечение номеров дисков/треков и жанров из комментариев Vorbis в
Версия 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передаются только связанные ошибки загрузки, а ошибки синтаксического анализа игнорируются (это поведение по умолчанию).
- При новой обработке субтитров (во время извлечения) связанные ошибки синтаксического анализа (например, недопустимые данные субтитров) и загрузки (например, HTTP 404) передаются через обратные вызовы
- Исправлена ошибка, из-за которой элементы плейлиста или периоды в многопериодных потоках 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теперь может получатьnullSurfaceвconfigureи вызовы нового методаdetachOutputSurface, чтобы удалить ранее заданныйSurface, если кодек поддерживает это (MediaCodecInfo.detachedSurfaceSupported). - При обработке
onOutputFormatChangedиспользуются значения соотношения сторон пикселя, предоставленныеMediaCodecAdapter(#1371). - Добавлено временное решение проблемы с устройством Galaxy Tab S7 FE, из-за которой защищенные потоки H264 с частотой 60 кадров/с помечались как неподдерживаемые (#1619).
- Добавлено временное решение для кодеков, которые зависают после последнего фрагмента, не возвращая сигнал о конце потока.
- Текст:
- Добавлен настраиваемый
VoiceSpanи заполнен для диапазонов голоса WebVTT (#1632). - Обеспечен показ субтитров WebVTT в HLS с очень большими временными метками, которые переполняют 64-битный
long, если представлены в микросекундах и умножены на временную базу MPEG90,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:
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Добавлен модуль декодера IAMF, который обеспечивает поддержку воспроизведения файлов MP4, содержащих треки IAMF, с использованием нативной библиотеки libiamf для синтеза аудио.
- Поддерживается воспроизведение в стереоформате и формате 5.1 с пространственным звучанием и отслеживанием движений головы (необязательно). Бинауральное воспроизведение пока не поддерживается.
- Добавлена поддержка страниц размером 16 КБ для расширений декодера на Android 15 (#1685).
- Добавлен модуль декодера IAMF, который обеспечивает поддержку воспроизведения файлов MP4, содержащих треки IAMF, с использованием нативной библиотеки libiamf для синтеза аудио.
- Расширение Cast:
- Очистка хронологии прекращается после отключения CastSession, что позволяет приложению отправителя возобновить воспроизведение на устройстве после отключения.
- Заполнять
DeviceInfoCastPlayer, если указан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:
- Экстракторы:
- MP3. Исправлена ошибка
Searched too many bytes. Теперь данные, не относящиеся к MP3, корректно игнорируются на основе поля длины во фреймеInfo(#1480).
- MP3. Исправлена ошибка
- Текст:
- TTML: исправлена обработка процентных значений
tts:fontSize, чтобы они правильно наследовались от родительских узлов с процентными значениямиtts:fontSize. - Исправлена ошибка
IndexOutOfBoundsExceptionвLegacySubtitleUtil, возникавшая из-за неправильной обработки ситуации, когда запрошенное время начала вывода больше или равно времени последнего события вSubtitle(#1516).
- TTML: исправлена обработка процентных значений
- 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предпочтительнее размера, указанного в базовом потоке (например, размера файла или заголовка HTTPContent-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) неправильно сопоставлялись с тегами ID3TSO2,TSOAиTSOP(#1302). - Исправлено чтение числовых тегов
gnre(жанр) иtmpo(темп) в файлах MP4 (/iTunes), если значение занимает больше одного байта. - Передача фрейма ID3
TCONвMediaMetadata.genre(#1305).
- Исправлено сопоставление тегов сортировки MP4 и ID3. Ранее теги MP4 "сортировка альбомов" (
- Изображение:
- Добавлена поддержка неквадратных сеток значков DASH (#1300).
- Добавлена поддержка AVIF для API 34 и более поздних версий.
- Разрешить использовать
nullв качестве параметра дляExoPlayer.setImageOutput(), чтобы очистить ранее заданное значениеImageOutput.
- DataSource:
- Реализуйте поддержку URI произвольных необработанных ресурсов
android.resource://package/id, гдеpackageотличается от пакета текущего приложения. Ранее этот способ не был задокументирован, но он эффективнее, чем доступ к ресурсам в другом пакете по названию. - Проверьте, что
urlне равно null в конструкторахDataSpec. Этот параметр уже был аннотирован как ненулевой. - Разрешите
ByteArrayDataSourceпреобразовывать URI в массив байтов во времяopen(), а не задавать его в коде при создании (#1405).
- Реализуйте поддержку URI произвольных необработанных ресурсов
- 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внутри ComposeAndroidViewв 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).
- Исправлена ошибка, из-за которой ожидающие образцы EMSG, ожидающие разрыва, делегировались в
- Расширение DASH:
- Расширение 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) при использовании непосредственно следующих друг за другом подсказок.
- WebVTT: предотвращено создание ложных дополнительных экземпляров
- DRM:
- Устранена ошибка
NoSuchMethodError, которая могла возникать в фреймворкеMediaDrmвместоResourceBusyExceptionилиNotProvisionedExceptionна некоторых устройствах Android 14 (#1145).
- Устранена ошибка
- Эффект:
- Улучшено тональное отображение PQ в SDR за счет преобразования цветовых пространств.
- Сеанс:
- Интерфейс:
- Если
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).
- Реализуйте поддержку URI необработанных ресурсов
- 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).
- Добавлен дополнительный синтаксический анализ AV1C в экстрактор MP4 для получения значений
- Аудио:
- Видео:
- Измените конструктор
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незадолго до времени их показа.
- Добавлена поддержка значков DASH. Изображения сетки обрезаются, и отдельные значки передаются в
- DRM:
- По умолчанию сразу воспроизводить незашифрованные фрагменты в контенте с DRM, даже если ключи для последующих зашифрованных фрагментов ещё не готовы. Это может привести к остановке воспроизведения, если ключи не будут готовы, когда позиция воспроизведения достигнет зашифрованных фрагментов (но ранее воспроизведение вообще не начиналось бы в этот момент). Это поведение можно отключить с помощью
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKeyилиDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.- Расширение IMA:
- Исправлена ошибка, из-за которой не воспроизводились объявления DASH и HLS без подходящего расширения имени файла.
- По умолчанию сразу воспроизводить незашифрованные фрагменты в контенте с DRM, даже если ключи для последующих зашифрованных фрагментов ещё не готовы. Это может привести к остановке воспроизведения, если ключи не будут готовы, когда позиция воспроизведения достигнет зашифрованных фрагментов (но ранее воспроизведение вообще не начиналось бы в этот момент). Это поведение можно отключить с помощью
- Сеанс:
- Отключено распознавание двойного нажатия в приложениях для телевизоров (#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).
- Отмечайте дополнительные (невоспроизводимые) дорожки HEVC в фото с движением в формате JPEG как
- Аудио:
- Исправлена обработка EOS для
SilenceSkippingAudioProcessorпри многократном вызове (#712).
- Исправлена обработка EOS для
- Видео:
- Добавлено временное решение проблемы, из-за которой на устройствах 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, возникавшая при переключении с зашифрованного контента на незашифрованный, если к проигрывателю не была подключена поверхность. Ошибка возникла из-за неправильного использования защищенного декодера для воспроизведения незащищенного контента.
- Расширен обходной путь для ложного URL лицензии ClearKey
- Сеанс:
- Специальные ключи и значения помещаются в
MediaMetadataCompatдляMediaMetadata.extrasиMediaMetadata.extrasдляMediaMetadataCompat(#756, #802). - Исправлена трансляция
notifyChildrenChangedдля устаревших контроллеров (#644). - Исправлена ошибка, из-за которой установка отрицательного времени для отключенного таймера
setWhenуведомления приводила к сбою на некоторых устройствах (#903). - Исправлена ошибка
IllegalStateException, возникавшая, когда контроллер уведомлений мультимедиа не успевал подключиться к моменту запроса первого обновления уведомлений (#917).
- Специальные ключи и значения помещаются в
- Интерфейс:
- Расширение DASH:
- Значение f800 в манифесте DASH для Dolby теперь интерпретируется как 5 каналов (#688).
- Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
- Расширение Cast:
- Исправлена ошибка, из-за которой при сбое загрузки медиаконтента на устройстве Cast приложение аварийно завершало работу во время создания
Timeline(#708).
- Исправлена ошибка, из-за которой при сбое загрузки медиаконтента на устройстве Cast приложение аварийно завершало работу во время создания
Версия 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).
- Добавлена поддержка 24- и 32-битных PCM с обратным порядком байтов в MP4 и Matroska, а также синтаксический анализ кодировки PCM для
- Видео:
- Разрешить
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_METADATACOMMAND_SET_PLAYLIST_METADATACOMMAND_SET_DEVICE_VOLUME_WITH_FLAGSCOMMAND_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(), чтобы включить ведение журнала специальных ключей.
- По умолчанию ведение журнала CMCD отключено. Чтобы включить его, используйте
- В манифест основного демоприложения добавлено дополнительное действие, которое упрощает запуск приложения с пользовательским файлом
*.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)при вызове пустого плейлиста.
- Разрешите ExoPlayer управлять громкостью устройства, только если пользователь явно дал на это согласие. Используйте
- Трансформер:
- Удалить
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, то при изменении возможностей средства отрисовки будет запускаться выбор нового трека.
- Добавьте
- Экстракторы:
- Аудио:
- Исправлена ошибка, из-за которой не воспроизводились некоторые видео, если включено туннелирование и активны
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, чтобы создать собственные элементы интерфейса с кнопкой воспроизведения/паузы.
- Добавьте методы Util
- Расширение RTSP:
- Расширение DASH:
- Удалите смещение по времени из
MediaLoadData.startTimeMsиMediaLoadData.endTimeMsдля потоков DASH с несколькими периодами. - Исправлена ошибка, из-за которой повторная подготовка источника медиаконтента DASH с несколькими периодами приводила к возникновению ошибки
IndexOutOfBoundsException(#10838).
- Удалите смещение по времени из
- Расширение HLS:
- Добавьте
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), чтобы задать время ожидания инициализацииTimestampAdjusterдля потока загрузки. Если инициализация не завершится до истечения времени ожидания, будет выдана ошибкаPlaybackException, чтобы избежать бесконечной остановки воспроизведения. По умолчанию время ожидания равно нулю (#323).
- Добавьте
- Инструменты для тестирования:
- Проверьте, не зависит ли схема URI от регистра в
DataSourceContractTest.
- Проверьте, не зависит ли схема URI от регистра в
- Удалите устаревшие символы:
- Удалите конструкторы
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.
- Основная библиотека:
- Скачивания:
- Добавлена возможность настраивать максимальную разницу между временем начала двух сегментов, которые нужно объединить, в
SegmentDownloaderи подклассах (#248).
- Добавлена возможность настраивать максимальную разницу между временем начала двух сегментов, которые нужно объединить, в
- Аудио:
- Видео:
- Сопоставлять формат HEVC HDR10 с
HEVCProfileMain10HDR10вместоHEVCProfileMain10. - Добавлено временное решение проблемы с устройством на Chromecast с Google TV и Lenovo M10 FHD Plus, из-за которой потоки AVC с частотой 60 кадров/с помечаются как неподдерживаемые (#10898).
- Исправлены проблемы производительности при воспроизведении медиаконтента с частотой кадров, которая намного выше частоты обновления экрана.
- Сопоставлять формат HEVC HDR10 с
- В ролях:
- Исправлена временная ошибка
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).
- При синтаксическом анализе атомов trak выбрасывать
- Аудио:
- Используйте битрейт сжатого аудиоформата, чтобы рассчитать минимальный размер буфера для
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может загружать растровые изображения из URIfile://(#108).- Исправлено утверждение, которое не позволяло
MediaControllerпропускать объявление в период (#122). - Когда воспроизведение заканчивается,
MediaSessionServiceостанавливается в активном режиме и появляется уведомление о том, что можно перезапустить воспроизведение последнего мультимедийного объекта (#112). - Не запускайте активную службу с отложенным намерением для паузы (#167).
- Вручную скрывайте значок, связанный с уведомлением, созданным
DefaultNotificationProviderв API 26 и API 27 (в API 28 и более поздних версиях значок скрывается автоматически) (#131). - Исправлена ошибка, из-за которой второе подключение связывателя от устаревшего MediaSession к MediaController Media3 вызывало исключения IllegalStateException (#49).
- RTSP:
- 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).
- Убедитесь, что изменение
- Экстракторы:
- DASH:
- Добавлена возможность анализировать URL лицензии ClearKey из манифестов (#10246).
- Интерфейс:
- Убедитесь, что TalkBack озвучивает выбранную скорость воспроизведения в меню элементов управления воспроизведением (#10298).
- RTSP:
- Добавлена обработка фрагментированных пакетов VP8 (#110).
- Расширение Leanback:
- Прослушивать изменения
playWhenReadyвLeanbackAdapter(10420).
- Прослушивать изменения
- В ролях:
Версия 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, чтобы игроки могли устанавливать один предмет.
- Включить поддержку диагностики платформы Android через
- Выбор трека:
- Объединить класс
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.
- Измените
- Экстракторы:
- Интерфейс:
- Исправлена передача событий в
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можно передавать явным образом.
- Анализ количества каналов из элементов DTS
- 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).
- Обновите CMake до версии
- Удалите устаревшие символы:
- Удалить
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).
- Экстракторы:
- Текст:
- Добавлено поле
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).
- Интерфейс:
- 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 для переопределения
- Трансформер:
- Минимальная требуемая версия API повышена до 21.
TransformationExceptionтеперь используется для описания ошибок, возникающих во время преобразования.- Добавьте
TransformationRequest, чтобы указать параметры преобразования. - Разрешить регистрацию нескольких слушателей.
- Исправлена ошибка, из-за которой Transformer зависал, когда выходные данные кодека считывались частично.
- Исправлена потенциальная ошибка NPE в
Transformer.getProgress, когда освобождение мультиплексора вызывает исключение. - Добавьте демонстрационное приложение для применения преобразований.
- Расширение MediaSession:
- По умолчанию
MediaSessionConnectorтеперь очищает плейлист при остановке. Приложения, которые хотят сохранить плейлист, могут вызватьsetClearMediaItemsOnStop(false)в коннекторе.
- По умолчанию
- Расширение Cast:
- Расширение 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).
- Обновите расширение Cast, чтобы оно зависело от
- Удалите устаревшие символы:
- Удалить
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. Это обеспечивает прямую интеграцию между проигрывателями и медиасеансами без необходимости использовать класс адаптера/коннектора.