Media3

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

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

Чтобы добавить зависимость от 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.11.0

1.11.1

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

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

Версия 1.11.0

5 августа 2026 г.

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

1.11.0-rc01

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

1.11.0-beta01

7 июля 2026 г.

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

1.11.0-alpha01

24 июня 2026 г.

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

Версия 1.10.0

1.10.1

12 мая 2026 г.

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

1.10.0

26 марта 2026 г.

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

1.10.0-rc03

25 марта 2026 г.

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

1.10.0-rc02

16 марта 2026 г.

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

1.10.0-rc01

10 марта 2026 г.

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

1.10.0-beta01

25 февраля 2026 г.

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

1.10.0-alpha01

6 февраля 2026 г.

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

Версия 1.9.0

1.9.4

16 мая 2026 г.

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

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

1.9.3

16 марта 2026 г.

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

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

1.9.2

6 февраля 2026 г.

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

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

1.9.1

26 января 2026 г.

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

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

1.9.0

17 декабря 2025 г.

  • Общая библиотека:
    • Обновите minSdk до 23 в соответствии с другими библиотеками AndroidX.
    • Добавлен класс PlayerTransferState, который упрощает перенос состояния воспроизведения между экземплярами Player.
    • Добавьте в Player методы void mute() и void unmute(), которые сохраняют и восстанавливают громкость Player до и после установки ее на ноль.
    • Опубликуйте служебные классы WakeLockManager, WifiLockManager, AudioFocusManager, AudioBecomingNoisyManager и StuckPlayerDetector, которые ранее использовались ExoPlayer, чтобы разрешить повторное использование для других проигрывателей (#1893).
    • Исправлена обработка прослушивателя ForwardingPlayer, когда базовый делегированный проигрыватель использует равенство ссылок для сравнения экземпляров прослушивателя (#2675).
    • Добавьте функцию приостановки расширения Player.listenTo в библиотеку media3-common-ktx, которая указывает конкретный Player.Events, с которым нужно выполнить действие.
    • Исправлен сбой в BasePlayer.getBufferedPercentage, возникавший из-за переполнения целого числа, когда сообщаемая позиция буферизации была неправдоподобно больше сообщаемой длительности (#2750).
    • Исправлено автоматическое определение типа дорожки TrackGroup. Теперь специальный MIME-тип образца не игнорируется, а в качестве резервного варианта используется потенциально неверный тип дорожки из MIME-типа контейнера (#2860).
  • ExoPlayer:
    • Добавьте функцию обнаружения зависания проигрывателя, которая будет вызывать ошибку StuckPlayerException, если проигрыватель завис. Это происходит в следующих случаях (при необходимости время ожидания по умолчанию можно настроить в ExoPlayer.Builder):
      • Если в течение 10 минут STATE_BUFFERING не воспроизводится и не буферизуется.
      • Если в течение 10 секунд после попытки воспроизведения STATE_READY не начинается.
      • Если по истечении 1 минуты после STATE_READY заявленной продолжительности конец объекта не достигнут.
      • Если в течение 10 минут воспроизведение не удается начать из-за ошибки.
    • Включить обработку запрета блокировки по умолчанию, чтобы устранить проблемы с буферизацией во время фонового воспроизведения. Это эквивалентно установке значения C.WAKE_MODE_LOCAL для параметра ExoPlayer.Builder.setWakeMode.
    • Добавьте логику прослушивания, чтобы автоматически обновлять идентификатор виртуального устройства, когда сообщается об изменении в Context, изначально переданном в ExoPlayer.Builder.
    • Добавьте ExoPlayer.setVirtualDeviceId, чтобы вручную обновить идентификатор виртуального устройства, полученный из Context и переданный в ExoPlayer.Builder.
    • Убедитесь, что средства визуализации не используют данные из следующего элемента плейлиста более чем за 10 секунд до окончания текущего элемента.
    • Добавлены методы setSeekBackIncrementMs, setSeekForwardIncrementMs и setMaxSeekToPreviousPositionMs в ExoPlayer, позволяющие обновлять эти настройки после создания (#2736).
    • Добавьте функцию предварительного кеширования в DefaultPreloadManager. Теперь приложения могут возвращать DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) или DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) через TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData), чтобы указать, что мультимедийный объект нужно предварительно кешировать.
    • Используйте функцию предварительного кеширования DefaultPreloadManager в демоприложении для коротких видео.
    • Добавьте сеттеры DefaultLoadControl.Builder для локального воспроизведения и настройте значения по умолчанию для DefaultLoadControl, чтобы обеспечить совместимость с широким спектром локальных файлов.
    • Исправлена ошибка, из-за которой при настройке пустого плейлиста проигрыватель мог оставаться в состоянии STATE_READY или STATE_BUFFERING.
    • Улучшение API менеджера предварительной загрузки:
      • Добавьте addMediaItems(List<MediaItem>, List<T>) и addMediaSources(List<MediaSource>, List<T>), которые добавляют мультимедийные объекты или источники мультимедиа в пакетном режиме и автоматически вызывают invalidate().
      • Добавьте removeMediaItems((List<MediaItem>) и removeMediaSources(List<MediaSource>), которые удаляют мультимедийные объекты или источники в пакетном режиме. Убедитесь, что менеджер предварительной загрузки не начинает и не продолжает предварительную загрузку ни одного из них после удаления.
      • Разрешить DefaultPreloadManager.setCurrentPlayingIndex(int) автоматически аннулировать себя. После обновления индекса текущего воспроизведения приложениям больше не нужно явно вызывать invalidate().
    • Добавлена возможность пропускать сброс ключевого кадра при перемотке вперед в пределах одной группы изображений в режиме прокрутки.
    • Добавьте DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int), чтобы приложения могли задавать значение целевого буфера в байтах для проигрывателя с указанным playerName. Теперь DefaultLoadControl может принимать решения для каждого проигрывателя отдельно на основе выделенных ему байтов и целевого размера буфера.
    • Добавьте SkipInfo в AdPlaybackState.AdGroup, чтобы передавать информацию о пропуске для каждого объявления в группе.
    • Исправлена ошибка, из-за которой вызов removeMediaItems(List) во время воспроизведения видеорекламы в конце ролика приводил к сбою (#2746).
    • Исправлены некоторые задержки при воспроизведении плейлистов, когда кадры ошибочно всегда устанавливались как последний образец и отрисовывались.
    • Добавлена возможность повторной попытки, если проигрывателю не удается сгенерировать идентификатор аудиосеанса (#2382, #2678).
    • Добавлена поддержка управления общим размером буфера для источников в DefaultPreloadManager, чтобы избежать произвольного увеличения размера буфера для предварительной загрузки. Чтобы использовать логику управления по умолчанию, приложения могут задавать целевой размер буфера для предзагрузки с помощью DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) для playerName со значением PlayerId.Preload.name ("preload") и внедрять созданный DefaultLoadControl с помощью DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • Добавлен метод cloneAndSet(int, int) в ShuffleOrder с реализацией по умолчанию (#2834).
    • Добавлено смещение возобновления контента при пропуске воспроизведения объявления после корректировки поиска или автоматического перехода (#2484).
    • Добавлен API для настройки и отслеживания параметров кодеков для аудио- и видеодорожек. Эта функция реализована для средств визуализации на основе MediaCodec и требует API 29 или более поздней версии.
      • Используйте ExoPlayer.setAudioCodecParameters() и ExoPlayer.setVideoCodecParameters(), чтобы применить параметры.
      • Используйте ExoPlayer.addAudioCodecParametersChangeListener() и ExoPlayer.addVideoCodecParametersChangeListener(), чтобы отслеживать изменения. Для отслеживания ключей, относящихся к поставщику, требуется API 31 или более поздней версии.
    • Исправлена ошибка IllegalStateException, которая возникала, если задать пустой источник медиаконтента после перехода к ненулевой позиции, а затем подготовить проигрыватель с непустым источником медиаконтента.
    • Исправлена ошибка, из-за которой при переходе к другим мультимедийным объектам в режиме перемотки мог возникать сбой IllegalStateException.
    • Исправлена потенциальная ошибка NullPointerException в DefaultPlaybackSessionManager (#2885).
    • Включить улучшенную перемотку для подходящих видео.
    • Повторно включена асинхронная расшифровка в MediaCodec на API 36 и более поздних версиях, где исправлены проблемы с тайм-аутом в этом API платформы (#1641).
    • Измените значение по умолчанию для MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs на 15 мс и включите более эффективный пропуск кадров видео перед декодированием для подходящих видео.
    • Добавьте максимальный лимит памяти для автоматического расчета памяти в DefaultLoadControl. Это должно происходить, только если выбрано слишком много треков (#2860).
    • Исправлена ошибка, из-за которой при воспроизведении плейлиста или в режиме повтора перемотка в режиме прокрутки ближе к концу могла привести к переходу к следующему мультимедийному объекту.
  • CompositionPlayer:
    • Опубликуйте CompositionPlayer с новой аннотацией @ExperimentalApi, чтобы указать, что функция доступна для экспериментов, но все ещё находится в разработке. Некоторые API могут значительно измениться в будущих выпусках. Кроме того, в некоторых случаях могут возникать известные проблемы и ограничения (некоторые из них не задокументированы).
    • Добавлена поддержка COMMAND_SET_AUDIO_ATTRIBUTES и обработки фокуса аудио в CompositionPlayer.
    • Добавлена поддержка изменения скорости во второстепенных последовательностях в CompositionPlayer.
    • Добавьте поддержку EditedMediaItem.removeVideo.
  • Трансформатор:
    • Использовать InAppMp4Muxer в качестве мультиплексора по умолчанию.
    • Добавьте EditedMediaItem.Builder#setSpeed() и прекратите поддержку Effects#createExperimentalSpeedChangingEffects().
    • Замените forceAudioTrack и forceVideoTrack на trackTypes в EditedMediaItemSequence.
  • Выбор дорожки:
    • Добавьте TrackSelectionParameters.selectTextByDefault, чтобы выбрать любую текстовую дорожку без указания других, более конкретных предпочтений.
    • Добавьте preferredVideoLabels, preferredAudioLabels и preferredTextLabels в TrackSelectionParameters, чтобы указать предпочтение для треков с определенным ярлыком, например тех, которые считываются из тегов HLS NAME (#1666).
  • Экстракторы:
    • FLAC: улучшено распознавание заголовков, чтобы снизить вероятность обнаружения ложных заголовков в закодированных данных FLAC, что приводит к ошибкам декодирования (#558).
    • MP3: разрешены пробелы между тегами ID3 и перед ними в начале MP3-файлов (#811, #5718).
    • MP3: лимит на сниффинг увеличен до 128 КБ, чтобы соответствовать существующему лимиту на поиск байта синхронизации (#2713).
    • MP3: теперь FLAG_ENABLE_INDEX_SEEKING предпочитает получать информацию для поиска из заголовков метаданных (например, Xing и VBRI), если они доступны. Если такой информации нет, используется поиск на основе индекса. Это повышает производительность при работе с файлами, содержащими метаданные поиска (#2839).
    • MP3. Изменено значение Mp3Extractor, чтобы по умолчанию использовался постоянный битрейт (CBR), если не найдены метаданные поиска (например, Xing, VBRI), даже если задано значение FLAG_ENABLE_INDEX_SEEKING. Это связано с историей спецификации MP3, в которой CBR был стандартом, а VBR требует явных заголовков. Это улучшает возможность немедленного поиска для файлов без метаданных за счет потенциальной точности для файлов VBR без заголовков. Если предположение о постоянном битрейте не позволяет выполнить перемотку (например, для потоков неизвестной длины), то в качестве резервного варианта используется перемотка по индексу (#2848).
    • MP4: устранена неоднозначность между MIME-типами audio/mpeg (MP3), audio/mpeg-L1 и audio/mpeg-L2. Теперь перед извлечением формата трека из экстрактора проверяется значение слоя первого образца (#2683).
    • MP4: улучшено распознавание очень больших файлов. Теперь, если размер блока stbl превышает 1 МБ, файл считается нефрагментированным (#2650).
    • MP4: добавлена поддержка метаданных ©mvn (название движения) и ©mvi (индекс движения). Теперь они передаются как объекты TextInformationFrame в Format.metadata с идентификаторами MVNM и MVIN соответственно (#2754).
    • MP4: игнорирование дорожек с отсутствующим полем stsd (вместо сбоя при обработке всего файла).
    • Matroska: добавлена поддержка обнаружения DTS-HD (#6225).
    • Исправлена ошибка в MatroskaExtractor, из-за которой поиск мог быть неточным для файлов с несколькими треками. Временные точки теперь правильно связаны с соответствующими дорожками, что обеспечивает более точную перемотку.
    • MPEG-TS: исправлена ошибка IllegalArgumentException из ReorderingBufferQueue, вызванная пакетами PES без временной метки (#2764).
    • Добавлена поддержка извлечения фото с движением в формате HEIC. Теперь HeifExtractor может анализировать файлы HEIC со встроенными видео- и аудиодорожками.
  • Инспектор:
    • Добавлен новый модуль :media3-inspector, предназначенный для утилит проверки медиафайлов. Теперь в этом модуле есть новый класс androidx.media3.inspector.MetadataRetriever, который предоставляет унифицированный API для извлечения метаданных и кадров. Существующая версия androidx.media3.exoplayer.MetadataRetriever больше не поддерживается.
    • Добавлен новый общедоступный API androidx.media3.inspector.FrameExtractor для извлечения кадров. Класс AutoCloseable позволяет извлекать кадры с поддержкой HDR-видео, видеоэффектов и выбора декодера. Его нужно создать с помощью Builder для определенного MediaItem.
    • FrameExtractor. Добавьте getThumbnail(), чтобы извлечь из медиафайла кадр для значка, не указывая временную метку.
    • Добавьте androidx.media3.inspector.MediaExtractorCompat – замену для android.media.MediaExtractor, которая позволяет извлекать необработанные закодированные медиафрагменты из медиафайла. Существующий класс androidx.media3.exoplayer.MediaExtractorCompat теперь не рекомендуется использовать.
  • Аудио:
    • Сообщите экземплярам AudioProcessor о поиске.
    • Разрешить внедрение нового интерфейса AudioOutputProvider в DefaultAudioSink.Builder для поддержки пользовательских путей вывода аудио. Значение по умолчанию – AudioTrackAudioOutputProvider.
    • Обработка перемотки в GainProcessor.
    • При оценке поддержки формата трека используются возможности профиля и уровня декодера AC-4 (#2580).
    • Устранена проблема, из-за которой могли возникать задержки, связанные с обработкой обратных вызовов при изменении маршрутизации в начале воспроизведения (#2646).
    • Разрешено повторное использование кодеков для форматов EAC3, EAC3-JOC и AC-4 (#1346).
    • Добавлена поддержка PCM-сэмплов с плавающей запятой в Sonic.
    • Добавлена поддержка 16-битных PCM-сэмплов в ToFloatPcmAudioProcessor.
  • Видео:
    • Отключить повторное использование кодека для контента Dolby Vision с разными профилями.
    • Повторно включено временное решение для неправильно сообщаемых баллов производительности для защищенных кодеков (#2856).
  • Текст:
    • Исправлена обработка субтитров CEA-6/708 в контенте Dolby Vision (#2775).
  • Изображение:
    • Устранена проблема со ScrubbingMode, из-за которой проигрыватель зависал при перемотке дорожки значков DASH (#2815).
  • DRM:
    • Измените тип возвращаемого значения методов MediaDrmCallback с byte[] на новый тип MediaDrmCallback.Response, чтобы разрешить возврат дополнительной необязательной информации. Это критическое изменение, но его можно легко устранить, обернув предыдущее возвращаемое значение byte[] в new Response перед возвратом.
    • Добавьте в AnalyticsListener.onDrmKeysLoaded ключевую информацию о запросе, например URL и задержку (#1001).
    • Перенесите данные запроса на инициализацию из параметра URL в тело POST.
  • Эффект:
    • Добавьте Presentation.copyWithUnsetSideRoundedTo, чтобы округлить сторону, для которой не задано значение, если Presentation создается с одной длиной стороны.
  • Мультиплексоры:
    • Добавьте MediaMuxerCompat, который заменит фреймворк MediaMuxer.
    • Чтобы создать фото с движением, добавьте ещё MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo().
    • Добавьте WebmMuxer, чтобы разрешить мультиплексирование медиапотоков OPUS, VORBIS, VP8 и VP9 в формат файла webm.
  • Расширение IMA:
    • Удалены специальные правила proguard, чтобы приложения могли использовать правила, выпущенные в архиве IMA для Android.
    • Добавлен новый API ImaServerSideAdInsertionUriBuilder.setNetworkCode, который позволяет задавать код сети Google Менеджера рекламы для IMA SDK, чтобы обрабатывать идентификаторы объявлений в соответствии с настройками Google Менеджера рекламы. Коды сетей необязательны, но рекомендуются для запросов потоков с полным набором услуг. Чтобы узнать, как найти код сети, прочитайте эту статью.
    • Зависимость IMA обновлена до версии 3.37.0, для которой требуется включить десахаризацию основной библиотеки. Это также должно быть включено зависимыми приложениями. Ознакомьтесь с примечаниями по настройке IMA. * Добавлена поддержка настроек пользовательского интерфейса IMA DAI в конструкторе URI для вставки объявлений на стороне сервера. Специальные настройки пользовательского интерфейса для вставки объявлений на стороне сервера включают поддержку отрисовки элементов "С возможностью пропуска" и "Об этой рекламе". В настоящее время эта функция доступна только издателям, включенным в белый список. Это изменение также обновляет IMA SDK до версии 3.38.0 (примечания к выпуску), чтобы обеспечить доступ к API настроек пользовательского интерфейса.
    • Исправлена ошибка, из-за которой ошибка подготовки контента после объявления ошибочно регистрировалась как ошибка воспроизведения объявления (#2656).
  • Сеанс:
    • Добавлен новый параметр в MediaSession.Callback.onPlaybackResumption, указывающий, выполняется ли вызов только для сбора информации или для начала воспроизведения (#1764).
    • Обновлен метод MediaSession.ControllerInfo.isTrusted, чтобы контроллеры из собственного приложения также объявлялись доверенными (#2542).
    • Добавлен метод MediaSessionService.triggerNotificationUpdate, позволяющий вручную запускать обновление уведомлений (#1833).
    • Добавьте ProgressListener в методы специальных команд.
    • Измените значение по умолчанию для MediaLibrarySession.Builder.setLibraryErrorReplicationMode на non fatal.
    • Добавлен параметр Context в MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • Считывать идентификатор управления громкостью с платформы PlaybackInfo, а не получать его через Binder. Это гарантирует, что тип воспроизведения и идентификатор управления громкостью считываются атомарно и соответствуют друг другу.
    • Исправлена ошибка, из-за которой события клавиш ACTION_UP отфильтровывались до передачи в обратный вызов для специальной обработки. Это обеспечивает паритет с тем, что делала библиотека media1 и делает платформа (#2637).
    • Исправлена ошибка, из-за которой getCurrentTimeline() вызывался PlayerWrapper, даже когда команда была недоступна (#2665).
    • Исправлена ошибка, из-за которой сообщение оставалось в очереди сообщений основного цикла, что приводило к утечке памяти после завершения работы сервиса (#2692).
    • При подключении к устаревшему приложению сеанса с помощью MediaBrowser настраиваемые команды отправляются в сеанс, только если настраиваемое действие объявлено как настраиваемое действие в PlaybackStateCompat устаревшего сеанса. Все остальные настраиваемые действия отправляются в сервис.
    • Реализован метод onAudioSessionIdChanged, который уведомляет контроллеры мультимедиа, когда сеанс задает идентификатор аудиосеанса (#244).
    • Исправлена ошибка, из-за которой KEYCODE_HEADSETHOOK не запускал проигрыватель при поступлении события мультимедийной клавиши Intent в onStartCommand(). Теперь KEYCODE_HEADSETHOOK обрабатывается так же, как KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • Исправлена ошибка, из-за которой размер Surface не передавался между сеансом и контроллером, что приводило к сбою при применении видеоэффектов в демосеансе. Если вы используете контроллер, это может быть критическим изменением, если ваш проигрыватель не может обработать вызов setVideoSurfaceHolder.
    • Исправлено распространение значений метаданных, отличных от String CharSequence, например строк со стилем span (#2853).
    • Добавьте CommandButton.executeAction, чтобы контроллерам было проще запускать нужное действие. Также позволяет указывать параметры для некоторых команд проигрывателя и сеанса, чтобы определить, какое действие следует запустить.
    • Добавьте обратную совместимость для экземпляров CommandButton, используя Player.Command или стандартный SessionCommand, чтобы определить их действие. Теперь они правильно представлены в медиасеансах платформы, например в системном интерфейсе или Android Auto.
    • Исправлена ошибка, из-за которой один и тот же Bitmap сжимался несколько раз при подключении MediaController к медиасеансу платформы.
  • Интерфейс:
    • Добавьте класс ProgressStateWithTickInterval и соответствующую composable-функцию rememberProgressStateWithTickInterval в модуль media3-ui-compose. Это хранилище состояния используется в demo-compose, чтобы показывать текущую позицию и продолжительность в текстовом формате.
    • Добавьте MuteButtonState в ui-compose, чтобы отключить звук Player. Это хранилище состояния используется в demo-compose для отображения переключателя включения/выключения звука.
    • Добавьте классы ProgressStateWithTickCount и соответствующую composable-функцию rememberProgressStateWithTickCount в модуль media3-ui-compose. Это хранилище состояния используется в demo-compose для отображения горизонтального индикатора выполнения, доступного только для чтения.
    • Добавьте composable-функцию ContentFrame в media3-ui-compose, которая объединяет управление PlayerSurface с изменением соотношения сторон и закрытием затвора.
    • Устранена известная ошибка платформы API 34, из-за которой видео растягивались или обрезались при использовании SurfaceView внутри Compose AndroidView, что влияло на composable-функции ContentFrame и PlayerSurface с SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • Создайте новый модуль media3-ui-compose-material3 и добавьте в него composable-функции с темой Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton).
    • Добавьте composable-функцию TimeText в media3-ui-compose-material3, чтобы показывать прогресс игрока в текстовом формате. Его можно настроить так, чтобы он показывал текущую позицию, продолжительность или оставшееся время.
    • Добавьте поддержку размещения кнопки передачи медиаданных в PlayerView.
    • Используйте BidiFormatter, чтобы правильно отображать знаки препинания в субтитрах с направлением письма справа налево (#11214).
  • Расширение HLS:
    • Обработка атрибутов пропуска межстраничных объявлений HLS.
    • Сопоставьте атрибуты управления пропуском из плейлиста HLS и документа со списком объектов с AdPlaybackState для общего доступа.
    • Исправлена ошибка, из-за которой время начала плейлиста сбрасывалось, когда из плейлиста удалялся тег EXT-X-PROGRAM-START-DATE, определяющий время начала (#2760).
    • Используйте двоичный поиск, чтобы найти индекс сегмента заданной позиции в плейлисте (#2826).
    • Добавьте HlsInterstitialsAdsLoader.skipCurrentAd() и skipCurrentAdGroup(), а также соответствующие методы, чтобы пропускать объявления и группы объявлений по индексу.
    • Добавьте HlsInterstitialsAdsLoader.Listener.onAdStarted, чтобы сообщить о начале периода показа объявления (#2859).
    • В строках даты и времени ISO 8601 в качестве разделителя можно использовать пробел.
    • Исправлена ошибка, из-за которой не удавалось получить следующий фрагмент для HlsMediaPlaylist без сегментов (#2821).
    • Используйте позицию по умолчанию для рекламы в начале трансляции.
  • Расширение DASH:
    • Исправлена ошибка UnsupportedOperationException, возникавшая при воспроизведении потоков DASH с неиерархическим манифестом URI data: (#2688).
    • Сброс LiveConfiguration до значения, предоставленного MediaItem DashMediaSource при выпуске и когда пользователь обновляет мультимедийный объект (#2606).
    • Устранена проблема, из-за которой происходили сбои, вызванные недопустимыми обновлениями манифеста, которые не регистрировались как ошибки проигрывателя (#2805).
  • Расширение RTSP:
    • Обработка ошибки, связанной с отсутствием пакетов RTP при обработке фрагментированных блоков NAL для H264 и H265 (#2613).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Расширение AV1. Программный декодер AV1 теперь использует высокопроизводительную библиотеку dav1d вместо предыдущей реализации libgav1, что повышает скорость декодирования.
    • Расширение FFmpeg. Исправлена ошибка, из-за которой не воспроизводились некоторые файлы FLAC. Теперь блок STREAMINFO правильно анализируется и передается декодеру (#2887).
  • Расширение Cast:
    • Добавьте CastPlayer.Builder, чтобы CastPlayer мог воспроизводить контент как локально, так и через Cast. Чтобы сохранить старое поведение CastPlayer, поддерживающее только воспроизведение Cast, можно использовать RemoteCastPlayer. Существующие конструкторы CastPlayer сохраняют прежнее поведение, но считаются устаревшими. Вместо них рекомендуется использовать конструкторы CastPlayer или RemoteCastPlayer.
    • Прекратить принудительное применение ненулевого MIME-типа в DefaultMediaItemConverter.
    • Используйте MediaItem.mediaMetadata.mediaType, чтобы определить, какой тип медиаконтента (MEDIA_TYPE) нужно использовать в DefaultCastOptionsProvider#toMediaQueueItem, если он доступен.
    • Включите передачу данных с удаленного устройства на локальное в DefaultCastOptionsProvider.
    • Добавьте поддержку Cast в демо-версию Session.
    • Добавьте поддержку показа кнопки маршрута медиа в Composable UI.
    • Добавьте поддержку кнопки выбора устройства воспроизведения на панели действий.
    • Добавьте поддержку показа кнопки маршрута медиа в виде 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.
    • Убедитесь, что последний кадр правильно отображается при использовании флага MediaCodec DECODE_ONLY (который включен по умолчанию в режиме прокрутки).
    • Добавлена поддержка использования идентификатора виртуального устройства из 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).
    • Разрешите CmcdConfiguration.Factory возвращать null, чтобы отключить ведение журнала 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: используйте продолжительность и размер данных из Xing, VBRI и аналогичных метаданных с переменным битрейтом, когда переходите к поиску с постоянным битрейтом из-за FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • Аудио:
    • Исправлена ошибка, из-за которой метод AnalyticsListener.onAudioPositionAdvancing не вызывался, если воспроизведение аудио начиналось незадолго до конца медиафайла.
    • Добавлена поддержка всех форматов семплов линейной импульсно-кодовой модуляции в ChannelMappingAudioProcessor и TrimmingAudioProcessor.
    • Добавлена поддержка пробелов в аудио для CompositionPlayer.
    • Удалите ложный вызов BaseAudioProcessor#flush() из BaseAudioProcessor#reset().
    • Разрешить постоянное повышающее/понижающее микширование мощности в DefaultAudioMixer.
    • Сделайте ChannelMappingAudioProcessor, TrimmingAudioProcessor и ToFloatPcmAudioProcessor общедоступными (#2339).
    • Используйте AudioTrack#getUnderrunCount() в AudioTrackPositionTracker, чтобы обнаруживать опустошения буфера в DefaultAudioSink, а не оценивать их.
    • Улучшено сглаживание временных меток аудио для неожиданного смещения позиции от устройства вывода аудио.
    • Исправлена ошибка, из-за которой аудио и видео не синхронизировались в течение первых 10 секунд после возобновления воспроизведения при подключении к устройствам Bluetooth.
    • Исправлена ошибка, из-за которой AnalyticsListener.onAudioPositionAdvancing сообщал не время начала воспроизведения аудио, а время первого измерения.
    • Исправлена ошибка, из-за которой на некоторых устройствах после перехода на стерео не восстанавливалось многоканальное аудио (#2258).
  • Видео:
    • Обходное решение для отсоединенной поверхности теперь работает на устройствах Lenovo и Motorola (#2059).
    • Улучшено плавное воспроизведение кадров видео при запуске, когда аудиосемплы начинаются не точно в запрошенной позиции.
    • Расширен обходной путь для отсоединенной поверхности на устройствах realme (#2059).
    • Добавлен экспериментальный API ExoPlayer, позволяющий включать флаг MediaCodec.BUFFER_FLAG_DECODE_ONLY при постановке в очередь входных буферов, предназначенных только для декодирования. Этот флаг сообщает декодеру, что нужно пропустить буферы, предназначенные только для декодирования, что ускоряет поиск. Включите его с помощью DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Улучшена проверка производительности программных видеокодеков. В результате некоторые дополнительные треки могут быть помечены как EXCEEDS_CAPABILITIES.
    • Исправлены ошибки воспроизведения VP9 Widevine на некоторых устройствах (#2408).
  • Текст:
    • Добавлена поддержка дорожек VobSub в файлах MP4 (#2510).
    • Исправлена ошибка, из-за которой воспроизведение останавливалось, если сегмент субтитров сначала не загружался, а затем загружался успешно, после чего следовало несколько пустых сегментов субтитров (#2517).
    • Исправлена ошибка, из-за которой при включении субтитров в форматах SSA и SubRip не показывалась текущая реплика (#2309).
    • Исправлена ошибка, из-за которой воспроизведение зависало при переключении с трансляции с ошибкой в субтитрах на прямую трансляцию с пустой дорожкой субтитров (#2328).
    • Исправлена ошибка, из-за которой субтитры CEA-608 искажались при воспроизведении потоков H.262, содержащих B-кадры (#2372).
    • Добавлена поддержка субтитров SSA с CodecId = S_TEXT/SSA в файлах Matroska. Ранее MatroskaExtractor поддерживал только CodecId = S_TEXT/ASS, который представляет собой "расширенный" (v4+) вариант субтитров SubStation Alpha (но логика синтаксического анализа ExoPlayer одинакова для обоих вариантов) (#2384).
    • Добавлена поддержка свойства layer в файлах субтитров SubStation Alpha (SSA), которое используется для определения порядка наложения реплик, когда на экране одновременно показывается несколько реплик (#2124).
  • Метаданные:
    • Добавлена поддержка получения длительности медиаконтента и Timeline в MetadataRetriever, а также перенос в API AutoCloseable на основе экземпляров. Используйте новый Builder, чтобы создать экземпляр для MediaItem, а затем вызовите retrieveTrackGroups(), retrieveTimeline() и retrieveDurationUs(), чтобы получить ListenableFuture для метаданных. Предыдущие статические методы теперь не поддерживаются (#2462).
  • Изображение:
    • Ограничьте декодированные растровые изображения размером экрана в BitmapFactoryImageDecoder, чтобы избежать сбоя приложения с ошибкой Canvas: trying to draw too large bitmap. из PlayerView при попытке отобразить очень большие изображения (например, 50 Мп).
    • Измените сигнатуру DefaultRenderersFactory.getImageDecoderFactory(), чтобы она принимала параметр Context.
    • Согласуйте максимальный размер выходного растрового изображения, используемый в CompositionPlayer, с размером, который уже используется в Transformer (это означает, что CompositionPlayer не учитывает размер экрана при декодировании растровых изображений, в отличие от ExoPlayer).
  • DRM:
    • Добавлена новая перегрузка OfflineLicenseHelper.newWidevineInstance, принимающая MediaItem.DrmConfiguration, чтобы заголовки HTTP-запросов применялись правильно (#2169).
  • Эффект:
    • Добавьте Presentation.createForShortSide(int), который создает Presentation, чтобы самая короткая сторона всегда соответствовала заданному значению независимо от ориентации входных данных.
  • Мультиплексоры:
    • Исправлена ошибка, из-за которой для аудиосемплов во фрагментированных файлах MP4 не устанавливались правильные флаги.
    • Теперь API writeSampleData() использует класс BufferInfo вместо MediaCodec.BufferInfo.
    • Добавьте Muxer.Factory#supportsWritingNegativeTimestampsInEditList (по умолчанию false).
  • Расширение IMA:
    • Исправлена ошибка, из-за которой ошибка загрузки в одном объявлении могла случайно сделать недействительной другую группу объявлений.
    • Исправлена ошибка, из-за которой группы объявлений после окончания окна видео по запросу останавливали воспроизведение. Группы объявлений, время начала которых выходит за пределы окна, больше не добавляются в очередь MediaPeriodQueue (#2215).
  • Сеанс:
    • Исправлена ошибка, из-за которой игнорировались подключения от сторонних непривилегированных контроллеров Media3.
    • Удалить проверку доступных команд при отправке пользовательских команд в устаревшую версию MediaBrowserServiceCompat. Это соответствует поведению устаревших контроллеров и браузеров при подключении к устаревшему приложению.
    • Исправлена ошибка, из-за которой первая ошибка воспроизведения у проигрывателя неправильно обрабатывалась как постоянное специальное исключение. Это предотвращает восстановление приложения.
    • Исправлена ошибка, из-за которой некоторые изменения контроллера, не обрабатываемые сеансом, могли вызывать IllegalStateExceptions.
    • Исправлена ошибка, из-за которой действия контроллера, не обрабатываемые сеансом, могли привести к недопустимому состоянию контроллера.
    • Исправлено предупреждение о нарушении небезопасного запуска StrictMode (#2330).
    • Исправлена ошибка, из-за которой вызов setSessionExtras из основного потока при запуске проигрывателя из другого потока приложения приводил к IllegalStateException (#2265).
    • Уведомление не показывается автоматически, если в проигрывателе настроены мультимедийные объекты, но они не подготовлены и не воспроизводятся (#2423https://github.com/androidx/media/issues/2423). Это поведение можно настроить с помощью MediaSessionService.setShowNotificationForIdlePlayer.
    • Добавьте настраиваемый PlaybackException для всех или выбранных контроллеров.
    • Исправлена ошибка, из-за которой перемотка трансляции на устройстве MediaController могла привести к ошибке IllegalArgumentException.
    • Для прямых трансляций прекращена публикация позиции воспроизведения и возможность перемотки текущего элемента для контроллеров мультимедиа платформы, чтобы избежать артефактов позиционирования в интерфейсе Android Auto (и других контроллерах, использующих эту информацию из сеанса мультимедиа платформы) (#1758).
    • Исправлена ошибка, из-за которой передача значения null в getLibraryRoot объекта MediaBrowser, подключенного к устаревшему объекту MediaBrowserServiceCompat, приводила к ошибке NullPointerException.
    • Исправлена ошибка, из-за которой при отправке настраиваемых действий, результата поиска или запроса getItem происходил сбой устаревшего приложения для сеансов с кодом ClassNotFoundException.
    • Исправлена ошибка, из-за которой MediaItem.LocalConfiguration.uri передавался в MediaMetadata сеанса платформы. Чтобы намеренно поделиться URI и разрешить контроллерам повторно запрашивать медиаконтент, задайте MediaItem.RequestMetadata.mediaUri.
  • Интерфейс:
    • Исправлена ошибка, из-за которой PlayerSurface внутри повторно используемых компонентов, таких как LazyColumn, работали некорректно (#2493).
    • Исправлена ошибка Compose, из-за которой возникала задержка между установкой начального состояния кнопки и наблюдением за изменением состояния (например, формы значка или включения). Теперь учитываются все изменения, внесенные в проигрыватель вне периода наблюдения (#2313).
    • Добавьте хранилища состояния и composable-функции в модуль media3-ui-compose для SeekBackButtonState и SeekForwardButtonState.
    • Добавлена поддержка режима перемотки ExoPlayer в PlayerControlView. Если этот параметр включен, то при перетаскивании ползунка проигрыватель переходит в режим перемотки, при каждом движении ползунка выполняется вызов player.seekTo, а когда пользователь убирает палец с экрана, режим перемотки отключается. Интеграцию можно включить с помощью атрибута time_bar_scrubbing_enabled = true в XML или метода setTimeBarScrubbingEnabled(boolean) в Java/Kotlin.
    • Сделайте так, чтобы PlayerSurface принимал аргумент Player, допускающий значение NULL.
  • Скачивания:
    • Добавлена поддержка частичного скачивания для прогрессивных потоков. Приложения могут подготовить прогрессивный поток с помощью DownloadHelper и запросить DownloadRequest у помощника, указав временные позиции начала и конца медиафайла, которые должно охватывать скачивание. Возвращенный объект DownloadRequest содержит диапазон байтов, с помощью которого можно создать объект ProgressiveDownloader и скачать контент.
    • Добавьте DownloadHelper.Factory, которым заменяются статические методы DownloadHelper.forMediaItem().
    • Добавьте Factory для реализаций SegmentDownloader.
    • Добавлена поддержка частичного скачивания для адаптивных потоков. Приложения могут подготовить адаптивный поток с помощью DownloadHelper и запросить DownloadRequest у помощника, указав временные позиции начала и конца медиафайла, которые должно охватывать скачивание. Возвращенный объект DownloadRequest содержит разрешенный диапазон дат, с помощью которого можно создать конкретный объект SegmentDownloader и скачать соответствующий контент.
  • Расширение Cronet:
    • Добавлена автоматическая обработка файлов cookie (#5975).
  • Расширение HLS:
    • Исправлена ошибка, из-за которой HlsSampleStreamWrapper пытался выполнить поиск в буфере, когда в нем не было доступных фрагментов #2598.
    • Исправлена ошибка, из-за которой изменения в выборе трека после загрузки фрагментов с низкой задержкой и подсказок по предварительной загрузке могли привести к зависанию воспроизведения (#2299).
    • Предотвращение чрезмерного количества перезагрузок за счет ожидания половины целевой продолжительности, когда сервер не учитывает CAN-BLOCK-RELOAD=YES (#2317).
    • Исправлена ошибка, из-за которой воспроизведение останавливалось при запуске потока межстраничных объявлений перед рекламой в середине видео, а список объектов пытался разрешить не то объявление (#2558).
    • Исправлена обработка плейлистов, чтобы в значениях атрибутов в строках, заключенных в кавычки, принимался символ \f (перевод страницы) (#2420).
    • Добавлена поддержка обновления межстраничных объявлений с одинаковым идентификатором (#2427).
    • Исправлена ошибка, из-за которой ошибки загрузки плейлиста иногда не распространялись, когда в трансляции заканчивались сегменты для загрузки (#2401https://github.com/androidx/media/issues/2401).
    • Группировка субтитров по тегу NAME, аналогично тому, как уже группируются аудиодорожки (#1666).
    • Поддержка X-ASSET-LIST и прямых трансляций с HlsInterstitialsAdsLoader.
  • Расширение DASH:
    • Исправлена ошибка, из-за которой набор для адаптации Trick Play объединялся с основным набором для адаптации, что приводило к созданию недопустимого элемента TrackGroup (#2148).
    • Исправлена ошибка, из-за которой сокращение длительности периода DASH могло вызывать исключение, если образцы за пределами новой длительности уже были прочитаны конвейером рендеринга (#2440).
    • Исправлена ошибка, из-за которой не выполнялась переадресация при использовании параметров запроса CMCD (#2475).
  • Расширение RTSP:
    • Добавлена поддержка пакета агрегации RTP для H265 в соответствии с RFC 7798#4.4.2 (#2413).
    • Исправлена ошибка, из-за которой RtspClient не использовал URI местоположения, указанный при обработке ответа HTTP 302 (#2398).
    • Добавлена поддержка синтаксического анализа для SessionDescriptions, содержащих строки с конечными пробелами (#2357).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Исправлена ошибка, из-за которой DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange не влиял на расширения декодера аудио (#2258).
  • Расширение Cast:
    • Добавлена поддержка setVolume() и getVolume() (#2279).
    • Исправлена ошибка, из-за которой CastPlayer переходил в состояние STATE_BUFFERING, когда временная шкала была пустой.
    • Добавлена поддержка getDeviceVolume(), setDeviceVolume(), getDeviceMuted() и setDeviceMuted() (#2089).
  • Инструменты для тестирования:
    • Добавьте advance(player).untilPositionAtLeast и untilMediaItemIndex в TestPlayerRunHelper, чтобы проигрыватель переходил к указанной позиции. В большинстве случаев эти методы надежнее, чем существующие методы untilPosition и untilStartOfMediaItem.
    • Переместите модуль FakeDownloader в test-utils-robolectric, чтобы использовать его в других тестах.
    • Удалены: transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...) и transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). Для настройки теневых кодировщиков и декодеров используйте ShadowMediaCodecConfig.
    • Префикс exotest заменен на media3 в названиях кодеков, которые сообщает ShadowMediaCodecConfig.
  • Удалите устаревшие символы:
    • Удален устаревший конструктор 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.0

1.6.1

14 апреля 2025 г.

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

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

1.6.0

26 марта 2025 г.

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

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

1.6.0-rc02

19 марта 2025 г.

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

1.6.0-rc01

12 марта 2025 г.

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

1.6.0-beta01

26 февраля 2025 г.

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

Версия 1.6.0-alpha03

6 февраля 2025 г.

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

Версия 1.6.0-alpha02

30 января 2025 г.

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

Версия 1.6.0-alpha01

20 декабря 2024 г.

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

Версия 1.5

Версия 1.5.1

19 декабря 2024 г.

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

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

Версия 1.5.0

27 ноября 2024 г.

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

  • Общая библиотека:
    • Добавлен класс ForwardingSimpleBasePlayer, который позволяет перенаправлять воспроизведение на другой проигрыватель с небольшими корректировками, обеспечивая при этом полную согласованность и обработку слушателей (#1183).
    • Замените метод SimpleBasePlayer.State.playlist на getPlaylist().
    • Добавьте переопределение для SimpleBasePlayer.State.Builder.setPlaylist(), чтобы напрямую указать Timeline и текущие Tracks и Metadata вместо создания структуры плейлиста.
    • Увеличьте minSdk до 21 (Android Lollipop). Это соответствует всем другим библиотекам AndroidX.
    • Добавьте артефакт androidx.media3:media3-common-ktx, который предоставляет функции Kotlin, созданные на основе общей библиотеки.
    • Добавьте в библиотеку media3-common-ktx функцию приостановки расширения Player.listen, чтобы запустить сопрограмму для прослушивания Player.Events.
    • Удалите аннотации @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[]) объявлен устаревшим и помечен как final, чтобы предотвратить переопределения. Вместо него следует использовать новый тип DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Регистрировать события MediaSourceEventListener из дополнительных источников в MergingMediaSource. В результате для субтитров, загруженных из неизвестного источника (добавленных с помощью MediaItem.LocalConfiguration.subtitleConfigurations), будут регистрироваться события начала, ошибки, отмены и завершения загрузки. Они могут выглядеть как дублирующиеся события загрузки, отправленные из AnalyticsListener.
    • Предотвратите остановку воспроизведения из-за ошибок в субтитрах и метаданных. Вместо этого проблемный трек отключается, а воспроизведение остальных продолжается (#1722).
      • При новой обработке субтитров (во время извлечения) связанные ошибки синтаксического анализа (например, недопустимые данные субтитров) и загрузки (например, HTTP 404) передаются через обратные вызовы onLoadError.
      • При устаревшей обработке субтитров (во время рендеринга) через обратные вызовы onLoadError передаются только связанные ошибки загрузки, а ошибки синтаксического анализа игнорируются (это поведение по умолчанию).
    • Исправлена ошибка, из-за которой элементы плейлиста или периоды в многопериодных потоках DASH с длительностью, не соответствующей фактическому контенту, могли вызывать зависание кадров в конце элемента (#1698).
    • Добавлен сеттер для 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).
    • Исправлена обработка образцов рекламы в начале ролика для начальных позиций медиаконтента, не являющихся ключевыми кадрами, при обработке списков редактирования в файлах MP4 (#1659).
    • Улучшен расчет частоты кадров за счет использования продолжительности медиаконтента из поля mdhd в Mp4Extractor и FragmentedMp4Extractor (#1531).
    • Исправлена ошибка, из-за которой в списках редактирования MP4 неправильно масштабировался параметр media_time. Если segment_duration уже правильно масштабировался с использованием временной шкалы фильма, то media_time теперь правильно масштабируется с использованием временной шкалы дорожки, как указано в стандарте формата MP4 (#1792).
    • Обработка кадров, расположенных не по порядку, при вычислении endIndices для MP4 со списком изменений (#1797).
    • Исправлена обработка продолжительности медиаконтента в поле mdhd файлов MP4, чтобы обрабатывать значения -1 (#1819).
    • Добавлена поддержка идентификации поля h263 в файлах MP4 для видео H.263 (#1821).
    • Добавлена поддержка формата файла ISO base media AC-4 Level-4 (#1265).
  • DataSource:
    • Обновлен HttpEngineDataSource, чтобы разрешить использование начиная с версии S, расширение 7, вместо уровня API 34 (#1262).
    • DataSourceContractTest: убедитесь, что DataSource.getUri() возвращает разрешенный URI (как описано в документации). Если он отличается от запрошенного URI, тесты могут указать на это с помощью нового метода DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: убедитесь, что DataSource.getUri() и getResponseHeaders() возвращают значение open после неудачного вызова open() (из-за того, что ресурс не найден) и до последующего вызова close().
      • Переопределение DataSourceContractTest.getNotFoundResources() позволяет подклассам тестов предоставлять несколько ресурсов, которые не были найдены, а также любые ожидаемые заголовки. Это позволяет различать ошибку HTTP 404 (с заголовками) и ошибку "Сервер не найден" (без заголовков).
  • Аудио:
    • Автоматически настраивать метаданные громкости CTA-2075 в кодеке, если они есть в медиафайле.
    • Обеспечьте плавное уменьшение громкости при перемотке.
    • Исправлена проблема, из-за которой при перемотке могли возникать щелчки.
    • Исправлено накопление ошибок усечения для алгоритма изменения скорости и высоты звука Sonic.
    • Исправлена ошибка в SpeedChangingAudioProcessor, из-за которой пропускались выходные кадры.
  • Видео:
    • MediaCodecVideoRenderer не декодирует фрагменты, которые не воспроизводятся и не используются в качестве опорных для других фрагментов.
    • В API 35 и более поздних версиях MediaCodecAdapter теперь может получать null Surface в configure и вызовы нового метода detachOutputSurface, чтобы удалить ранее заданный Surface, если кодек поддерживает это (MediaCodecInfo.detachedSurfaceSupported).
    • При обработке onOutputFormatChanged используются значения соотношения сторон пикселя, указанные в MediaCodecAdapter (#1371).
    • Добавлено временное решение проблемы с устройством Galaxy Tab S7 FE, из-за которой защищенные потоки H264 с частотой 60 кадров/с помечались как неподдерживаемые (#1619).
    • Добавлено временное решение для кодеков, которые зависают после последнего фрагмента, не возвращая сигнал о конце потока.
  • Текст:
    • Добавлен настраиваемый VoiceSpan и заполнен для диапазонов голоса WebVTT (#1632).
    • Обеспечен показ субтитров WebVTT в HLS с очень большими временными метками, которые превышают 64-битное значение long, если они представлены в микросекундах и умножены на временную базу MPEG 90,000 (#1763).
    • Добавлена поддержка субтитров CEA-608 в контенте Dolby Vision (#1820).
    • Исправлена ошибка, из-за которой зависало воспроизведение многопериодных потоков DASH, если были включены субтитры CEA-608 (#1863).
  • Метаданные:
    • Назначьте тип C.TRACK_TYPE_METADATA дорожкам, содержащим контент icy или vnd.dvb.ait.
  • Изображение:
    • Добавьте ExternallyLoadedImageDecoder для упрощенной интеграции с внешними библиотеками загрузки изображений, такими как Glide или Coil.
  • DataSource:
    • Добавлен класс FileDescriptorDataSource – новый DataSource, который можно использовать для чтения из FileDescriptor (#3757).
  • Эффект:
    • Добавлен обходной путь DefaultVideoFrameProcessor для незначительного масштабирования SurfaceTexture. SurfaceTexture может включать небольшое масштабирование, которое отсекает границу в 1 тексель по краю обрезанного буфера. Теперь это обрабатывается так, чтобы результат был ближе к ожидаемому.
    • Увеличить скорость воспроизведения на DefaultVideoFrameProcessor.queueInputBitmap(). В результате экспорт видео из картинки с помощью Transformer происходит быстрее.
  • Расширение IMA:
    • Исправлена ошибка, из-за которой очистка плейлиста могла привести к ArrayIndexOutOfBoundsException в ImaServerSideAdInsertionMediaSource.
    • Исправлена ошибка, из-за которой при воспроизведении потоков с динамической вставкой объявлений на стороне сервера без видеорекламы в начале ролика после последней видеорекламы в середине ролика могло возникать исключение ArrayIndexOutOfBoundsException (#1741).
  • Сеанс:
    • Добавьте MediaButtonReceiver.shouldStartForegroundService(Intent), чтобы приложения могли подавлять команду воспроизведения, поступающую для возобновления воспроизведения, переопределяя этот метод. По умолчанию служба всегда запущена, и воспроизведение нельзя подавить, не вызвав сбой службы с ошибкой ForegroundServiceDidNotStartInTimeException (#1528).
    • Исправлена ошибка, из-за которой специальные команды, отправленные из MediaBrowser, передавались в вариант метода MediaSessionCompat.Callback вместо MediaBrowserServiceCompat при подключении к устаревшему сервису. Из-за этого MediaBrowser не получал фактическое возвращаемое значение, отправленное устаревшим сервисом (#1474).
    • Обработка ошибки IllegalArgumentException, которая возникает на устройствах некоторых производителей при настройке широковещательного приемника для намерений кнопок мультимедиа (#1730).
    • Добавьте кнопки команд для мультимедийных объектов. Это добавляет Media3 API для того, что было известно как Custom browse actions с устаревшей библиотекой с MediaBrowserCompat. Обратите внимание, что в Media3 командные кнопки для мультимедийных объектов доступны как для MediaBrowser, так и для MediaController. Подробнее о том, как реализовать собственные действия для просмотра… * Исправлена ошибка, из-за которой контроллер Media3 иногда не позволял приложению сеанса запустить активную службу после запроса play().
    • Ограничьте CommandButton.Builder.setIconUri, чтобы принимались только URI контента.
    • Передавайте подсказки о подключении браузера Media3 в начальный MediaBrowserCompat при подключении к устаревшему MediaBrowserCompat. Сервис может получать подсказки о подключении, переданные в качестве корневых подсказок при первом вызове onGetRoot().
    • Исправлена ошибка, из-за которой MediaBrowser, подключенный к устаревшему сервису браузера, не получал ошибку, отправленную сервисом после того, как браузер подписался на parentid.
    • Улучшена совместимость, чтобы браузер Media3, подключенный к устаревшему MediaBrowserService, не запрашивал дочерние элементы parentId дважды при подписке на родительский элемент.
  • Интерфейс:
    • Сделайте растянутое/обрезанное видео в обходном решении PlayerView-in-Compose-AndroidView необязательным из-за проблем с общими переходами на основе XML. Приложения, использующие PlayerView внутри AndroidView, должны вызывать PlayerView.setEnableComposeSurfaceSyncWorkaround, чтобы включить эту функцию (#1237, #1594).
    • Добавьте setFullscreenButtonState в PlayerView, чтобы разрешить обновление значка кнопки полноэкранного режима по запросу, то есть вне диапазона и не в ответ на клик (#1590, #184).
    • Исправлена ошибка, из-за которой вариант "Нет" в выборе текста не работал, если в приложении были заданы настройки выбора текстовых дорожек.
  • Расширение DASH:
    • Добавлена поддержка периодов, начинающихся в середине сегмента (#1440).
  • Расширение Smooth Streaming:
    • Исправлена ошибка Bad magic number for Bundle, возникавшая при воспроизведении потоков SmoothStreaming с текстовыми дорожками (#1779).
  • Расширение RTSP:
    • Исправлена ошибка, из-за которой не удалялась информация о пользователе из URL, содержащих закодированные символы @ (#1138).
    • Исправлен сбой при обработке RTP-пакетов с расширениями заголовков (#1225).
  • Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
    • Добавлен модуль декодера IAMF, который обеспечивает поддержку воспроизведения файлов MP4, содержащих треки IAMF, с использованием нативной библиотеки libiamf для синтеза аудио.
      • Воспроизведение возможно в стереоформате, а также в формате 5.1 с пространственным звучанием и отслеживанием движений головы (необязательно). Бинауральное воспроизведение пока не поддерживается.
    • Добавлена поддержка страниц размером 16 КБ для расширений декодера на Android 15 (#1685).
  • Расширение Cast:
    • Останавливать очистку временной шкалы после отключения CastSession, чтобы приложение-отправитель могло возобновить воспроизведение на устройстве после отключения.
    • Заполнять DeviceInfo CastPlayer, когда предоставляется Context. Это позволяет связать MediaSession с RoutingSession, что необходимо для интеграции переключателя вывода (#1056).
  • Инструменты для тестирования:
    • DataSourceContractTest теперь включает тесты для проверки:
      • Входной поток read position обновлен.
      • Буфер вывода offset применен правильно.
  • Демонстрационное приложение
    • Устранены утечки памяти в демонстрационном приложении для коротких видео (#1839).
  • Удалите устаревшие символы:
    • Удалите устаревшие элементы Player.hasPrevious, Player.hasPreviousWindow(). Используйте вместо него Player.hasPreviousMediaItem().
    • Удалите устаревший метод Player.previous(). Используйте вместо него Player.seekToPreviousMediaItem().
    • Удалите устаревший метод DrmSessionEventListener.onDrmSessionAcquired.
    • Удалите устаревшие конструкторы DefaultEncoderFactory. Используйте вместо него DefaultEncoderFactory.Builder.

Версия 1.5.0-rc02

19 ноября 2024 г.

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

Версия 1.5.0-rc01

13 ноября 2024 г.

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

Версия 1.5.0-beta01

30 октября 2024 г.

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

Версия 1.5.0-alpha01

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

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

Версия 1.4.0

Версия 1.4.1

27 августа 2024 г.

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

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

Версия 1.4.0

25 июля 2024 г.

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

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

Версия 1.4.0-rc01

10 июля 2024 г.

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

Версия 1.4.0-beta01

26 июня 2024 г.

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

Версия 1.4.0-alpha02

7 июня 2024 г.

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

Версия 1.4.0-alpha01

17 апреля 2024 г.

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

Версия 1.3.0

Версия 1.3.1

11 апреля 2024 г.

Выпущены данные "androidx.media3:media3-*:1.3.1". Версия 1.3.1 содержит эти фиксации.

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

Версия 1.3.0

6 марта 2024 г.

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

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

Версия 1.3.0-rc01

22 февраля 2024 г.

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

Версия 1.3.0-beta01

7 февраля 2024 г.

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

Версия 1.3.0-alpha01

15 января 2024 г.

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

Версия 1.2.0

Версия 1.2.1

9 января 2024 г.

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

Версия 1.2.0

15 ноября 2023 г.

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

Версия 1.2.0-rc01

1 ноября 2023 г.

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

Версия 1.2.0-beta01

19 октября 2023 г.

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

Версия 1.2.0-alpha02

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

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

Версия 1.2.0-alpha01

17 августа 2023 г.

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

Версия 1.1.0

Версия 1.1.1

16 августа 2023 г.

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

Версия 1.1.0

5 июля 2023 г.

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

Версия 1.1.0-rc01

21 июня 2023 г.

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

Версия 1.1.0-beta01

7 июня 2023 г.

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

Версия 1.1.0-alpha01

10 мая 2023 г.

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

Версия 1.0.0

Версия 1.0.2

18 мая 2023 г.

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

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

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

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

Версия 1.0.1

18 апреля 2023 г.

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

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

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

Версия 1.0.0

22 марта 2023 г.

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

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

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

Версия 1.0.0-rc02

2 марта 2023 г.

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

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

  • Основная библиотека:
    • Исправлено определение типа сети в API 33 (#10970).
    • Исправлена ошибка NullPointerException при вызове ExoPlayer.isTunnelingEnabled (#10977).
  • Скачивания:
    • Добавлена возможность настраивать максимальную разницу во времени начала двух сегментов, которые нужно объединить, в SegmentDownloader и подклассах (#248).
  • Аудио:
    • Исправлена ошибка, из-за которой на устройствах Samsung не работало непрерывное воспроизведение MP3-файлов (#8594).
    • Исправлена ошибка, из-за которой скорость воспроизведения, заданная сразу после отключения звука, могла быть заменена предыдущим значением (#10882).
  • Видео:
    • Сопоставьте формат HEVC HDR10 с HEVCProfileMain10HDR10 вместо HEVCProfileMain10.
    • Добавлено временное решение проблемы, из-за которой на Chromecast с Google TV и Lenovo M10 FHD Plus потоки AVC с частотой 60 кадров/с помечались как неподдерживаемые (#10898).
    • Исправлены проблемы производительности при воспроизведении медиаконтента с частотой кадров, которая намного выше частоты обновления экрана.
  • Актеры:
    • Исправлена временная ошибка STATE_IDLE при переходе между мультимедийными объектами (#245).
  • RTSP:
    • Добавлена обработка исключения IllegalArgumentException, которое возникает при синтаксическом анализе недопустимых сообщений RTSP Describe (#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, если в таблице выборки (stbl) отсутствует обязательное описание выборки (stsd), выдавать ParserException вместо NullPointerException.
    • Исправлена ошибка, из-за которой при переходе непосредственно к кадру синхронизации в fMP4 не пропускались семплы (#10941).
  • Аудио:
    • Используйте битрейт сжатого аудиоформата, чтобы рассчитать минимальный размер буфера для AudioTrack при прямом воспроизведении (сквозной передаче).
  • Текст:
    • Исправлена ошибка, из-за которой TextRenderer передавал недопустимый (отрицательный) индекс в Subtitle.getEventTime, если файл субтитров не содержал подсказок.
    • SubRip: добавлена поддержка файлов UTF-16, если они начинаются с маркера последовательности байтов.
  • Метаданные:
    • Выполнить синтаксический анализ нескольких значений, разделенных нулями, из фреймов ID3, как разрешено в ID3 v2.4.
    • Добавьте MediaMetadata.mediaType, чтобы указать тип контента или папки, описанных в метаданных.
    • Добавьте MediaMetadata.isBrowsable вместо MediaMetadata.folderType. Поддержка типа папки будет прекращена в следующем выпуске.
  • DASH:
    • Добавлен полный синтаксический анализ для наборов адаптации изображений, включая количество фрагментов (#3752).
  • Интерфейс:
    • Исправлена устаревшая функция PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener), чтобы изменения видимости передавались зарегистрированному прослушивателю (#229).
    • Исправлен порядок элементов управления в центре проигрывателя в PlayerView при использовании макета с направлением текста справа налево (#227).
  • Сеанс:
    • Добавлен абстрактный класс SimpleBasePlayer, который помогает реализовать интерфейс Player для пользовательских проигрывателей.
    • Добавлен вспомогательный метод для преобразования токена сеанса платформы в Media3 SessionToken (#171).
    • Используйте onMediaMetadataChanged, чтобы запускать обновления медиасеанса платформы (#219).
    • Добавьте сеанс воспроизведения медиаконтента в качестве аргумента getMediaButtons() в DefaultMediaNotificationProvider и используйте неизменяемые списки во избежание неясности (#216).
    • Добавьте прослушиватель обратного вызова onSetMediaItems, чтобы изменять и задавать список MediaItem, начальный индекс и позицию по сеансу перед настройкой проигрывателя (#156).
    • Исправлена ошибка, из-за которой двойное нажатие распознавалось для событий, не связанных с кнопками мультимедиа Bluetooth (#233).
    • Повышена надежность QueueTimeline в случае сомнительного состояния устаревшего сеанса (#241).
  • Метаданные:
    • Выполнить синтаксический анализ нескольких значений, разделенных нулями, из фреймов ID3, как разрешено в ID3 v2.4.
    • Добавьте MediaMetadata.mediaType, чтобы указать тип контента или папки, описанных в метаданных.
    • Добавьте MediaMetadata.isBrowsable вместо MediaMetadata.folderType. Поддержка типа папки будет прекращена в следующем выпуске.
  • Расширение Cast:
    • Версия Cast SDK обновлена до 21.2.0.
  • Расширение IMA:
    • Удалите прослушиватель проигрывателя ImaServerSideAdInsertionMediaSource в потоке приложения, чтобы избежать проблем с потоками.
    • Добавьте свойство focusSkipButtonWhenAvailable в ImaServerSideAdInsertionMediaSource.AdsLoader.Builder, чтобы запрашивать фокусировку на кнопке пропуска на телевизорах, и по умолчанию задайте для него значение true.
    • Добавьте метод focusSkipButton() в ImaServerSideAdInsertionMediaSource.AdsLoader, чтобы программно запрашивать фокус на кнопке пропуска.
    • Версия IMA SDK обновлена до 3.29.0.
  • Демонстрационное приложение:
    • Добавлен запрос разрешения на уведомления о скачивании во время выполнения (#10884).

Версия 1.0.0-beta03

22 ноября 2022 г.

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

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

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

Версия 1.0.0-beta02

21 июля 2022 г.

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

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

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

Версия 1.0.0-beta01

16 июня 2022 г.

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

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

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

Версия 1.0.0-alpha03

14 марта 2022 г.

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

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

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

Версия 1.0.0-alpha02

2 марта 2022 г.

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

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

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

Версия 1.0.0-alpha01

27 октября 2021 г.

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

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

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

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

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

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