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.
- Переместите флажок, чтобы включить или отключить метаданные HAGC для прогрессивных медиафайлов с
- Экстракторы:
- Matroska: исправлена ошибка, из-за которой дорожки, размещенные после кластеров, не позволяли перемещаться по временной шкале (#3377).
- Аудио:
- Исправлен расчет размера буфера в
SilenceSkippingAudioProcessor, чтобы минимальная продолжительность тишины не уменьшалась некорректно из-за размера кадра (#3271). - Исправлена обработка 8-битного PCM в
PcmAudioUtil, чтобы семплы обрабатывались как беззнаковые, как определено в Android (#3271). - Исправлена проблема с разгрузкой, из-за которой воспроизведение могло останавливаться во время видеорекламы в начале ролика или переходов без пауз из-за ограниченного размера аппаратного буфера.
- Исправлена ошибка в
DefaultAudioSink, из-за которой количество выпусков не уменьшалось, когда поток воспроизведения переставал работать (#3338).
- Исправлен расчет размера буфера в
- Сеанс:
- Исправлена ошибка
NullPointerException, возникавшая, когда выполняющийся процессMediaControllerосвобождался из обратного вызоваPlayer.Listener(#3375). - Исправлена взаимная блокировка в основном потоке, когда устаревший класс
MediaBrowserподключается к сервису, возвращающему асинхронный результат изonGetLibraryRoot()илиonConnectAsync()(#3393).
- Исправлена ошибка
- Расширение HLS:
- Расширение DASH:
- Исправлен неверный расчет временной метки для дорожек изображений с помощью
presentationTimeOffset(#3334).
- Исправлен неверный расчет временной метки для дорожек изображений с помощью
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Opus: исправлена ошибка, из-за которой при одновременной инициализации нескольких экземпляров
OpusDecoderповреждались данные в памяти. - MPEG-H: исправлена утечка памяти, усечение символов, не входящих в набор ASCII, и потенциальный сбой на уровне ОС в условиях нехватки памяти при отправке команд в
MpeghUiManager(#3365).
- Opus: исправлена ошибка, из-за которой при одновременной инициализации нескольких экземпляров
Версия 1.11.0
5 августа 2026 г.
- Общая библиотека:
- Добавьте
Format.channelMask, чтобы явно представить маску аудиоканала, и новую перегрузкуUtil.getAudioTrackChannelConfig(Format), чтобы безопасно ее разрешить. - Обновите Kotlin с версии 2.0.20 до 2.2.0.
- Добавьте
- ExoPlayer:
- Исправлена ошибка параллелизма, зависящая от времени, которая могла вызывать
IllegalStateExceptionилиIndexOutOfBoundsExceptionв ExoPlayer. - Ослаблены проверки количества групп объявлений в
AdsMediaSource, чтобы разрешить уменьшение количества групп объявлений, когда группа объявлений полностью обработана (hasUnplayedAds()–false), что позволяет динамически изменять размер группы объявлений во время рабочих процессов сброса. - Добавьте
getFlags()иFLAG_STRICT_DURATIONвSampleStream, чтобы разрешить потокам сообщать о флагах, и обновите средства визуализации, чтобы динамически проверять эти флаги. - Используйте оценку частоты кадров в
MediaCodecVideoRendererи формат вывода кодека вMediaCodecAudioRenderer, чтобы рассчитать рабочую частоту кодека, если форматы потока не предоставляют допустимое значение, и избежать ненужных сбросов кодека. - Удалите обрезку контента для клиентских объявлений, вставленных в основной проигрыватель. Вместо этого
AdsMediaSourceсамостоятельно определяет, как обрезать изображение. Специальные источники объявлений, вставляемых на стороне клиента, необходимо обновить, чтобы реализовать обрезку контента на стороне клиента. - Дорожки с правильно сформированным, но нераспознанным профилем или уровнем кодека помечаются как
supported=NO_EXCEEDS_CAPABILITIES, а неsupported=YES(так помечаются дорожки с отсутствующей или неправильно сформированной информацией о профиле или уровне). Это гарантирует, что такие дорожки (которые вряд ли поддерживаются устройством) не будут выбраны, если есть более подходящие альтернативы. - Добавьте
DefaultPreloadManager.SimpleRankingDataComparator, который являетсяRankingDataComparator, сравнивающим ранги мультимедийных объектов на основе их расстояния до индекса текущего воспроизводимого мультимедийного объекта. Приложения могут переопределять методcompare(Integer, Integer), если требуется более точная логика сравнения. СпециальныйSimpleRankingDataComparatorможно внедрить с помощью нового конструктораDefaultPreloadManager.Builder. - Снизить риск нехватки памяти для
DefaultLoadControl.prioritizeTimeOverSizeThresholds, вернувшись к ограничениям на размер байтов буфера, если доступная память кучи кажется ограниченной. - Выровнена обработка неподвижных изображений, когда не задано значение
MediaItem.imageDurationUs. Теперь неподвижные изображения JPEG и HEIC "воспроизводятся" с очень короткой продолжительностью по умолчанию (так же, как ранее PNG и другие изображения). - Добавьте
MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter), чтобы выровнятьBandwidthMeterпоMediaSource. Однако по умолчанию по-прежнему будет вызываться устаревший метод с пользовательской реализацией. Рекомендуется реализовать новый метод и использоватьBandwidthMeter.getTransferListener(), чтобы получить паритет со старым методом. - В
DefaultBandwidthMeterдобавьте поддержку пользовательскогоInitialBitrateSupplier. Это позволяет приложениям использовать собственную логику для определения начальной оценки битрейта, которая будет использоваться при созданииDefaultBandwidthMeterи при изменении типа сети. Поставщика можно указать с помощью свойстваDefaultBandwidthMeter.Builder.setInitialBitrateSupplier(). - Включить динамическое планирование по умолчанию. Цикл воспроизведения
ExoPlayerбудет выполняться динамически, а не через статический интервал. - Удален ненужный сброс, который мог происходить при присоединении треков с предварительными семплами к активному воспроизведению.
- В
DefaultBandwidthMeterоптимизируйтеgetInitialBitrateCountryGroupAssignment, чтобы возвращать назначения групп стран, упакованные в 32-битное целое число, а не в массив. Это позволит уменьшить размер кода и избежать выделения памяти. - Исправлены ошибки инициализации
AudioTrackна некоторых устройствах. Теперь при повторных попытках всегда используется буфер размером не менее 1 секунды, если другие попытки (с уменьшением размера буфера вдвое) не увенчались успехом (#3207). - Исправлена проблема с кодеком на некоторых устройствах, из-за которой кодек поглощал все образцы, если ранее был очищен до получения входных буферов.
- Добавлен экспериментальный параметр
ExoPlayer.Builder.enablePerStreamMediaProgression(), позволяющий улучшить обработку медиаконтента для каждого потока. Это сокращает задержку при запуске между элементами плейлиста и предотвращает зависание воспроизведения при очень коротком контенте (#3122). - Исправлено состояние гонки, связанное с использованием идентификатора аудиосеанса, когда вместо значения, заданного
setAudioSessionId, использовался исходный идентификатор аудиосеанса, автоматически сгенерированныйExoPlayer(#3241). - Добавлена экспериментальная поддержка воспроизведения временных метаданных HAGC (ST 2094-50) для прогрессивных медиафайлов (например, MP4, Matroska). Проигрыватель автоматически объединяет дорожки метаданных HAGC со связанной видеодорожкой и передает метаданные декодеру вне полосы на устройствах с API 37 и более поздних версий. Это поведение можно отключить с помощью
DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false). - Добавлен параметр
Format.selectionPriority, который представляет относительное предпочтениеFormatпри выборе трека (#3236). - Исправлена потенциальная проблема, из-за которой перемотка могла зависать при переходе к концу потока.
- Исправлена ошибка параллелизма, зависящая от времени, которая могла вызывать
- CompositionPlayer:
- Исправлена ошибка, из-за которой экземпляры
TrackSelectorне освобождались.
- Исправлена ошибка, из-за которой экземпляры
- Трансформатор:
- Исправлена ошибка, из-за которой в отчетах могли завышаться данные по показателю
ExportResult.fileSizeBytes.
- Исправлена ошибка, из-за которой в отчетах могли завышаться данные по показателю
- Выбор дорожки:
- Добавьте
BaseTrackSelection.DEFAULT_FORMAT_COMPARATORиAdaptiveTrackSelection.Factory.setTrackFormatComparator, чтобы разрешить сортировку по формату и приоритет выбора ABR, а не только сортировку по битрейту. - Исправлена проблема с параллелизмом, зависящая от времени, из-за которой быстрые последовательные обновления параметров выбора трека могли привести к потере или перезаписи некоторых обновлений.
- Добавьте
- Экстракторы:
- MP4, MP3 и FLAC: добавлено свойство
FLAG_DISABLE_ARTWORK_METADATA, позволяющее удалять прикрепленные изображения и метаданные обложек при синтаксическом анализе контейнера, чтобы снизить потребление памяти во время выполнения (#2077). Эту функцию также можно включить централизованно черезDefaultExtractorsFactory.setDisableArtworkMetadata. - MP4: добавлена поддержка извлечения дорожек временных метаданных ITU-T T.35 (
it35). - MP4: добавлена поддержка извлечения метаданных разделов (в форматах Nero и QuickTime). Если в видео есть оба типа эпизодов, предпочтение отдается эпизодам QuickTime. Извлеченная информация о главах представлена в виде записей
ChapterвMetadataтрека, что позволяет осуществлять навигацию по главам в файлах MP4, M4A и M4B (например, в аудиокнигах и подкастах) (#2803). - WAV, Matroska и MP4: добавлена поддержка 64-битного PCM-аудио с плавающей запятой (#3090).
- Matroska: используйте метаданные битового потока кодека, чтобы точно заполнить
ColorInfo. - MP4: добавлена поддержка поиска во фрагментированных файлах MP4 с помощью поля
mfra, когда полеsidxотсутствует. Чтобы включить эту функцию, передайтеFLAG_READ_MFRA_FOR_SEEK_MAPвFragmentedMp4Extractor. Теперь это делается по умолчанию вDefaultExtractorsFactory(#3088). - Игнорировать данные
av1Cс неподдерживаемой версией. - MP4: добавлена поддержка PCM с плавающей запятой и прямым порядком байтов в блоках
fpcm. - Matroska: анализ информации о разделах для записей
ChapterвMetadataтрека. - MPEG-TS: улучшено извлечение потоков DTS-HD и DTS Express за счет объединения основного и дополнительного подпотоков в один образец. Это устраняет проблемы с воспроизведением, которые возникали, когда они выводились как отдельные образцы (#3147).
- MP4: предотвращение бесконечных циклов и чтения за пределами допустимого диапазона при обработке пустых элементов тега метаданных
ilst(#3191). - MPEG-TS: обеспечена отрисовка последнего кадра для потоков, в которых последний пакет PES имеет известную длину (#3206).
- MP3: исправлена ошибка, из-за которой в отчетах неправильно указывался битрейт файлов с заголовками Xing и VBRI.
- Matroska: обрабатываются дорожки, определенные в последнем кластере (#3250).
- Matroska: добавлена поддержка ALAC (#3268).
- MP4: разрешены блоки
sgpdпеременной длины во фрагментированных файлах MP4 (#3243). - AVI: устранена проблема, из-за которой при воспроизведении файлов без флагов ключевых кадров на аудиодорожках пропадал звук и возникала ошибка
OutOfMemoryError. - MP3: использование длительности без пауз из заголовков Xing/Info (#3183).
- MP3: скорректируйте задержку кодировщика LAME/Xing и метаданные заполнения, чтобы они соответствовали декодированной обрезке PCM (#3200).
- MP4, MP3 и FLAC: добавлено свойство
- Аудио:
- Добавлен 100-миллисекундный льготный период в аудиорендерерах ExoPlayer при переходе из состояния готовности в состояние неготовности, чтобы устранить временные недогрузки и избежать неожиданных состояний буферизации во время активного воспроизведения (#3210).
- Изменена логика размера буфера PCM по умолчанию в
DefaultAudioTrackBufferSizeProvider. Теперь используется фиксированный буфер 500 мс, чтобы уменьшить зависимость от устройства. - Обновите
MediaCodecAudioRenderer, чтобы извлечь пространственную маску channelMask из декодера платформы. Это позволитDefaultAudioSinkиспользовать явную маску вместо того, чтобы выводить ее из количества каналов. - Преобразуй параметры
AudioSink.configureв класс данных. Специальные переопределенияForwardingAudioSink.configureнеобходимо перенести в новую сигнатуру метода. - Добавлена поддержка сохранения высоты тона при растягивании аудиопотока по времени с помощью
EditedMediaItem.Builder#setSpeed(SpeedParameters). - Улучшен класс
ToFloatPcmAudioProcessor, чтобы поддерживать преобразование 8-битного PCM, 16-битного PCM с прямым порядком байтов и 64-битного PCM с плавающей запятой в 32-битный PCM с плавающей запятой (#3090). - Измените возвращаемое значение
DecoderAudioRenderer.getChannelMappingнаImmutableIntArray. - Исправлена ошибка, из-за которой воспроизведение плейлиста с аудио без пауз зависало в режиме сжатой разгрузки.
- Перенаправьте
Timelineи UID периода вAudioSink.configureиAudioProcessor.StreamMetadata, чтобы предоставить контекст плейлиста аудиопроцессорам (#418). - Установите правильное значение
AudioProcessor.StreamMetadata.positionOffsetUs, чтобы разрешить обработку аудио на основе времени (#418). - Добавлена поддержка 32- и 64-битных PCM с плавающей запятой и прямым порядком байтов.
- Удален резервный путь EAC3-JOC к EAC3 для воспроизведения на устройствах Google Pixel, поскольку их стандартные декодеры EAC3 не могут декодировать потоки EAC3-JOC (#3257).
- Видео:
- Исправлена логика объединения видео, чтобы буферы, сброшенные во время объединения, считались пропущенными, а не сброшенными.
- Исправлена ошибка, из-за которой при настройке новой поверхности принималось решение о немедленном рендеринге, что приводило к пропуску кадров на устройствах, не поддерживающих плейсхолдеры.
- Исправлена оценка частоты кадров в
MediaCodecVideoRenderer. Теперь она точнее, поскольку учитывает пропущенные кадры. - Разрешить настройку порогового значения, используемого для планирования кадров. По умолчанию установлено значение 50 мс, но его можно изменить с помощью
MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold(). - Исправлена ошибка в
VideoFrameReleaseHelper, из-за которой изменения в отображении могли вызывать избыточные обратные вызовыChoreographerи чрезмерные пробуждения ЦП в основном потоке.
- Текст:
- Метаданные:
- Добавьте поле
MediaMetadata.discSubtitleи проанализируйте его из данных ID3v2.4TSSTи VorbisDISCSUBTITLE. - Извлечь номер и количество дисков из фрейма ID3
TPOS.
- Добавьте поле
- Эффект:
- Очистка состояния перерисовки в
FinalShaderProgramWrapperпри сбросе, чтобы предотвратить зависание проигрывателя при поиске.
- Очистка состояния перерисовки в
- Мультиплексоры:
- Добавлена поддержка ссылок на треки (поле
tref) вMp4Muxerс помощью нового APIaddTrackReference. Это позволяет устанавливать связи между дорожками, например связывать дорожку метаданных с дорожкой видео, которую она описывает. - Добавьте
OggMuxer, чтобы разрешить мультиплексирование медиапотоковOPUSилиVORBISв формат файлаogg. - Добавьте
WavMuxerдля создания файла WAV (поддерживает PCM с целыми числами и числами с плавающей запятой). - Добавьте
setAttemptStreamableOutputEnabledвInAppMp4Muxer.Factory, чтобы разрешить запись небольших файлов, не предназначенных для потоковой передачи, без резервирования места. - Добавлена поддержка аудио IAMF в
Mp4MuxerиFragmentedMp4Muxer.
- Добавлена поддержка ссылок на треки (поле
- Расширение IMA:
- Добавьте
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot, чтобы предоставить рекламное место для объявлений во время паузы. - Исправлена ошибка, из-за которой при показе двух объявлений VAST с возможностью пропуска подряд кнопка пропуска появлялась сразу же после начала второго объявления (#3165).
- Добавьте
- Сеанс:
- Исправлены потенциальные взаимоблокировки и сбои
IllegalStateExceptionвMediaNotificationManagerпри использовании сеанса с фоновым потоком цикла проигрывателя. - Принудительно применять более строгие требования к потокам для методов
MediaSession. Методы void теперь автоматически отправляют выполнение в поток цикла приложения, а методы доступа к состоянию (геттеры) явно вызываютIllegalStateException, если они вызываются из потока, отличного от цикла приложения. - Исправлен сбой при объединении временных шкал за пределами допустимого диапазона (
IllegalStateExceptionвMediaUtils.mergePlayerInfo) за счет отслеживания согласованности состояния для каждого контроллера на стороне сеанса. - Добавьте
androidx.media3.session.MediaSessionManager, чтобы обеспечить поддержку запросов активных медиасеансов и возврата экземпляров Media3SessionToken. - Измените режим работы по умолчанию для
MediaSession.Callback.onConnect, если метод не переопределен, чтобы предоставлять доступ только для чтения ненадежным контроллерам. - Добавлена возможность переопределять название пакета при создании
MediaSessionс помощью нового APIMediaSession.Builder#setPackageNameOverride. Чтобы переопределить название пакета сеанса, у вызывающего абонента должно быть разрешениеandroid.permission.OVERRIDE_MEDIA_SESSION_OWNER. - Добавьте
MediaSession.Callback.onConnectAsync(). Новый метод позволяет асинхронно обрабатывать попытку подключения контроллера. Чтобы добиться прежнего поведения, приложения могут сразу возвращатьFutureсFutures.immediateFuture(ConnectionResult). Рекомендуем перейти на новый метод, посколькуCallback.onConnectможет быть упразднен. - Устранена проблема, из-за которой при просмотре Bluetooth AVRCP не распознавалось значение
MediaLibraryServiceв API 36 и 37. - Исправлено двойное уменьшение масштаба обложки в
MediaSession, когда размер изображения близок к ограничению платформы. Это устраняет размытость в уведомлениях (#3134). - Исправлен сбой
ForegroundServiceStartNotAllowedExceptionвMediaNotificationManager, когда обратный вызов асинхронной загрузки растрового изображения обложки пытался запустить активную службу, пока приложение работало в фоновом режиме (#3270). - Исправлена ошибка, из-за которой у объектов
PositionInfo, полученныхMediaController, отсутствовали исходные идентификаторы UIDTimeline. Теперь сеанс надежно преобразует и распространяет эти UID во время обновления состояния. - Исправлен сбой, возникавший при перехвате
ForegroundServiceStartNotAllowedExceptionвMediaSessionService.stopSelfSafely()(#3310). - Исправлен неожиданный обратный вызов
onMediaItemTransition()вMediaControllerпри поиске внутри одного и того же медиаобъекта (#3248).
- Исправлены потенциальные взаимоблокировки и сбои
- Интерфейс:
- Исправлена ошибка, из-за которой первый кадр отображался в неправильном размере, когда
ContentFrameперекомпоновывался в середине воспроизведения (#3238). - Добавьте класс
CurrentMediaItemStateи соответствующую composable-функциюrememberCurrentMediaItemStateв модульmedia3-ui-compose. Это хранилище состояния используется вdemo-composeдля отображения различных метаданных о воспроизводимом в данный моментMediaItem. - Добавьте класс
PlaylistStateи соответствующую composable-функциюrememberPlaylistStateв модульmedia3-ui-compose. Это хранилище состояния используется вdemo-composeдля отображения различных метаданных оMediaItems, заданном в проигрывателе. - Добавьте API для ускорения и замедления в
PlaybackSpeedState. Используйте эту функцию вdemo-compose, чтобы показать, как работает перемотка вперед долгим нажатием. - Добавьте composable-функцию
MiniControllerв модульmedia3-ui-compose-material3. Оно предоставляет компактный аффорданс для управленияPlayer, отображая при этом название, исполнителя, обложку и ход воспроизведения текущего мультимедийного объекта. - Добавьте класс
ErrorStateи соответствующую composable-функциюrememberErrorStateв модульmedia3-ui-compose. Добавьте компонент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и ComposePresentationStateпроисходили сбои на временных шкалах, не поддерживающих поиск UID периода (#3264).
- Исправлена ошибка, из-за которой первый кадр отображался в неправильном размере, когда
- Скачивания:
- Разрешение переменных HLS в плейлисте медиаконтента при получении для скачивания (#3258).
- Расширение Ktor:
- Расширение HLS:
- Добавлена поддержка управления контентом HLS и клонирования путей (#1689).
- Добавьте
setWithAssetListResetвHlsInterstitialsAdsLoader, чтобы приложения могли сбрасывать полностью обработанные межстраничные объявления из списка объектов обратно в недоступное состояние для повторного разрешения по запросу. - Атрибут
SCOREдляEXT-X-STREAM-INFиEXT-X-I-FRAME-STREAM-INFтеперь анализируется и добавляется вFormat.selectionPriority(#3236). - Исправлена ошибка, из-за которой запланированные обновления плейлиста HLS продолжались, даже если плейлист больше не был основным или активным (#3254).
- Исправлен расчет смещения возобновления контента при разрешении списков объектов межстраничных объявлений (#3322).
- Исправлена ошибка, из-за которой при возобновлении воспроизведения трансляции с низкой задержкой после сбоя запроса плейлиста возникал неожиданный разрыв временных меток аудиодорожки (#3311).
- Исправлена ошибка в
HlsMediaPeriod.getStreamKeys(), из-за которой трек ID3 в аудиоверсиях считался субтитрами (#3333).
- Расширение DASH:
- Разделяйте субтитры CEA на разные элементы
TrackGroupв зависимости от языка (#3113). - Добавлена поддержка синтаксического анализа нескольких элементов
Locationиз манифеста (MPD) и резервного местоположения вDashMediaSource, если манифест не загружается. - Исправлен сбой (
IndexOutOfBoundsException), возникавший при открытии манифестов с пустым элементом<SegmentTimeline/>(#3326).
- Разделяйте субтитры CEA на разные элементы
- Расширение RTSP:
- Исправлены временные сбои воспроизведения или ошибки во время подготовки воспроизведения RTSP, вызванные ошибками привязки портов UDP.
- Расширение Cast:
- Добавлен новый класс
CastParams, позволяющий настраивать Cast с помощью вызоваCast.initialize(CastParams). - Добавлен новый параметр
CastParams.getShowSystemOutputSwitcherOnCastIconClick(), который позволяет использовать переключатель вывода SystemUI вместо средства выбора устройства Cast в приложении, если оно доступно. - Добавлены
MediaRouteButtonStateиrememberMediaRouteButtonStateдля поддержки отслеживания состояния видимости средства выбора маршрута медиа, а также параметрstateвMediaRouteButton(#3172). - Исправлена ошибка, из-за которой
RemoteCastPlayerмог навсегда застрять в состоянии маскирования трека после выбора трека, в результате чего он игнорировал последующие обновления трека от приемника Cast (#3237). - Исправлена ошибка, из-за которой
DefaultMediaItemConverterвыдаетNullPointerExceptionпри попытке присоединиться к сеансу трансляции, запущенному отправителем, не относящимся к Media3. - Запрещено переносить из
CastPlayerMediaItems, которые нельзя воспроизвести, при смене активного проигрывателя (#3199). - Исправлена ошибка, из-за которой ненастроенные прямые трансляции (
liveConfiguration == UNSET) ставились в очередь какSTREAM_TYPE_BUFFERED(#3318).
- Добавлен новый класс
- Инструменты для тестирования:
- Расширьте
DataSourceContractTest, чтобы включить поддержку запросовPOSTс заголовками и телами, добавьте некоторые ресурсыPOSTвHttpDataSourceTestEnvи добавьте утверждения для ожидаемого метода HTTP, заголовков и тела вWebServerDispatcher. - Ужесточите утверждения в
DataSourceContractTestдля длин, возвращаемых изDataSource.open(). Ресурсы, которые могут возвращать ошибкуC.LENGTH_UNSET, должны указывать на это с помощьюTestResource.Builder.setMayResolveToUnknownLength(boolean). - Свойство
setPlaybackLooperдобавлено в запросTestExoPlayerBuilder.
- Расширьте
- Удалите устаревшие символы:
- Удалить
androidx.media3.exoplayer.MetadataRetrieverИспользуйте вместо негоandroidx.media3.inspector.MetadataRetriever. - Удалить
androidx.media3.exoplayer.MediaExtractorCompatИспользуйте вместо негоandroidx.media3.inspector.MediaExtractorCompat. - Удалить
Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATAДля извлечения метаданных фото с движением из файлов HEIC используйтеHeifExtractor. - Удалить
androidx.media3.extractor.metadata.mp4.MotionPhotoMetadataИспользуйте вместо негоandroidx.media3.extractor.metadata.MotionPhotoMetadata. - Удалить
androidx.media3.extractor.DummyTrackOutputИспользуйте вместо негоandroidx.media3.extractor.DiscardingTrackOutput. - Удалить
androidx.media3.extractor.DummyExtractorOutputИспользуйте вместо негоandroidx.media3.extractor.NoOpExtractorOutput. - Удалить
androidx.media3.common.C.generateAudioSessionIdV21Используйте вместо негоandroidx.media3.common.util.Util.generateAudioSessionId.
- Удалить
- Создание
- Обновлены инструкции
README.mdпо локальной зависимости от Media3 для использования составных сборок Gradle (includeBuild). Скриптcore_settings.gradleудален, а свойстваandroidxMediaModulePrefixиandroidxMediaEnableMidiModuleбольше не используются.
- Обновлены инструкции
1.11.0-rc01
Используйте стабильную версию 1.11.0.
1.11.0-beta01
7 июля 2026 г.
Используйте стабильную версию 1.11.0.
1.11.0-alpha01
24 июня 2026 г.
Используйте стабильную версию 1.11.0.
Версия 1.10.0
1.10.1
12 мая 2026 г.
- Общая библиотека:
- Исправьте обработку
onAudioSessionIdChangedвSimpleBasePlayerиForwardingSimpleBasePlayer.
- Исправьте обработку
- ExoPlayer:
- Исправлено состояние гонки, связанное с созданием идентификатора аудиосеанса, которое могло привести к ошибке
IllegalStateExceptionв туннельном режиме. (#3099). - Исправлены возможные сбои приложения при восстановлении после ошибок декодера с предварительным прогревом средства визуализации.
- Исправлена ошибка, из-за которой при использовании кодека Dolby Vision на основе AV1 возникали артефакты видео, вызванные предоставлением данных инициализации (#3153).
- Исправлено состояние гонки, связанное с созданием идентификатора аудиосеанса, которое могло привести к ошибке
- Выбор дорожки:
- Скорректирована логика выбора треков в
VideoTrackInfo, чтобы устранить резервные MIME-типы и перенести настройки HDR и оценки кодеков в настройки качества (#3135).
- Скорректирована логика выбора треков в
- Экстракторы:
- MP3: игнорирование длины данных Xing, если она превышает известную длину потока (#3117).
- Исправлена ошибка
ArrayIndexOutOfBoundsExceptionвMp4Extractor, возникавшая, когда задано значениеFLAG_OMIT_TRACK_SAMPLE_TABLE, а в дорожке отсутствует поле синхронизации (stss).
- Аудио:
- Исправлена ошибка, из-за которой аудиособытия могли быть неправильно перенаправлены, если в проигрыватель добавлено несколько средств визуализации аудио.
- Видео:
- Скорректирована логика повторного использования кодека при изменении частоты кадров в API ниже 30, чтобы избежать сброса кодека, когда это не требуется (#3120).
- Отключить обходное решение с принудительной синхронизацией в
queueSecureInputBufferдля API 31+. Это решение было искусственным узким местом, которое заставляло расшифровку выполняться последовательно. Это предотвращало искажение видео из-за проблемы с фреймворком, существовавшей до API 31.
- Изображение:
- Исправлена ошибка, из-за которой в режиме перемотки изображения обновлялись, только когда пользователь останавливал перемотку (#2815).
- Сеанс:
- Исправлена ошибка, из-за которой
ForegroundServiceStartNotAllowedExceptionне распространялся за пределы потока, если поток приложения не был основным (#2499). - Исправлена ошибка, из-за которой
COMMAND_SEEK_TO_MEDIA_ITEMне был доступен вMediaControllerпри подключении к сеансу только для платформы, который поддерживает переход к другим элементам, но не поддерживает изменение плейлиста. - Исправлена ошибка, из-за которой
MediaControllerне может задавать мультимедийные объекты в сеансах воспроизведения на платформе, не разрешающих действияPREPARE_FROM. - Исправлена ошибка, из-за которой собственный процесс не помечался как
Controller.isTrusted()в API 27 или более ранних версиях при подключении через контроллеры платформы.
- Исправлена ошибка, из-за которой
- Расширение HLS:
- Исправлена ошибка, из-за которой при резервном копировании потока возникало исключение
ArrayIndexOutOfBoundsException, если выбранная дорожка была подмножеством доступных дорожек (#3161). - Исправлена ошибка, из-за которой сегмент инициализации не переносился в обновления плейлиста, если тег
#EXT-X-MAPне повторялся в последующих обновлениях (#3105).
- Исправлена ошибка, из-за которой при резервном копировании потока возникало исключение
- Расширение DASH:
- Исправлен сбой в
SampleQueueпри поиске фрагмента, который в данный момент отменяется.
- Исправлен сбой в
1.10.0
26 марта 2026 г.
- Общая библиотека:
- Перевести
Player.mute()иPlayer.unmute()изUnstableApiв стабильную версию. - Перевести
Format.pcmEncodingиC.PcmEncodingизUnstableApiв стабильную версию. - Добавьте
Format.primaryTrackGroupId, чтобы определить основную группу встроенных экземпляровFormat(#294).
- Перевести
- ExoPlayer:
- Добавьте в
AdsMediaSourceвозможность создавать клипы. - Добавьте поддержку динамического планирования в
MediaCodecVideoRenderer, чтобы лучше согласовать планирование работы и циклы пробуждения ЦП с моментами, когда можно обрабатывать кадры видео. Для этого используйтеexperimentalSetEnableMediaCodecVideoRendererDurationToProgressUs()вDefaultRenderersFactory. - Разрешить задавать собственное значение
DataSource.FactoryвDefaultPreloadManager.Builder. - Разрешить имитацию
ExoPlayerбез Robolectric, переместив некоторые константы по умолчанию вExoPlayer.Builder. Имитировать этот сложный интерфейс обычно не рекомендуется. Это можно делать, только если он используется минимально, просто или случайно (#2985).- Для этого потребовалось перенести
DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MSизExoPlayerвExoPlayer.Builder(без прекращения поддержки).
- Для этого потребовалось перенести
- Исправлена ошибка, из-за которой
ProgressiveMediaSourceпередает проигрывателю устаревшую информацию о временной шкале, а периоды в очереди неожиданно удаляются (#3016). - Исправлена ошибка, из-за которой ExoPlayer не запрашивал отложенный аудиофокус, когда воспроизведение запрашивалось во время телефонного звонка.
- Исправлена ошибка, из-за которой при переходе от контента по запросу к трансляции в конце контента по запросу могла происходить повторная буферизация (#3052).
- Добавлена поддержка Dolby Vision Profile 10 (#2830).
- Исправлена ошибка, из-за которой неинициализированная реклама в начале видео вызывала ошибку
ArrayIndexOutOfBoundsException(#3125).
- Добавьте в
- CompositionPlayer:
- Добавьте поддержку
EditedMediaItem.removeVideo.
- Добавьте поддержку
- Трансформатор:
- Теперь в
EditedMediaItem.Builder.setFrameRate()можно задать максимальную частоту кадров для видео. Это особенно полезно при увеличении скорости воспроизведения с помощьюsetSpeed().
- Теперь в
- Выбор дорожки:
- Измените сигнатуру
DefaultTrackSelector.selectAllTracks, чтобы включить выходной массив в качестве параметра, предварительно заполненного переопределениями треков. - Исправлена ошибка, из-за которой встроенные дорожки метаданных выбирались независимо от того, выбрана ли соответствующая основная дорожка (#294).
- Стабилизировать
TrackSelectionParametersвариантов дляpreferredVideoLanguages,preferredVideoLabels,preferredAudioLabels,preferredTextLabelsиselectTextByDefault.
- Измените сигнатуру
- Экстракторы:
- MP4: добавлена поддержка файлов с большими блоками
uuidперед другими блоками, напримерmoov(#3046). - MP4: добавлена поддержка дорожек Versatile Video Coding (VVC) в контейнерах MP4.
- MP4: добавлена поддержка файлов с большими блоками
- Инспектор:
- Критическое изменение: удаление
FrameExtractor. Теперь пользователям нужно использовать новый модуль:media3-inspector-frameи обновить импорт доandroidx.media3.inspector.frame.FrameExtractor. - Добавлен новый модуль для извлечения и обработки декодированных кадров видео.
- Критическое изменение: удаление
- Аудио:
- Базовая библиотека декодирования для расширения декодера IAMF изменена с
libiamfнаiamf_tools. - Декодирование IAMF поддерживает бинауральный вывод через декодер (при использовании расширения декодера IAMF) или через Android Spatializer.
- Исправлена ошибка, из-за которой при оценке поддержки декодера AC-4 в автомобильных сценариях некорректно удалялась поддержка
AC4Profile22и других устаревших профилей (#2609). - Улучшена логика повторных попыток инициализации
AudioOutputвDefaultAudioSink(#2905). - Попытка сопоставить выходной макет динамиков (или пространственного звука, если применимо) при декодировании IAMF как с расширением IAMF, так и с декодерами медиакодеков, поддерживаемыми новыми полями и логикой в AudioCapabilities и AudioCapabilitiesReceiver.
- Исправлена ошибка, из-за которой воспроизведение плейлиста с аудио без пауз зависало в режиме сжатой разгрузки.
- Базовая библиотека декодирования для расширения декодера IAMF изменена с
- Текст:
- VobSub: для определения длительности подсказки используются команды управления SPU
STARTиSTOPвместо значения по умолчанию, равного 5 секундам (#2935).
- VobSub: для определения длительности подсказки используются команды управления SPU
- Метаданные:
- Увеличено количество средств визуализации метаданных по умолчанию до четырех, чтобы охватить все потенциальные дорожки метаданных, публикуемые вариантами и версиями HLS (#3043).
- Эффект:
- Переместите
LottieOverlayв новый модуль:media3-effect-lottie(при этом также потребуется переименовать его изandroidx.media3.effect.LottieOverlayвandroidx.media3.effect.lottie.LottieOverlay).
- Переместите
- Эффект Lottie:
- Представляем новый модуль
:media3-effect-lottie, который позволяет применять эффекты Lottie к кадрам видео.
- Представляем новый модуль
- Расширение IMA:
- Обновите IMA SDK до версии 3.39.0, чтобы получить доступ к последней версии Ad Media Info API.
- Исправлена ошибка, из-за которой MIME-тип объявления не соответствовал MIME-типу, указанному в событии IMA LOADED. Теперь MIME-тип объявления сопоставляется с использованием информации о медиафайле объявления, предоставленной IMA.
- Добавьте
setEnableCustomTabsвImaAdsLoaderиImaServerSideAdInsertionMediaSource, чтобы пользователи могли выбирать, открывать ли URL перехода по клику в специальных вкладках. - Добавьте
ImaAdTagUriBuilder– класс, который предлагает альтернативный способ созданияadTagUri. Он содержитsetPreferredLinearOrientationAPI. Этот API находится на стадии альфа-тестирования. Он позволяет задавать предпочтительную ориентацию для линейных объявлений. Если вы хотите присоединиться к группе альфа-тестирования, обратитесь к своему партнеру по аккаунту.
- Сеанс:
- Исправлена ошибка, из-за которой большие массивы в
MediaMetadata.artworkDataмогли приводить к сбою приложения. - Используйте тип int для аргумента
@Player.Commandв интерфейсеActionFactory(#2933). - Сделайте
MediaSessionServiceиMediaLibraryServiceLifecycleService, чтобы можно было прикреплять операции, учитывающие жизненный цикл, к жизненному циклу сервиса (#187). - Прекратить поддержку команд изменения громкости устройства от
MediaControllerиMediaBrowserдля локального воспроизведения. Приложения не должны менять громкость на устройстве. При необходимости для этого можно использовать APIAudioManager. - Обнаруживать устаревшие экземпляры
Intent, которые запустили службу как активную. Это позволяет избежать ошибкиForegroundServiceDidNotStartInTimeException. Это критическое изменение в нестабильном API для приложений, в которых реализован собственный классMediaNotification.Provider, поскольку появился новый обязательный метод. - Добавлены конструкторы для экземпляров
PendingIntent, которые будут использоваться с виджетами главного экрана (#2933). - Добавлены статические методы для создания экземпляров
Intentдля виджетов главного экрана на основе Compose (#2933). - Исправлена ошибка, из-за которой контроллеры не получали уведомление о переходе между мультимедийными объектами, когда воспроизведение переходило от одного индекса мультимедийного объекта к другому с тем же мультимедийным объектом по причине прерывания AUTO и SEEK (#2997).
- Исправлена ошибка, из-за которой обходное решение для размещения кнопок в системном интерфейсе негативно влияло на другие интерфейсы, например Android Auto, или на устройства производителей, которым не требовалось это решение (#3041).
- Исправлена ошибка, из-за которой доступ к подпискам не синхронизировался (#3056).
- Устранена ошибка SysUI в API 29, из-за которой обложка медиасеанса определенного размера могла привести к сбою SysUI и принудительной перезагрузке устройства (#3118).
- Исправлено масштабирование значка обложки в уведомлениях на Android Q (#3084).
- Исправлена ошибка, из-за которой большие массивы в
- Интерфейс:
- Добавьте composable-функцию
PlaybackSpeedControlвmedia3-ui-compose, чтобы показывать и изменять скорость воспроизведения. - Добавьте компонент
PlaybackSpeedToggleButtonComposable вmedia3-ui-compose-material3, чтобы управлять скоростью воспроизведения. - Добавлен компонент
ProgressSliderComposable вmedia3-ui-compose-material3для отображения прогресса воспроизведения и перемотки с помощью перетаскивания и нажатия (#2288). - Избегайте использования большого буфера за пределами экрана при анимации PlayerControlView.
- Добавьте composable-функцию
Playerвmedia3-ui-compose-material3, которая объединяетContentFrameс настраиваемыми элементами управления, выровненными по верхнему краю, центру и нижнему краю. - Скрыть позицию воспроизведения от службы специальных возможностей, чтобы предотвратить непрерывное обновление объявлений, когда виден элемент
PlayerControlView.
- Добавьте composable-функцию
- Расширение HLS:
- Добавлена поддержка X-PLAYOUT-LIMIT с межстраничными объявлениями HLS (#2484).
- Добавлена поддержка атрибута
QUERYPARAMс#EXT-X-DEFINE(#1854). - Оптимизирован синтаксический анализ плейлистов HLS за счет кеширования сопоставителей регулярных выражений (#3008).
- Добавлена возможность показывать дорожку метаданных ID3 (EMSG) в аудиоверсиях (#3043).
- Добавлена возможность использовать резервное местоположение при возникновении ошибок загрузки, если доступны избыточные потоки из разных местоположений (#1988).
- Исправлено поведение X-SNAP для межстраничных объявлений HLS, чтобы правильно рассчитывать позицию начала и возобновления (#3013).
- Расширение DASH:
- Расширение RTSP:
- Исправлена регрессия в потоковой передаче H.264 и H.265, из-за которой неправильно анализировались выборки одного и того же блока доступа, охватывающего несколько пакетов RTP. Это приводило к появлению визуальных артефактов и повреждению видео (#3121).
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Добавлена поддержка менеджера интерфейса MPEG-H в расширение декодера MPEG-H (#3066).
- Расширение Cast:
- Добавлен метод
RemoteCastPlayer.Builder#setTrackSelector, позволяющий выбирать треки для воспроизведения через Cast.
- Добавлен метод
- Удалите устаревшие символы:
- Удалить
ExperimentalFrameExtractorИспользуйте вместо негоandroidx.media3.inspector.frame.FrameExtractor. - Удалить
ChannelMixingMatrix.create()Используйте вместо негоChannelMixingMatrix.createForConstantGain(). - Удалить
androidx.media3.extractor.metadata.flac.VorbisCommentИспользуйте вместо негоandroidx.media3.extractor.metadata.vorbis.VorbisComment. - Удалить
MediaSource.prepareSource(MediaSourceCaller, TransferListener)Используйте вместо негоMediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).
- Удалить
1.10.0-rc03
25 марта 2026 г.
Используйте стабильную версию 1.10.0.
1.10.0-rc02
16 марта 2026 г.
Используйте стабильную версию 1.10.0.
1.10.0-rc01
10 марта 2026 г.
Используйте стабильную версию 1.10.0.
1.10.0-beta01
25 февраля 2026 г.
Используйте стабильную версию 1.10.0.
1.10.0-alpha01
6 февраля 2026 г.
Используйте стабильную версию 1.10.0.
Версия 1.9.0
1.9.4
16 мая 2026 г.
Версия 1.9.4 содержит следующие коммиты.
- Эффект:
- Явно задайте
GL_DRAW_BUFFERиGL_READ_BUFFERпри переходе из контекста без поверхности.
- Явно задайте
1.9.3
16 марта 2026 г.
Версия 1.9.3 содержит следующие коммиты.
- Аудио:
- Исправлена ошибка, из-за которой воспроизведение плейлиста с аудио без пауз зависало в режиме сжатой разгрузки.
1.9.2
6 февраля 2026 г.
Версия 1.9.2 содержит следующие коммиты.
- ExoPlayer:
- Исправлена ошибка, из-за которой
ProgressiveMediaSourceпередавал проигрывателю устаревшую информацию о временной шкале, а периоды в очереди неожиданно удалялись (#3016).
- Исправлена ошибка, из-за которой
- Сеанс:
- Исправлена ошибка, из-за которой обходное решение для размещения кнопок в системном интерфейсе негативно влияло на другие интерфейсы, например Android Auto, или на устройства производителей, которым не требовалось это решение (#3041).
- Расширение Cast:
- Исправлена ошибка, из-за которой не работал перенос с Cast на локальное воспроизведение.
1.9.1
26 января 2026 г.
Версия 1.9.1 содержит эти коммиты.
- Общая библиотека:
- Добавлена поддержка строк даты и времени, в которых в смещении часового пояса указаны только часы (#2929).
- ExoPlayer:
- Разрешить динамическое планирование, чтобы замедлить интервал
doSomeWorkтолько после начала воспроизведения аудио. Это позволит улучшить синхронизацию аудио и видео в начале воспроизведения. - Исправлена ошибка в
DefaultLoadErrorHandlingPolicy, из-за которой повторно выполнялись попытки дляFileNotFoundExceptionи подобных типов исключений. - Исправлена ошибка с динамическим планированием, из-за которой расчетное время для следующего
doSomeWorkошибочно уменьшалось на время, прошедшее с текущей итерацииdoSomeWork. Решение этой проблемы должно увеличить время простоя ЦП и сэкономить энергию. - Исправлена ошибка, из-за которой некоторые файлы Dolby Vision не воспроизводились при попытке использовать резервный кодек AVC или HEVC.
- Исправлена ошибка, из-за которой загрузка продолжалась после окончания воспроизведения, если воспроизводимый объект был удален из плейлиста (#2873).
- Устранена утечка экземпляров
MediaItemпри повторном использованииExoPlayer.replaceMediaItemдля одного и того же элемента (#2993). - Предотвращение потенциальных ошибок ANR, вызванных экстренным снятием запрета блокировки (#2979).
- Разрешить динамическое планирование, чтобы замедлить интервал
- Экстракторы:
- MP3: добавлена обработка данных ReplayGain в LAME (#2840).
- Аудио:
- Исправлена ошибка, из-за которой при оценке поддержки декодера AC-4 в автомобильных сценариях некорректно удалялась поддержка
AC4Profile22и других устаревших профилей (#2609).
- Исправлена ошибка, из-за которой при оценке поддержки декодера AC-4 в автомобильных сценариях некорректно удалялась поддержка
- Видео:
- Отбрасывание видеокодеков на устройствах с API ниже 30 при изменении частоты кадров контента, чтобы избежать задержек при воспроизведении (#2941).
- Текст:
- VobSub: исправлена проблема с отсутствием некоторых субтитров за счет правильной обработки SPU, которые содержат только одну управляющую последовательность или имеют критически важную информацию, разделенную на несколько управляющих последовательностей (#2935).
- Расширение IMA:
- Исправлена ошибка, из-за которой MIME-тип объявления не соответствовал MIME-типу, указанному в событии IMA LOADED. Теперь MIME-тип объявления сопоставляется с индексом пакета объявлений и позицией объявления.
- Добавьте проверку на нулевое значение перед доступом к результату
getAdsManager()иAdEvent.getAd().
- Сеанс:
- Исправлена ошибка, из-за которой остановка
MediaController, подключенного к сеансу платформы, приводила к сбою приложения, если остановка происходила во время воспроизведения объявления (#2948). - Добавьте дополнительные проверки экземпляров
extrasBundleв различных классах, чтобы защититься от некорректных экземпляровBundle, отправленных из других процессов. - Исправлена ошибка, из-за которой отсутствие команд для
COMMAND_SEEK_NEXTилиCOMMAND_SEEK_BACKмогло приводить к пробелам в уведомлении о системных медиаданных (#2976). - Масштабирование растрового изображения для значка уведомления перенесено из основного потока (#2829).
- Исправлена ошибка, из-за которой автор, автор текста и композитор не использовались в качестве резервных вариантов при преобразовании из устаревших
MediaMetadataCompatиMediaDescriptionCompat(#3018).
- Исправлена ошибка, из-за которой остановка
- Скачивания:
- Исправлены потенциальные бесконечные циклы при обработке
PriorityTooLowExceptionс помощьюSegmentDownloader(для DASH, HLS и SmoothStreaming). Специальные переопределенияSegmentDownloaderс использованием защищенного методаexecuteдолжны предоставлять задачу, упакованную вSupplier, чтобы ее можно было воссоздать (#2931).
- Исправлены потенциальные бесконечные циклы при обработке
- Расширение HLS:
- Передайте необработанный JSON-документ со списком объектов в обратный вызов
Listener.onAssetListLoadCompleted. Это критическое изменение в нестабильном API, которое требует от приложений, реализующих этот обратный вызов, добавить дополнительный аргумент типаJSONObject(#2950).
- Передайте необработанный JSON-документ со списком объектов в обратный вызов
- Расширение RTSP:
- Исправлена обработка пакетов RTP с временными метками, которые переносятся (#2930).
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Исправлена потенциальная ошибка
NullPointerException, которая могла возникать при перемотке до обработки первого кадра видео (#2965).
- Исправлена потенциальная ошибка
- Расширение Cast:
- Исправлена ошибка, из-за которой временная шкала
RemoteCastPlayerне обновлялась корректно при замене плейлиста.
- Исправлена ошибка, из-за которой временная шкала
1.9.0
17 декабря 2025 г.
- Общая библиотека:
- Обновите
minSdkдо23в соответствии с другими библиотеками AndroidX. - Добавлен класс
PlayerTransferState, который упрощает перенос состояния воспроизведения между экземплярамиPlayer. - Добавьте в Player методы
void mute()иvoid unmute(), которые сохраняют и восстанавливают громкость Player до и после установки ее на ноль. - Опубликуйте служебные классы
WakeLockManager,WifiLockManager,AudioFocusManager,AudioBecomingNoisyManagerиStuckPlayerDetector, которые ранее использовалисьExoPlayer, чтобы разрешить повторное использование для других проигрывателей (#1893). - Исправлена обработка прослушивателя
ForwardingPlayer, когда базовый делегированный проигрыватель использует равенство ссылок для сравнения экземпляров прослушивателя (#2675). - Добавьте функцию приостановки расширения
Player.listenToв библиотекуmedia3-common-ktx, которая указывает конкретныйPlayer.Events, с которым нужно выполнить действие. - Исправлен сбой в
BasePlayer.getBufferedPercentage, возникавший из-за переполнения целого числа, когда сообщаемая позиция буферизации была неправдоподобно больше сообщаемой длительности (#2750). - Исправлено автоматическое определение типа дорожки
TrackGroup. Теперь специальный MIME-тип образца не игнорируется, а в качестве резервного варианта используется потенциально неверный тип дорожки из MIME-типа контейнера (#2860).
- Обновите
- ExoPlayer:
- Добавьте функцию обнаружения зависания проигрывателя, которая будет вызывать ошибку
StuckPlayerException, если проигрыватель завис. Это происходит в следующих случаях (при необходимости время ожидания по умолчанию можно настроить вExoPlayer.Builder):- Если в течение 10 минут
STATE_BUFFERINGне воспроизводится и не буферизуется. - Если в течение 10 секунд после попытки воспроизведения
STATE_READYне начинается. - Если по истечении 1 минуты после
STATE_READYзаявленной продолжительности конец объекта не достигнут. - Если в течение 10 минут воспроизведение не удается начать из-за ошибки.
- Если в течение 10 минут
- Включить обработку запрета блокировки по умолчанию, чтобы устранить проблемы с буферизацией во время фонового воспроизведения. Это эквивалентно установке значения
C.WAKE_MODE_LOCALдля параметраExoPlayer.Builder.setWakeMode. - Добавьте логику прослушивания, чтобы автоматически обновлять идентификатор виртуального устройства, когда сообщается об изменении в
Context, изначально переданном вExoPlayer.Builder. - Добавьте
ExoPlayer.setVirtualDeviceId, чтобы вручную обновить идентификатор виртуального устройства, полученный изContextи переданный вExoPlayer.Builder. - Убедитесь, что средства визуализации не используют данные из следующего элемента плейлиста более чем за 10 секунд до окончания текущего элемента.
- Добавлены методы
setSeekBackIncrementMs,setSeekForwardIncrementMsиsetMaxSeekToPreviousPositionMsвExoPlayer, позволяющие обновлять эти настройки после создания (#2736). - Добавьте функцию предварительного кеширования в
DefaultPreloadManager. Теперь приложения могут возвращатьDefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)илиDefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)черезTargetPreloadStatusControl.getTargetPreloadStatus(T rankingData), чтобы указать, что мультимедийный объект нужно предварительно кешировать. - Используйте функцию предварительного кеширования
DefaultPreloadManagerв демоприложении для коротких видео. - Добавьте сеттеры
DefaultLoadControl.Builderдля локального воспроизведения и настройте значения по умолчанию дляDefaultLoadControl, чтобы обеспечить совместимость с широким спектром локальных файлов. - Исправлена ошибка, из-за которой при настройке пустого плейлиста проигрыватель мог оставаться в состоянии
STATE_READYилиSTATE_BUFFERING. - Улучшение API менеджера предварительной загрузки:
- Добавьте
addMediaItems(List<MediaItem>, List<T>)иaddMediaSources(List<MediaSource>, List<T>), которые добавляют мультимедийные объекты или источники мультимедиа в пакетном режиме и автоматически вызываютinvalidate(). - Добавьте
removeMediaItems((List<MediaItem>)иremoveMediaSources(List<MediaSource>), которые удаляют мультимедийные объекты или источники в пакетном режиме. Убедитесь, что менеджер предварительной загрузки не начинает и не продолжает предварительную загрузку ни одного из них после удаления. - Разрешить
DefaultPreloadManager.setCurrentPlayingIndex(int)автоматически аннулировать себя. После обновления индекса текущего воспроизведения приложениям больше не нужно явно вызыватьinvalidate().
- Добавьте
- Добавлена возможность пропускать сброс ключевого кадра при перемотке вперед в пределах одной группы изображений в режиме прокрутки.
- Добавьте
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int), чтобы приложения могли задавать значение целевого буфера в байтах для проигрывателя с указаннымplayerName. ТеперьDefaultLoadControlможет принимать решения для каждого проигрывателя отдельно на основе выделенных ему байтов и целевого размера буфера. - Добавьте
SkipInfoвAdPlaybackState.AdGroup, чтобы передавать информацию о пропуске для каждого объявления в группе. - Исправлена ошибка, из-за которой вызов
removeMediaItems(List)во время воспроизведения видеорекламы в конце ролика приводил к сбою (#2746). - Исправлены некоторые задержки при воспроизведении плейлистов, когда кадры ошибочно всегда устанавливались как последний образец и отрисовывались.
- Добавлена возможность повторной попытки, если проигрывателю не удается сгенерировать идентификатор аудиосеанса (#2382, #2678).
- Добавлена поддержка управления общим размером буфера для источников в
DefaultPreloadManager, чтобы избежать произвольного увеличения размера буфера для предварительной загрузки. Чтобы использовать логику управления по умолчанию, приложения могут задавать целевой размер буфера для предзагрузки с помощьюDefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)дляplayerNameсо значениемPlayerId.Preload.name("preload") и внедрять созданныйDefaultLoadControlс помощьюDefaultPreloadManager.Builder.setLoadControl(LoadControl). - Добавлен метод
cloneAndSet(int, int)вShuffleOrderс реализацией по умолчанию (#2834). - Добавлено смещение возобновления контента при пропуске воспроизведения объявления после корректировки поиска или автоматического перехода (#2484).
- Добавлен API для настройки и отслеживания параметров кодеков для аудио- и видеодорожек.
Эта функция реализована для средств визуализации на основе
MediaCodecи требует API 29 или более поздней версии.- Используйте
ExoPlayer.setAudioCodecParameters()иExoPlayer.setVideoCodecParameters(), чтобы применить параметры. - Используйте
ExoPlayer.addAudioCodecParametersChangeListener()иExoPlayer.addVideoCodecParametersChangeListener(), чтобы отслеживать изменения. Для отслеживания ключей, относящихся к поставщику, требуется API 31 или более поздней версии.
- Используйте
- Исправлена ошибка
IllegalStateException, которая возникала, если задать пустой источник медиаконтента после перехода к ненулевой позиции, а затем подготовить проигрыватель с непустым источником медиаконтента. - Исправлена ошибка, из-за которой при переходе к другим мультимедийным объектам в режиме перемотки мог возникать сбой
IllegalStateException. - Исправлена потенциальная ошибка
NullPointerExceptionвDefaultPlaybackSessionManager(#2885). - Включить улучшенную перемотку для подходящих видео.
- Повторно включена асинхронная расшифровка в MediaCodec на API 36 и более поздних версиях, где исправлены проблемы с тайм-аутом в этом API платформы (#1641).
- Измените значение по умолчанию для
MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUsна 15 мс и включите более эффективный пропуск кадров видео перед декодированием для подходящих видео. - Добавьте максимальный лимит памяти для автоматического расчета памяти в
DefaultLoadControl. Это должно происходить, только если выбрано слишком много треков (#2860). - Исправлена ошибка, из-за которой при воспроизведении плейлиста или в режиме повтора перемотка в режиме прокрутки ближе к концу могла привести к переходу к следующему мультимедийному объекту.
- Добавьте функцию обнаружения зависания проигрывателя, которая будет вызывать ошибку
- CompositionPlayer:
- Опубликуйте
CompositionPlayerс новой аннотацией@ExperimentalApi, чтобы указать, что функция доступна для экспериментов, но все ещё находится в разработке. Некоторые API могут значительно измениться в будущих выпусках. Кроме того, в некоторых случаях могут возникать известные проблемы и ограничения (некоторые из них не задокументированы). - Добавлена поддержка
COMMAND_SET_AUDIO_ATTRIBUTESи обработки фокуса аудио вCompositionPlayer. - Добавлена поддержка изменения скорости во второстепенных последовательностях в
CompositionPlayer. - Добавьте поддержку
EditedMediaItem.removeVideo.
- Опубликуйте
- Трансформатор:
- Использовать
InAppMp4Muxerв качестве мультиплексора по умолчанию. - Добавьте
EditedMediaItem.Builder#setSpeed()и прекратите поддержкуEffects#createExperimentalSpeedChangingEffects(). - Замените
forceAudioTrackиforceVideoTrackнаtrackTypesвEditedMediaItemSequence.
- Использовать
- Выбор дорожки:
- Добавьте
TrackSelectionParameters.selectTextByDefault, чтобы выбрать любую текстовую дорожку без указания других, более конкретных предпочтений. - Добавьте
preferredVideoLabels,preferredAudioLabelsиpreferredTextLabelsвTrackSelectionParameters, чтобы указать предпочтение для треков с определенным ярлыком, например тех, которые считываются из тегов HLS NAME (#1666).
- Добавьте
- Экстракторы:
- FLAC: улучшено распознавание заголовков, чтобы снизить вероятность обнаружения ложных заголовков в закодированных данных FLAC, что приводит к ошибкам декодирования (#558).
- MP3: разрешены пробелы между тегами ID3 и перед ними в начале MP3-файлов (#811, #5718).
- MP3: лимит на сниффинг увеличен до 128 КБ, чтобы соответствовать существующему лимиту на поиск байта синхронизации (#2713).
- MP3: теперь
FLAG_ENABLE_INDEX_SEEKINGпредпочитает получать информацию для поиска из заголовков метаданных (например, Xing и VBRI), если они доступны. Если такой информации нет, используется поиск на основе индекса. Это повышает производительность при работе с файлами, содержащими метаданные поиска (#2839). - MP3. Изменено значение
Mp3Extractor, чтобы по умолчанию использовался постоянный битрейт (CBR), если не найдены метаданные поиска (например, Xing, VBRI), даже если задано значениеFLAG_ENABLE_INDEX_SEEKING. Это связано с историей спецификации MP3, в которой CBR был стандартом, а VBR требует явных заголовков. Это улучшает возможность немедленного поиска для файлов без метаданных за счет потенциальной точности для файлов VBR без заголовков. Если предположение о постоянном битрейте не позволяет выполнить перемотку (например, для потоков неизвестной длины), то в качестве резервного варианта используется перемотка по индексу (#2848). - MP4: устранена неоднозначность между MIME-типами
audio/mpeg(MP3),audio/mpeg-L1иaudio/mpeg-L2. Теперь перед извлечением формата трека из экстрактора проверяется значение слоя первого образца (#2683). - MP4: улучшено распознавание очень больших файлов. Теперь, если размер блока
stblпревышает 1 МБ, файл считается нефрагментированным (#2650). - MP4: добавлена поддержка метаданных
©mvn(название движения) и©mvi(индекс движения). Теперь они передаются как объектыTextInformationFrameвFormat.metadataс идентификаторамиMVNMиMVINсоответственно (#2754). - MP4: игнорирование дорожек с отсутствующим полем
stsd(вместо сбоя при обработке всего файла). - Matroska: добавлена поддержка обнаружения DTS-HD (#6225).
- Исправлена ошибка в
MatroskaExtractor, из-за которой поиск мог быть неточным для файлов с несколькими треками. Временные точки теперь правильно связаны с соответствующими дорожками, что обеспечивает более точную перемотку. - MPEG-TS: исправлена ошибка
IllegalArgumentExceptionизReorderingBufferQueue, вызванная пакетами PES без временной метки (#2764). - Добавлена поддержка извлечения фото с движением в формате HEIC. Теперь
HeifExtractorможет анализировать файлы HEIC со встроенными видео- и аудиодорожками.
- Инспектор:
- Добавлен новый модуль
:media3-inspector, предназначенный для утилит проверки медиафайлов. Теперь в этом модуле есть новый классandroidx.media3.inspector.MetadataRetriever, который предоставляет унифицированный API для извлечения метаданных и кадров. Существующая версияandroidx.media3.exoplayer.MetadataRetrieverбольше не поддерживается. - Добавлен новый общедоступный API
androidx.media3.inspector.FrameExtractorдля извлечения кадров. КлассAutoCloseableпозволяет извлекать кадры с поддержкой HDR-видео, видеоэффектов и выбора декодера. Его нужно создать с помощьюBuilderдля определенногоMediaItem. - FrameExtractor. Добавьте
getThumbnail(), чтобы извлечь из медиафайла кадр для значка, не указывая временную метку. - Добавьте
androidx.media3.inspector.MediaExtractorCompat– замену дляandroid.media.MediaExtractor, которая позволяет извлекать необработанные закодированные медиафрагменты из медиафайла. Существующий классandroidx.media3.exoplayer.MediaExtractorCompatтеперь не рекомендуется использовать.
- Добавлен новый модуль
- Аудио:
- Сообщите экземплярам
AudioProcessorо поиске. - Разрешить внедрение нового интерфейса
AudioOutputProviderвDefaultAudioSink.Builderдля поддержки пользовательских путей вывода аудио. Значение по умолчанию –AudioTrackAudioOutputProvider. - Обработка перемотки в
GainProcessor. - При оценке поддержки формата трека используются возможности профиля и уровня декодера AC-4 (#2580).
- Устранена проблема, из-за которой могли возникать задержки, связанные с обработкой обратных вызовов при изменении маршрутизации в начале воспроизведения (#2646).
- Разрешено повторное использование кодеков для форматов EAC3, EAC3-JOC и AC-4 (#1346).
- Добавлена поддержка PCM-сэмплов с плавающей запятой в
Sonic. - Добавлена поддержка 16-битных PCM-сэмплов в
ToFloatPcmAudioProcessor.
- Сообщите экземплярам
- Видео:
- Отключить повторное использование кодека для контента Dolby Vision с разными профилями.
- Повторно включено временное решение для неправильно сообщаемых баллов производительности для защищенных кодеков (#2856).
- Текст:
- Исправлена обработка субтитров CEA-6/708 в контенте Dolby Vision (#2775).
- Изображение:
- Устранена проблема со ScrubbingMode, из-за которой проигрыватель зависал при перемотке дорожки значков DASH (#2815).
- DRM:
- Измените тип возвращаемого значения методов
MediaDrmCallbackсbyte[]на новый типMediaDrmCallback.Response, чтобы разрешить возврат дополнительной необязательной информации. Это критическое изменение, но его можно легко устранить, обернув предыдущее возвращаемое значениеbyte[]вnew Responseперед возвратом. - Добавьте в
AnalyticsListener.onDrmKeysLoadedключевую информацию о запросе, например URL и задержку (#1001). - Перенесите данные запроса на инициализацию из параметра URL в тело POST.
- Измените тип возвращаемого значения методов
- Эффект:
- Добавьте
Presentation.copyWithUnsetSideRoundedTo, чтобы округлить сторону, для которой не задано значение, еслиPresentationсоздается с одной длиной стороны.
- Добавьте
- Мультиплексоры:
- Добавьте
MediaMuxerCompat, который заменит фреймворкMediaMuxer. - Чтобы создать фото с движением, добавьте ещё
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo(). - Добавьте
WebmMuxer, чтобы разрешить мультиплексирование медиапотоковOPUS,VORBIS,VP8иVP9в формат файлаwebm.
- Добавьте
- Расширение IMA:
- Удалены специальные правила proguard, чтобы приложения могли использовать правила, выпущенные в архиве IMA для Android.
- Добавлен новый API
ImaServerSideAdInsertionUriBuilder.setNetworkCode, который позволяет задавать код сети Google Менеджера рекламы для IMA SDK, чтобы обрабатывать идентификаторы объявлений в соответствии с настройками Google Менеджера рекламы. Коды сетей необязательны, но рекомендуются для запросов потоков с полным набором услуг. Чтобы узнать, как найти код сети, прочитайте эту статью. - Зависимость IMA обновлена до версии 3.37.0, для которой требуется включить десахаризацию основной библиотеки. Это также должно быть включено зависимыми приложениями. Ознакомьтесь с примечаниями по настройке IMA. * Добавлена поддержка настроек пользовательского интерфейса 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. - Исправлено распространение значений метаданных, отличных от
StringCharSequence, например строк со стилем span (#2853). - Добавьте
CommandButton.executeAction, чтобы контроллерам было проще запускать нужное действие. Также позволяет указывать параметры для некоторых команд проигрывателя и сеанса, чтобы определить, какое действие следует запустить. - Добавьте обратную совместимость для экземпляров
CommandButton, используяPlayer.Commandили стандартныйSessionCommand, чтобы определить их действие. Теперь они правильно представлены в медиасеансах платформы, например в системном интерфейсе или Android Auto. - Исправлена ошибка, из-за которой один и тот же
Bitmapсжимался несколько раз при подключенииMediaControllerк медиасеансу платформы.
- Добавлен новый параметр в
- Интерфейс:
- Добавьте класс
ProgressStateWithTickIntervalи соответствующую composable-функциюrememberProgressStateWithTickIntervalв модульmedia3-ui-compose. Это хранилище состояния используется вdemo-compose, чтобы показывать текущую позицию и продолжительность в текстовом формате. - Добавьте
MuteButtonStateвui-compose, чтобы отключить звукPlayer. Это хранилище состояния используется вdemo-composeдля отображения переключателя включения/выключения звука. - Добавьте классы
ProgressStateWithTickCountи соответствующую composable-функциюrememberProgressStateWithTickCountв модульmedia3-ui-compose. Это хранилище состояния используется вdemo-composeдля отображения горизонтального индикатора выполнения, доступного только для чтения. - Добавьте composable-функцию
ContentFrameвmedia3-ui-compose, которая объединяет управлениеPlayerSurfaceс изменением соотношения сторон и закрытием затвора. - Устранена известная ошибка платформы API 34, из-за которой видео растягивались или обрезались при использовании
SurfaceViewвнутри ComposeAndroidView, что влияло на composable-функцииContentFrameиPlayerSurfaceсSURFACE_TYPE_SURFACE_VIEW(#1237, #2811). - Создайте новый модуль
media3-ui-compose-material3и добавьте в него composable-функции с темой Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton). - Добавьте composable-функцию
TimeTextвmedia3-ui-compose-material3, чтобы показывать прогресс игрока в текстовом формате. Его можно настроить так, чтобы он показывал текущую позицию, продолжительность или оставшееся время. - Добавьте поддержку размещения кнопки передачи медиаданных в
PlayerView. - Используйте
BidiFormatter, чтобы правильно отображать знаки препинания в субтитрах с направлением письма справа налево (#11214).
- Добавьте класс
- Расширение HLS:
- Обработка атрибутов пропуска межстраничных объявлений HLS.
- Сопоставьте атрибуты управления пропуском из плейлиста HLS и документа со списком объектов с
AdPlaybackStateдля общего доступа. - Исправлена ошибка, из-за которой время начала плейлиста сбрасывалось, когда из плейлиста удалялся тег EXT-X-PROGRAM-START-DATE, определяющий время начала (#2760).
- Используйте двоичный поиск, чтобы найти индекс сегмента заданной позиции в плейлисте (#2826).
- Добавьте
HlsInterstitialsAdsLoader.skipCurrentAd()иskipCurrentAdGroup(), а также соответствующие методы, чтобы пропускать объявления и группы объявлений по индексу. - Добавьте
HlsInterstitialsAdsLoader.Listener.onAdStarted, чтобы сообщить о начале периода показа объявления (#2859). - В строках даты и времени ISO 8601 в качестве разделителя можно использовать пробел.
- Исправлена ошибка, из-за которой не удавалось получить следующий фрагмент для
HlsMediaPlaylistбез сегментов (#2821). - Используйте позицию по умолчанию для рекламы в начале трансляции.
- Расширение DASH:
- Исправлена ошибка
UnsupportedOperationException, возникавшая при воспроизведении потоков DASH с неиерархическим манифестом URIdata:(#2688). - Сброс
LiveConfigurationдо значения, предоставленногоMediaItemDashMediaSourceпри выпуске и когда пользователь обновляет мультимедийный объект (#2606). - Устранена проблема, из-за которой происходили сбои, вызванные недопустимыми обновлениями манифеста, которые не регистрировались как ошибки проигрывателя (#2805).
- Исправлена ошибка
- Расширение RTSP:
- Обработка ошибки, связанной с отсутствием пакетов RTP при обработке фрагментированных блоков NAL для H264 и H265 (#2613).
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Расширение AV1. Программный декодер AV1 теперь использует высокопроизводительную библиотеку
dav1dвместо предыдущей реализацииlibgav1, что повышает скорость декодирования. - Расширение FFmpeg. Исправлена ошибка, из-за которой не воспроизводились некоторые файлы FLAC. Теперь блок
STREAMINFOправильно анализируется и передается декодеру (#2887).
- Расширение AV1. Программный декодер AV1 теперь использует высокопроизводительную библиотеку
- Расширение Cast:
- Добавьте
CastPlayer.Builder, чтобыCastPlayerмог воспроизводить контент как локально, так и через Cast. Чтобы сохранить старое поведениеCastPlayer, поддерживающее только воспроизведение Cast, можно использоватьRemoteCastPlayer. Существующие конструкторыCastPlayerсохраняют прежнее поведение, но считаются устаревшими. Вместо них рекомендуется использовать конструкторыCastPlayerилиRemoteCastPlayer. - Прекратить принудительное применение ненулевого MIME-типа в
DefaultMediaItemConverter. - Используйте
MediaItem.mediaMetadata.mediaType, чтобы определить, какой тип медиаконтента (MEDIA_TYPE) нужно использовать вDefaultCastOptionsProvider#toMediaQueueItem, если он доступен. - Включите передачу данных с удаленного устройства на локальное в
DefaultCastOptionsProvider. - Добавьте поддержку Cast в демо-версию Session.
- Добавьте поддержку показа кнопки маршрута медиа в Composable 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, а также перенос в APIAutoCloseableна основе экземпляров. Используйте новыйBuilder, чтобы создать экземпляр дляMediaItem, а затем вызовитеretrieveTrackGroups(),retrieveTimeline()иretrieveDurationUs(), чтобы получитьListenableFutureдля метаданных. Предыдущие статические методы теперь не поддерживаются (#2462).
- Добавлена поддержка получения длительности медиаконтента и
- Изображение:
- Ограничьте декодированные растровые изображения размером экрана в
BitmapFactoryImageDecoder, чтобы избежать сбоя приложения с ошибкойCanvas: trying to draw too large bitmap.изPlayerViewпри попытке отобразить очень большие изображения (например, 50 Мп). - Измените сигнатуру
DefaultRenderersFactory.getImageDecoderFactory(), чтобы она принимала параметрContext. - Согласуйте максимальный размер выходного растрового изображения, используемый в
CompositionPlayer, с размером, который уже используется вTransformer(это означает, чтоCompositionPlayerне учитывает размер экрана при декодировании растровых изображений, в отличие отExoPlayer).
- Ограничьте декодированные растровые изображения размером экрана в
- DRM:
- Добавлена новая перегрузка
OfflineLicenseHelper.newWidevineInstance, принимающаяMediaItem.DrmConfiguration, чтобы заголовки HTTP-запросов применялись правильно (#2169).
- Добавлена новая перегрузка
- Эффект:
- Добавьте
Presentation.createForShortSide(int), который создаетPresentation, чтобы самая короткая сторона всегда соответствовала заданному значению независимо от ориентации входных данных.
- Добавьте
- Мультиплексоры:
- Исправлена ошибка, из-за которой для аудиосемплов во фрагментированных файлах MP4 не устанавливались правильные флаги.
- Теперь API
writeSampleData()использует классBufferInfoвместоMediaCodec.BufferInfo. - Добавьте
Muxer.Factory#supportsWritingNegativeTimestampsInEditList(по умолчанию false).
- Расширение IMA:
- Исправлена ошибка, из-за которой ошибка загрузки в одном объявлении могла случайно сделать недействительной другую группу объявлений.
- Исправлена ошибка, из-за которой группы объявлений после окончания окна видео по запросу останавливали воспроизведение.
Группы объявлений, время начала которых выходит за пределы окна, больше не добавляются в очередь
MediaPeriodQueue(#2215).
- Сеанс:
- Исправлена ошибка, из-за которой игнорировались подключения от сторонних непривилегированных контроллеров Media3.
- Удалить проверку доступных команд при отправке пользовательских команд в устаревшую версию
MediaBrowserServiceCompat. Это соответствует поведению устаревших контроллеров и браузеров при подключении к устаревшему приложению. - Исправлена ошибка, из-за которой первая ошибка воспроизведения у проигрывателя неправильно обрабатывалась как постоянное специальное исключение. Это предотвращает восстановление приложения.
- Исправлена ошибка, из-за которой некоторые изменения контроллера, не обрабатываемые сеансом, могли вызывать
IllegalStateExceptions. - Исправлена ошибка, из-за которой действия контроллера, не обрабатываемые сеансом, могли привести к недопустимому состоянию контроллера.
- Исправлено предупреждение о нарушении небезопасного запуска StrictMode (#2330).
- Исправлена ошибка, из-за которой вызов
setSessionExtrasиз основного потока при запуске проигрывателя из другого потока приложения приводил кIllegalStateException(#2265). - Уведомление не показывается автоматически, если в проигрывателе настроены мультимедийные объекты, но они не подготовлены и не воспроизводятся (#2423https://github.com/androidx/media/issues/2423). Это поведение можно настроить с помощью
MediaSessionService.setShowNotificationForIdlePlayer. - Добавьте настраиваемый
PlaybackExceptionдля всех или выбранных контроллеров. - Исправлена ошибка, из-за которой перемотка трансляции на устройстве
MediaControllerмогла привести к ошибкеIllegalArgumentException. - Для прямых трансляций прекращена публикация позиции воспроизведения и возможность перемотки текущего элемента для контроллеров мультимедиа платформы, чтобы избежать артефактов позиционирования в интерфейсе Android Auto (и других контроллерах, использующих эту информацию из сеанса мультимедиа платформы) (#1758).
- Исправлена ошибка, из-за которой передача значения null в
getLibraryRootобъектаMediaBrowser, подключенного к устаревшему объектуMediaBrowserServiceCompat, приводила к ошибкеNullPointerException. - Исправлена ошибка, из-за которой при отправке настраиваемых действий, результата поиска или запроса getItem происходил сбой устаревшего приложения для сеансов с кодом
ClassNotFoundException. - Исправлена ошибка, из-за которой
MediaItem.LocalConfiguration.uriпередавался вMediaMetadataсеанса платформы. Чтобы намеренно поделиться URI и разрешить контроллерам повторно запрашивать медиаконтент, задайтеMediaItem.RequestMetadata.mediaUri.
- Интерфейс:
- Исправлена ошибка, из-за которой
PlayerSurfaceвнутри повторно используемых компонентов, таких какLazyColumn, работали некорректно (#2493). - Исправлена ошибка Compose, из-за которой возникала задержка между установкой начального состояния кнопки и наблюдением за изменением состояния (например, формы значка или включения). Теперь учитываются все изменения, внесенные в проигрыватель вне периода наблюдения (#2313).
- Добавьте хранилища состояния и composable-функции в модуль
media3-ui-composeдляSeekBackButtonStateиSeekForwardButtonState. - Добавлена поддержка режима перемотки ExoPlayer в
PlayerControlView. Если этот параметр включен, то при перетаскивании ползунка проигрыватель переходит в режим перемотки, при каждом движении ползунка выполняется вызовplayer.seekTo, а когда пользователь убирает палец с экрана, режим перемотки отключается. Интеграцию можно включить с помощью атрибутаtime_bar_scrubbing_enabled = trueв XML или методаsetTimeBarScrubbingEnabled(boolean)в Java/Kotlin. - Сделайте так, чтобы
PlayerSurfaceпринимал аргументPlayer, допускающий значение NULL.
- Исправлена ошибка, из-за которой
- Скачивания:
- Добавлена поддержка частичного скачивания для прогрессивных потоков. Приложения могут подготовить прогрессивный поток с помощью
DownloadHelperи запроситьDownloadRequestу помощника, указав временные позиции начала и конца медиафайла, которые должно охватывать скачивание. Возвращенный объектDownloadRequestсодержит диапазон байтов, с помощью которого можно создать объектProgressiveDownloaderи скачать контент. - Добавьте
DownloadHelper.Factory, которым заменяются статические методыDownloadHelper.forMediaItem(). - Добавьте
Factoryдля реализацийSegmentDownloader. - Добавлена поддержка частичного скачивания для адаптивных потоков. Приложения могут подготовить адаптивный поток с помощью
DownloadHelperи запроситьDownloadRequestу помощника, указав временные позиции начала и конца медиафайла, которые должно охватывать скачивание. Возвращенный объектDownloadRequestсодержит разрешенный диапазон дат, с помощью которого можно создать конкретный объектSegmentDownloaderи скачать соответствующий контент.
- Добавлена поддержка частичного скачивания для прогрессивных потоков. Приложения могут подготовить прогрессивный поток с помощью
- Расширение Cronet:
- Добавлена автоматическая обработка файлов cookie (#5975).
- Расширение HLS:
- Исправлена ошибка, из-за которой
HlsSampleStreamWrapperпытался выполнить поиск в буфере, когда в нем не было доступных фрагментов #2598. - Исправлена ошибка, из-за которой изменения в выборе трека после загрузки фрагментов с низкой задержкой и подсказок по предварительной загрузке могли привести к зависанию воспроизведения (#2299).
- Предотвращение чрезмерного количества перезагрузок за счет ожидания половины целевой продолжительности, когда сервер не учитывает
CAN-BLOCK-RELOAD=YES(#2317). - Исправлена ошибка, из-за которой воспроизведение останавливалось при запуске потока межстраничных объявлений перед рекламой в середине видео, а список объектов пытался разрешить не то объявление (#2558).
- Исправлена обработка плейлистов, чтобы в значениях атрибутов в строках, заключенных в кавычки, принимался символ
\f(перевод страницы) (#2420). - Добавлена поддержка обновления межстраничных объявлений с одинаковым идентификатором (#2427).
- Исправлена ошибка, из-за которой ошибки загрузки плейлиста иногда не распространялись, когда в трансляции заканчивались сегменты для загрузки (#2401https://github.com/androidx/media/issues/2401).
- Группировка субтитров по тегу NAME, аналогично тому, как уже группируются аудиодорожки (#1666).
- Поддержка X-ASSET-LIST и прямых трансляций с
HlsInterstitialsAdsLoader.
- Исправлена ошибка, из-за которой
- Расширение DASH:
- Исправлена ошибка, из-за которой набор для адаптации Trick Play объединялся с основным набором для адаптации, что приводило к созданию недопустимого элемента
TrackGroup(#2148). - Исправлена ошибка, из-за которой сокращение длительности периода DASH могло вызывать исключение, если образцы за пределами новой длительности уже были прочитаны конвейером рендеринга (#2440).
- Исправлена ошибка, из-за которой не выполнялась переадресация при использовании параметров запроса CMCD (#2475).
- Исправлена ошибка, из-за которой набор для адаптации Trick Play объединялся с основным набором для адаптации, что приводило к созданию недопустимого элемента
- Расширение RTSP:
- Добавлена поддержка пакета агрегации RTP для H265 в соответствии с RFC 7798#4.4.2 (#2413).
- Исправлена ошибка, из-за которой
RtspClientне использовал URI местоположения, указанный при обработке ответа HTTP 302 (#2398). - Добавлена поддержка синтаксического анализа для SessionDescriptions, содержащих строки с конечными пробелами (#2357).
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Исправлена ошибка, из-за которой
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChangeне влиял на расширения декодера аудио (#2258).
- Исправлена ошибка, из-за которой
- Расширение Cast:
- Инструменты для тестирования:
- Добавьте
advance(player).untilPositionAtLeastиuntilMediaItemIndexвTestPlayerRunHelper, чтобы проигрыватель переходил к указанной позиции. В большинстве случаев эти методы надежнее, чем существующие методыuntilPositionиuntilStartOfMediaItem. - Переместите модуль
FakeDownloaderвtest-utils-robolectric, чтобы использовать его в других тестах. - Удалены:
transformer.TestUtil.addAudioDecoders(String...),transformer.TestUtil.addAudioEncoders(String...)иtransformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). Для настройки теневых кодировщиков и декодеров используйтеShadowMediaCodecConfig. - Префикс exotest заменен на 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).
- MP4: анализировать
- Аудио:
- Исправлена ошибка, из-за которой при воспроизведении плейлиста с короткими видео могла зависать позиция (#1920).
- Сеанс:
- Уменьшено время ожидания агрегирования для обратных вызовов платформы
MediaSessionс 500 до 100 миллисекунд и добавлен экспериментальный метод установки, позволяющий приложениям настраивать это значение. - Исправлена ошибка, из-за которой уведомления появлялись снова после того, как пользователь их закрыл (#2302).
- Исправлена ошибка, из-за которой сеанс возвращал временную шкалу с одним элементом, когда упакованный проигрыватель был пуст. Это происходило, когда в упакованном проигрывателе не было
COMMAND_GET_TIMELINE, но былоCOMMAND_GET_CURRENT_MEDIA_ITEM, а сам проигрыватель был пустым (#2320). - Исправлена ошибка, из-за которой вызов
MediaSessionService.setMediaNotificationProviderигнорировался без уведомления после других взаимодействий с сервисом, напримерsetForegroundServiceTimeoutMs(#2305).
- Уменьшено время ожидания агрегирования для обратных вызовов платформы
- Интерфейс:
- Включите
PlayerSurfaceдля работы сExoPlayer.setVideoEffectsиCompositionPlayer. - Исправлена ошибка, из-за которой
PlayerSurfaceне удавалось перекомпоновать с новымPlayer.
- Включите
- Расширение HLS:
- Исправлена ошибка, из-за которой в
CmcdDataне задавалась длительность фрагмента для медиаконтента HLS, что приводило к сбою утверждения при обработке зашифрованных сегментов медиаконтента (#2312).
- Исправлена ошибка, из-за которой в
- Расширение RTSP:
- Добавлена поддержка URI со схемой RTSPT для настройки сеанса RTSP с использованием TCP (#1484).
- Расширение Cast:
- Добавлена поддержка метаданных плейлистов (#2235).
1.6.0
26 марта 2025 г.
Выпущены данные "androidx.media3:media3-*:1.6.0". Версия 1.6.0 содержит эти коммиты.
- Общая библиотека:
- Добавьте
AudioManagerCompatиAudioFocusRequestCompat, чтобы заменить эквивалентные классы вandroidx.media. - Обновите Kotlin с версии 1.9.20 до 2.0.20 и используйте плагин Compose Compiler Gradle. Библиотека KotlinX Coroutines обновлена с версии 1.8.1 до 1.9.0.
- Удалите метод
Format.toBundle(boolean excludeMetadata)и используйте вместо негоFormat.toBundle(). - Исправлена ошибка в
SimpleBasePlayer, из-за которой при установке новогоcurrentMediaItemIndexвStateпослеsetPlaylistсnullMediaMetadataне выполнялась повторная оценка метаданных (#1940). - Уровень доступа к
SimpleBasePlayer.Stateизменен с защищенного на общедоступный, чтобы упростить обработку обновлений в других классах (#2128).
- Добавьте
- ExoPlayer:
- Добавьте
MediaExtractorCompat– новый класс, который предоставляет функции, эквивалентные платформеMediaExtractor. - Добавлена экспериментальная поддержка предварительного прогрева ExoPlayer для воспроизведения с помощью
MediaCodecVideoRenderer. Вы можете настроитьDefaultRenderersFactoryчерезexperimentalSetEnableMediaCodecVideoRendererPrewarming, чтобы предоставить дополнительныйMediaCodecVideoRendererдляExoPlayer. Если этот параметр включен,ExoPlayerпредварительно обрабатывает видео последовательных мультимедийных объектов во время воспроизведения, чтобы уменьшить задержку при переходе между ними. - Уменьшите значения по умолчанию для
bufferForPlaybackMsиbufferForPlaybackAfterRebufferMsвDefaultLoadControlдо 1000 и 2000 мс соответственно. - Инициализируйте
DeviceInfoи громкость устройства асинхронно (если включено с помощьюsetDeviceVolumeControlEnabled). Эти значения недоступны сразу послеExoPlayer.Builder.build(), аPlayer.Listenerуведомляет об изменениях черезonDeviceInfoChangedиonDeviceVolumeChanged. - Идентификатор начального аудиосеанса больше не доступен сразу после создания проигрывателя. При необходимости вы можете прослушать исходное сообщение, используя
AnalyticsListener.onAudioSessionIdChanged. - При выборе видеодорожки учитывайте язык. По умолчанию выбирается основная видеодорожка, соответствующая языку выбранной аудиодорожки (если доступна). Языковые настройки для видео можно указать с помощью атрибута
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s). - Добавьте параметр
selectedAudioLanguageв методDefaultTrackSelector.selectVideoTrack(). - Добавьте параметр
retryCountв методыMediaSourceEventListener.onLoadStartedи соответствующие методыMediaSourceEventListener.EventDispatcher. - Исправлена ошибка, из-за которой элементы плейлиста или периоды в многопериодных потоках DASH с длительностью, не соответствующей фактическому контенту, могли вызывать зависание кадров в конце элемента (#1698).
- Переместить
BasePreloadManager.Listenerна верхний уровеньPreloadManagerListener. RenderersFactory.createSecondaryRendererможно использовать для предоставления дополнительных обработчиков для предварительного прогрева. Предварительный прогрев позволяет быстрее переключаться между мультимедийными объектами во время воспроизведения.- Включена отправка
CmcdDataдля запросов манифеста в форматах адаптивной потоковой передачи DASH, HLS и SmoothStreaming (#1951). - Добавьте
MediaCodecInfoкодека, который будет инициализирован вMediaCodecRenderer.onReadyToInitializeCodec(#1963). - Измените
AdsMediaSource, чтобы разрешить ростAdPlaybackStatesза счет добавления групп объявлений. Недопустимые изменения обнаруживаются и вызывают исключение. - Исправлена ошибка, из-за которой при переходе к контенту после рекламы в середине видео могли быстро показываться дополнительные кадры, предназначенные только для декодирования.
- Сделайте так, чтобы
DefaultRenderersFactoryдобавлял два экземпляраMetadataRenderer, чтобы приложения могли по умолчанию получать две разные схемы метаданных. - Повторно оценивать, нужно ли отменять текущую загрузку фрагмента, когда воспроизведение приостановлено (#1785).
- Добавьте параметр в
ClippingMediaSource, чтобы разрешить вырезание фрагментов в медиафайлах без возможности перемотки. - Исправлена ошибка, из-за которой перемотка с предварительным прогревом могла блокировать переход к следующему мультимедийному объекту.
- Исправлена ошибка, из-за которой
ExoPlayer.isLoading()оставалосьtrue, хотя переходило вSTATE_IDLEилиSTATE_ENDED(#2133). - Добавьте
lastRebufferRealtimeMsвLoadControl.Parameter(#2113).
- Добавьте
- Трансформатор:
- Добавьте поддержку трансмультиплексирования в альтернативные обратно совместимые форматы.
- Добавлена поддержка перекодирования и трансмультиплексирования формата Dolby Vision (профиль 8).
- Обновите параметры
VideoFrameProcessor.registerInputStreamиVideoFrameProcessor.Listener.onInputStreamRegistered, чтобы использоватьFormat. - Создавать статические метаданные HDR при использовании
DefaultEncoderFactory. - Включите поддержку диагностики платформы Android с помощью
MediaMetricsManager. Transformer передает платформе события редактирования и данные об эффективности, что позволяет получать информацию о производительности системы и сведения для отладки на устройстве. Google также может собирать эти данные, если пользователь устройства разрешил отправку данных об использовании и диагностике. Приложения могут отказаться от передачи данных для диагностики платформы в Transformer с помощьюTransformer.Builder.setUsePlatformDiagnostics(false). - Разделите
InAppMuxerнаInAppMp4MuxerиInAppFragmentedMp4Muxer.InAppMp4Muxerиспользуется для создания нефрагментированного файла MP4, аInAppFragmentedMp4Muxer– для создания фрагментированного файла MP4. - Переместите интерфейс
Muxerизmedia3-muxerвmedia3-transformer. - Добавьте
MediaProjectionAssetLoader, который предоставляет медиафайлы изMediaProjectionдля записи экрана, и добавьте поддержку записи экрана в демоприложение Transformer. - Добавьте
#getInputFormat()в интерфейсCodec. - По возможности переложите ответственность за освобождение
GlObjectsProviderна вызывающий объект вDefaultVideoFrameProcessorиDefaultVideoCompositor.
- Экстракторы:
- AVI: исправлена обработка файлов со сжатым аудио с постоянным битрейтом, в которых в заголовке потока хранится количество байтов, а не фрагментов.
- Исправлена обработка блоков NAL, длина которых выражена в 1 или 2 байтах (а не в 4).
- Исправлена ошибка
ArrayIndexOutOfBoundsExceptionв монтажных листах MP4, когда монтажный лист начинается с несинхронизированного кадра без предшествующего синхронизированного кадра (#2062). - Исправлена ошибка, из-за которой потоки TS могли зависать на некоторых устройствах (#2069).
- FLAC: добавлена поддержка 32-битных файлов FLAC. Ранее при попытке воспроизвести такие файлы возникала ошибка
IllegalStateException: Playback stuck buffering and not loading(#2197).
- Аудио:
- Исправлена ошибка, из-за которой метод
onAudioPositionAdvancingвызывался при приостановке воспроизведения, а не при его возобновлении. - Не обходить
SonicAudioProcessor, еслиSpeedChangingAudioProcessorнастроен с параметрами по умолчанию. - Исправлена ошибка
Sonic#getOutputSize(), из-за которойDefaultAudioSinkмог зависать. - Исправьте
MediaCodecAudioRenderer.getDurationToProgressUs()иDecoderAudioRenderer.getDurationToProgressUs(), чтобы при перемотке правильно сбрасывалась указанная продолжительность. - Сделать
androidx.media3.common.audio.SonicAudioProcessorокончательным. - Добавлена поддержка float PCM для
ChannelMappingAudioProcessorиTrimmingAudioProcessor.
- Исправлена ошибка, из-за которой метод
- Видео:
- Измените
MediaCodecVideoRenderer.shouldUsePlaceholderSurfaceна защищенный, чтобы приложения могли переопределять его для блокировки использования поверхностей-плейсхолдеров (#1905). - Добавлен экспериментальный синтаксический анализ зависимостей образцов
ExoPlayerAV1 для ускорения поиска. Включите ее с помощью нового APIDefaultRenderersFactory.experimentalSetParseAv1SampleDependencies. - Добавлен экспериментальный API
ExoPlayer, который позволяет удалять поздние входные буферы декодераMediaCodecVideoRenderer, не имеющие зависимостей. Включите его с помощьюDefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Исправлена ошибка, из-за которой проигрыватель без поверхности сразу переходил в состояние готовности и очень медленно декодировал ожидающие кадры (#1973). - Исключены устройства Xiaomi и OPPO из режима отсоединенной поверхности, чтобы избежать мерцания экрана (#2059).
- Измените
- Текст:
- Добавлена поддержка субтитров VobSub (#8260).
- Прекращена упреждающая загрузка всех файлов субтитров, настроенных с помощью
MediaItem.Builder.setSubtitleConfigurations. Теперь загружается только один файл, если он выбран в настройках дорожки (#1721). - TTML: добавлена поддержка ссылок на
tts:originиtts:extentс помощьюstyle(#2953). - Временные метки в файлах WebVTT и SubRip должны содержать ровно три десятичных знака. Ранее мы неправильно анализировали любое количество десятичных знаков, но всегда предполагали, что значение указано в миллисекундах, что приводило к неверным временным меткам (#1997).
- Исправлена ошибка, из-за которой воспроизведение зависало, если в плейлисте были обрезанные элементы с субтитрами CEA-608 или CEA-708.
- Исправлена ошибка
IllegalStateException, возникавшая, когда файл SSA содержал подсказку с нулевой продолжительностью (время начала и окончания совпадали) (#2052). - Подавление (и регистрация) ошибок синтаксического анализа субтитров, когда субтитры мультиплексируются в тот же контейнер, что и аудио и видео (#2052).
- Исправлена обработка многобайтовых символов UTF-8 в файлах WebVTT с использованием символов CR в конце строки (#2167).
- DRM:
- Исправлена ошибка
MediaCodec$CryptoException: Operation not supported in this configuration, возникавшая при воспроизведении контента ClearKey на устройствах с API < 27 (#1732).
- Исправлена ошибка
- Эффект:
- Функции
OverlaySettingsперенесены вStaticOverlaySettings. На основеOverlaySettingsможно создать подкласс, чтобы динамически настраивать оверлей.
- Функции
- Мультиплексоры:
MuxerExceptionперемещен из интерфейсаMuxer, чтобы избежать слишком длинного полного имени.- Метод
setSampleCopyEnabled()переименован вsetSampleCopyingEnabled()вMp4Muxer.BuilderиFragmentedMp4Muxer.Builder. Mp4Muxer.addTrack()иFragmentedMp4Muxer.addTrack()теперь возвращают идентификатор трекаintвместоTrackToken.Mp4MuxerиFragmentedMp4Muxerбольше не реализуют интерфейсMuxer.- Отключить пакетную обработку и копирование образцов
Mp4Muxerпо умолчанию. - Исправлена ошибка в
FragmentedMp4Muxer, из-за которой создавалось много фрагментов, когда записывалась только аудиодорожка.
- Сеанс:
- Сохранять состояние активной службы в течение 10 минут после приостановки, остановки или сбоя воспроизведения. Это позволяет пользователям возобновлять воспроизведение в течение этого времени ожидания, не рискуя столкнуться с ограничениями активных сервисов на различных устройствах. Обратите внимание, что вызов
player.pause()больше не может использоваться для остановки активной службы доstopSelf(). При переопределенииonTaskRemovedиспользуйтеMediaSessionService.pauseAllPlayersAndStopSelf(). - Уведомление остается видимым, когда воспроизведение останавливается или возникает ошибка. Уведомление удаляется, только если очистить плейлист или закрыть проигрыватель.
- Улучшена обработка действий ACTION_PLAY и ACTION_PAUSE в MediaSession на платформе Android. Теперь в соответствии с доступными командами устанавливается только одно из них. Также принимается ситуация, когда установлено только одно из этих действий.
- Добавьте
Contextв качестве параметра вMediaButtonReceiver.shouldStartForegroundService(#1887). - Исправлена ошибка, из-за которой вызов метода
Playerдля объектаMediaController, подключенного к устаревшему сеансу, приводил к потере изменений из ожидающего обновления. - Добавлена поддержка нулевых значений для
MediaSession.setSessionActivity(PendingIntent)(#2109). - Исправлена ошибка, из-за которой устаревшее уведомление оставалось видимым после очистки плейлиста (#2211).
- Сохранять состояние активной службы в течение 10 минут после приостановки, остановки или сбоя воспроизведения. Это позволяет пользователям возобновлять воспроизведение в течение этого времени ожидания, не рискуя столкнуться с ограничениями активных сервисов на различных устройствах. Обратите внимание, что вызов
- Интерфейс:
- Добавьте хранилища состояния и composable-функции в модуль
media3-ui-composeдляPlayerSurface,PresentationState,PlayPauseButtonState,NextButtonState,PreviousButtonState,RepeatButtonState,ShuffleButtonStateиPlaybackSpeedState.
- Добавьте хранилища состояния и composable-функции в модуль
- Скачивания:
- Исправлена ошибка в
CacheWriter, из-за которой источники данных оставались открытыми, а области кеша – заблокированными, если источник данных выдавал ошибкуException, отличную отIOException(#9760).
- Исправлена ошибка в
- Расширение HLS:
- Добавьте первую версию
HlsInterstitialsAdsLoader. Загрузчик объявлений считывает межстраничные объявления HLS из плейлиста медиаконтента HLS и сопоставляет их с объектомAdPlaybackState, который передается вAdsMediaSource. В первой версии поддерживаются только видео по запросу, передаваемые по протоколу HLS и имеющие атрибутыX-ASSET-URI. - Добавьте
HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Приложения могут использовать его для создания экземпляровAdsMediaSource, которые используютHlsInterstitialsAdsLoaderудобным и безопасным способом. - Добавлена обработка тега
SUPPLEMENTAL-CODECSиз плейлиста HLS для обнаружения форматов Dolby Vision (#1785). - Смягчено условие для поиска позиций синхронизации в потоке HLS (#2209).
- Добавьте первую версию
- Расширение DASH:
- Добавлена поддержка формата AC-4 Level-4 для DASH (#1898).
- Исправлена ошибка, возникавшая при расчете интервала обновления для вставки объявлений в прямые трансляции с несколькими периодами (#1698).
- Добавлена обработка атрибута
scte214:supplementalCodecsиз манифеста DASH для обнаружения форматов Dolby Vision (#1785). - Улучшена обработка переходов между периодами в прямых трансляциях, когда период содержит медиафрагменты, выходящие за пределы заявленной длительности периода (#1698).
- Исправлена ошибка, из-за которой наборы адаптации, помеченные как
adaptation-set-switching, но с разными языками или флагами ролей, объединялись (#2222).
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Добавлен модуль декодера MPEG-H, который использует встроенный декодер MPEG-H для декодирования аудио MPEG-H (#1826).
- Расширение MIDI:
- Добавьте экземпляры
AudioSinkиAudioRendererEventListenerвMidiRenderer.
- Добавьте экземпляры
- Расширение Cast:
- Зависимость
play-services-cast-frameworkобновлена до версии 21.5.0, чтобы устранить сбойFLAG_MUTABLEв приложениях, предназначенных для API 34 и более поздних версий, на устройствах с установленными, но отключенными сервисами Google Play (#2178).
- Зависимость
- Демонстрационное приложение:
- Добавьте в
demo-composeдополнительные кнопки и улучшите интеграцию сPlayerSurface, добавив поддержку масштабирования и затвора.
- Добавьте в
- Удалите устаревшие символы:
- Удалите устаревший метод
AudioMixer.create(). Используйте вместо негоDefaultAudioMixer.Factory().create(). - Удалите следующие устаревшие методы
Transformer.Builder:setTransformationRequest(), используйте вместо него правилаsetAudioMimeType(),setVideoMimeType()иsetHdrMode().setAudioProcessors(), задайте аудиопроцессор вEditedMediaItem.Builder.setEffects()и передайте его вTransformer.start().setVideoEffects(), задайте видеоэффект вEditedMediaItem.Builder.setEffects()и передайте его вTransformer.start().setRemoveAudio(), используйтеEditedMediaItem.Builder.setRemoveAudio(), чтобы удалить аудио изEditedMediaItem, переданного вTransformer.start().setRemoveVideo(), используйтеEditedMediaItem.Builder.setRemoveVideo(), чтобы удалить видео изEditedMediaItem, переданного вTransformer.start().setFlattenForSlowMotion(), используйтеEditedMediaItem.Builder.setFlattenForSlowMotion(), чтобы выровнятьEditedMediaItem, переданный вTransformer.start().setListener(), используйте вместо негоaddListener(),removeListener()илиremoveAllListeners().
- Удалите следующие устаревшие методы
Transformer.Listener:onTransformationCompleted(MediaItem), используйте вместо негоonCompleted(Composition, ExportResult).onTransformationCompleted(MediaItem, TransformationResult), используйте вместо негоonCompleted(Composition, ExportResult).onTransformationError(MediaItem, Exception), используйте вместо негоonError(Composition, ExportResult, ExportException).onTransformationError(MediaItem, TransformationException), используйте вместо негоonError(Composition, ExportResult, ExportException).onTransformationError(MediaItem, TransformationResult, TransformationException), используйте вместо негоonError(Composition, ExportResult, ExportException).onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), используйте вместо негоonFallbackApplied(Composition, TransformationRequest, TransformationRequest).
- Удалите устаревший класс
TransformationResult. Используйте вместо негоExportResult. - Удалите устаревший класс
TransformationException. Используйте вместо негоExportException. - Удалить устаревший
Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Используйте вместо негоTransformer.PROGRESS_STATE_NOT_STARTED. - Удалить устаревший
Transformer.setListener(). ИспользуйтеTransformer.addListener(),Transformer.removeListener()илиTransformer.removeAllListeners(). - Удалить устаревший
Transformer.startTransformation(). Используйте вместо негоTransformer.start(MediaItem, String). - Удалить устаревший
SingleFrameGlShaderProgram. Используйте вместо негоBaseGlShaderProgram. - Удалить
Transformer.flattenForSlowMotionИспользуйте вместо негоEditedMediaItem.flattenForSlowMotion. - Удалены следующие объекты:
ExoPlayer.VideoComponent,ExoPlayer.AudioComponent,ExoPlayer.TextComponentиExoPlayer.DeviceComponent. - Контакт (
androidx.media3.exoplayer.audio.SonicAudioProcessor) удален. - Удалены следующие устаревшие методы
DownloadHelper:- Конструктор
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), используйте вместо негоDownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList). getRendererCapabilities(RenderersFactory), эквивалентную функциональность можно получить, создавDefaultRendererCapabilitiesListсRenderersFactoryи вызвавDefaultRendererCapabilitiesList.getRendererCapabilities().- Удален метод
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). ИспользуйтеPlayerNotificationManager.setMediaSessionToken(MediaSession.Token)и передавайте(MediaSession.Token) compatToken.getToken().
- Конструктор
- Удалите устаревший метод
1.6.0-rc02
19 марта 2025 г.
Используйте стабильную версию 1.6.0.
1.6.0-rc01
12 марта 2025 г.
Используйте стабильную версию 1.6.0.
1.6.0-beta01
26 февраля 2025 г.
Используйте стабильную версию 1.6.0.
Версия 1.6.0-alpha03
6 февраля 2025 г.
Используйте стабильную версию 1.6.0.
Версия 1.6.0-alpha02
30 января 2025 г.
Используйте стабильную версию 1.6.0.
Версия 1.6.0-alpha01
20 декабря 2024 г.
Используйте стабильную версию 1.6.0.
Версия 1.5
Версия 1.5.1
19 декабря 2024 г.
Выпущены данные "androidx.media3:media3-*:1.5.1". Версия 1.5.1 содержит эти коммиты.
- ExoPlayer:
- Отключено использование асинхронной расшифровки в MediaCodec, чтобы избежать проблем с тайм-аутом кодека, о которых сообщалось в связи с этим API платформы (#1641).
- Экстракторы:
- MP3: воспроизведение больше не останавливается раньше времени, если оглавление фрейма
VBRIне охватывает все данные MP3 в файле (#1904).
- MP3: воспроизведение больше не останавливается раньше времени, если оглавление фрейма
- Видео:
- Откат использования
MediaCodecAdapterпредоставленных значений соотношения сторон пикселя при обработкеonOutputFormatChanged(#1371).
- Откат использования
- Текст:
- Исправлена ошибка в
ReplacingCuesResolver.discardCuesBeforeTimeUs, из-за которой подсказка, активная вtimeUs(началась раньше, но ещё не закончилась), неправильно отбрасывалась (#1939).
- Исправлена ошибка в
- Метаданные:
- Извлечение номеров дисков/треков и жанров из комментариев Vorbis в
MediaMetadata(#1958).
- Извлечение номеров дисков/треков и жанров из комментариев Vorbis в
Версия 1.5.0
27 ноября 2024 г.
Выпущены данные "androidx.media3:media3-*:1.5.0". Версия 1.5.0 содержит эти коммиты.
- Общая библиотека:
- Добавлен класс
ForwardingSimpleBasePlayer, который позволяет перенаправлять воспроизведение на другой проигрыватель с небольшими корректировками, обеспечивая при этом полную согласованность и обработку слушателей (#1183). - Замените метод
SimpleBasePlayer.State.playlistнаgetPlaylist(). - Добавьте переопределение для
SimpleBasePlayer.State.Builder.setPlaylist(), чтобы напрямую указатьTimelineи текущиеTracksиMetadataвместо создания структуры плейлиста. - Увеличьте
minSdkдо 21 (Android Lollipop). Это соответствует всем другим библиотекам AndroidX. - Добавьте артефакт
androidx.media3:media3-common-ktx, который предоставляет функции Kotlin, созданные на основе общей библиотеки. - Добавьте в библиотеку
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передаются только связанные ошибки загрузки, а ошибки синтаксического анализа игнорируются (это поведение по умолчанию).
- При новой обработке субтитров (во время извлечения) связанные ошибки синтаксического анализа (например, недопустимые данные субтитров) и загрузки (например, HTTP 404) передаются через обратные вызовы
- Исправлена ошибка, из-за которой элементы плейлиста или периоды в многопериодных потоках 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теперь может получатьnullSurfaceвconfigureи вызовы нового методаdetachOutputSurface, чтобы удалить ранее заданныйSurface, если кодек поддерживает это (MediaCodecInfo.detachedSurfaceSupported). - При обработке
onOutputFormatChangedиспользуются значения соотношения сторон пикселя, указанные вMediaCodecAdapter(#1371). - Добавлено временное решение проблемы с устройством Galaxy Tab S7 FE, из-за которой защищенные потоки H264 с частотой 60 кадров/с помечались как неподдерживаемые (#1619).
- Добавлено временное решение для кодеков, которые зависают после последнего фрагмента, не возвращая сигнал о конце потока.
- Текст:
- Добавлен настраиваемый
VoiceSpanи заполнен для диапазонов голоса WebVTT (#1632). - Обеспечен показ субтитров WebVTT в HLS с очень большими временными метками, которые превышают 64-битное значение
long, если они представлены в микросекундах и умножены на временную базу MPEG90,000(#1763). - Добавлена поддержка субтитров CEA-608 в контенте Dolby Vision (#1820).
- Исправлена ошибка, из-за которой зависало воспроизведение многопериодных потоков DASH, если были включены субтитры CEA-608 (#1863).
- Добавлен настраиваемый
- Метаданные:
- Назначьте тип
C.TRACK_TYPE_METADATAдорожкам, содержащим контент icy или vnd.dvb.ait.
- Назначьте тип
- Изображение:
- Добавьте
ExternallyLoadedImageDecoderдля упрощенной интеграции с внешними библиотеками загрузки изображений, такими как Glide или Coil.
- Добавьте
- DataSource:
- Добавлен класс
FileDescriptorDataSource– новыйDataSource, который можно использовать для чтения изFileDescriptor(#3757).
- Добавлен класс
- Эффект:
- Добавлен обходной путь
DefaultVideoFrameProcessorдля незначительного масштабированияSurfaceTexture.SurfaceTextureможет включать небольшое масштабирование, которое отсекает границу в 1 тексель по краю обрезанного буфера. Теперь это обрабатывается так, чтобы результат был ближе к ожидаемому. - Увеличить скорость воспроизведения на
DefaultVideoFrameProcessor.queueInputBitmap(). В результате экспорт видео из картинки с помощьюTransformerпроисходит быстрее.
- Добавлен обходной путь
- Расширение IMA:
- Исправлена ошибка, из-за которой очистка плейлиста могла привести к
ArrayIndexOutOfBoundsExceptionвImaServerSideAdInsertionMediaSource. - Исправлена ошибка, из-за которой при воспроизведении потоков с динамической вставкой объявлений на стороне сервера без видеорекламы в начале ролика после последней видеорекламы в середине ролика могло возникать исключение
ArrayIndexOutOfBoundsException(#1741).
- Исправлена ошибка, из-за которой очистка плейлиста могла привести к
- Сеанс:
- Добавьте
MediaButtonReceiver.shouldStartForegroundService(Intent), чтобы приложения могли подавлять команду воспроизведения, поступающую для возобновления воспроизведения, переопределяя этот метод. По умолчанию служба всегда запущена, и воспроизведение нельзя подавить, не вызвав сбой службы с ошибкойForegroundServiceDidNotStartInTimeException(#1528). - Исправлена ошибка, из-за которой специальные команды, отправленные из
MediaBrowser, передавались в вариант методаMediaSessionCompat.CallbackвместоMediaBrowserServiceCompatпри подключении к устаревшему сервису. Из-за этогоMediaBrowserне получал фактическое возвращаемое значение, отправленное устаревшим сервисом (#1474). - Обработка ошибки
IllegalArgumentException, которая возникает на устройствах некоторых производителей при настройке широковещательного приемника для намерений кнопок мультимедиа (#1730). - Добавьте кнопки команд для мультимедийных объектов. Это добавляет Media3 API для того, что было известно как
Custom browse actionsс устаревшей библиотекой сMediaBrowserCompat. Обратите внимание, что в Media3 командные кнопки для мультимедийных объектов доступны как дляMediaBrowser, так и дляMediaController. Подробнее о том, как реализовать собственные действия для просмотра… * Исправлена ошибка, из-за которой контроллер Media3 иногда не позволял приложению сеанса запустить активную службу после запросаplay(). - Ограничьте
CommandButton.Builder.setIconUri, чтобы принимались только URI контента. - Передавайте подсказки о подключении браузера Media3 в начальный
MediaBrowserCompatпри подключении к устаревшемуMediaBrowserCompat. Сервис может получать подсказки о подключении, переданные в качестве корневых подсказок при первом вызовеonGetRoot(). - Исправлена ошибка, из-за которой
MediaBrowser, подключенный к устаревшему сервису браузера, не получал ошибку, отправленную сервисом после того, как браузер подписался наparentid. - Улучшена совместимость, чтобы браузер Media3, подключенный к устаревшему
MediaBrowserService, не запрашивал дочерние элементыparentIdдважды при подписке на родительский элемент.
- Добавьте
- Интерфейс:
- Сделайте растянутое/обрезанное видео в обходном решении
PlayerView-in-Compose-AndroidViewнеобязательным из-за проблем с общими переходами на основе XML. Приложения, использующиеPlayerViewвнутриAndroidView, должны вызыватьPlayerView.setEnableComposeSurfaceSyncWorkaround, чтобы включить эту функцию (#1237, #1594). - Добавьте
setFullscreenButtonStateвPlayerView, чтобы разрешить обновление значка кнопки полноэкранного режима по запросу, то есть вне диапазона и не в ответ на клик (#1590, #184). - Исправлена ошибка, из-за которой вариант "Нет" в выборе текста не работал, если в приложении были заданы настройки выбора текстовых дорожек.
- Сделайте растянутое/обрезанное видео в обходном решении
- Расширение DASH:
- Добавлена поддержка периодов, начинающихся в середине сегмента (#1440).
- Расширение Smooth Streaming:
- Исправлена ошибка
Bad magic number for Bundle, возникавшая при воспроизведении потоков SmoothStreaming с текстовыми дорожками (#1779).
- Исправлена ошибка
- Расширение RTSP:
- Расширения декодера (FFmpeg, VP9, AV1 и т. д.):
- Добавлен модуль декодера IAMF, который обеспечивает поддержку воспроизведения файлов MP4, содержащих треки IAMF, с использованием нативной библиотеки libiamf для синтеза аудио.
- Воспроизведение возможно в стереоформате, а также в формате 5.1 с пространственным звучанием и отслеживанием движений головы (необязательно). Бинауральное воспроизведение пока не поддерживается.
- Добавлена поддержка страниц размером 16 КБ для расширений декодера на Android 15 (#1685).
- Добавлен модуль декодера IAMF, который обеспечивает поддержку воспроизведения файлов MP4, содержащих треки IAMF, с использованием нативной библиотеки libiamf для синтеза аудио.
- Расширение Cast:
- Останавливать очистку временной шкалы после отключения CastSession, чтобы приложение-отправитель могло возобновить воспроизведение на устройстве после отключения.
- Заполнять
DeviceInfoCastPlayer, когда предоставляетсяContext. Это позволяет связатьMediaSessionсRoutingSession, что необходимо для интеграции переключателя вывода (#1056).
- Инструменты для тестирования:
DataSourceContractTestтеперь включает тесты для проверки:- Входной поток
read positionобновлен. - Буфер вывода
offsetприменен правильно.
- Входной поток
- Демонстрационное приложение
- Устранены утечки памяти в демонстрационном приложении для коротких видео (#1839).
- Удалите устаревшие символы:
- Удалите устаревшие элементы
Player.hasPrevious,Player.hasPreviousWindow(). Используйте вместо негоPlayer.hasPreviousMediaItem(). - Удалите устаревший метод
Player.previous(). Используйте вместо негоPlayer.seekToPreviousMediaItem(). - Удалите устаревший метод
DrmSessionEventListener.onDrmSessionAcquired. - Удалите устаревшие конструкторы
DefaultEncoderFactory. Используйте вместо негоDefaultEncoderFactory.Builder.
- Удалите устаревшие элементы
Версия 1.5.0-rc02
19 ноября 2024 г.
Используйте стабильную версию 1.5.0.
Версия 1.5.0-rc01
13 ноября 2024 г.
Используйте стабильную версию 1.5.0.
Версия 1.5.0-beta01
30 октября 2024 г.
Используйте стабильную версию 1.5.0.
Версия 1.5.0-alpha01
10 сентября 2024 г.
Используйте стабильную версию 1.5.0.
Версия 1.4.0
Версия 1.4.1
27 августа 2024 г.
Выпущены данные "androidx.media3:media3-*:1.4.1". Версия 1.4.1 содержит эти коммиты.
- ExoPlayer:
- Экстракторы:
- MP3: исправлена ошибка
Searched too many bytes, из-за которой не игнорировались данные в конце файла, не относящиеся к MP3, на основе поля длины во фреймеInfo(#1480).
- MP3: исправлена ошибка
- Текст:
- TTML: исправлена обработка процентных значений
tts:fontSize, чтобы они правильно наследовались от родительских узлов с процентными значениямиtts:fontSize. - Исправлена ошибка в
IndexOutOfBoundsExceptionвLegacySubtitleUtil, возникавшая из-за неправильной обработки случая, когда запрошенное время начала вывода больше или равно времени последнего события вSubtitle(#1516).
- TTML: исправлена обработка процентных значений
- DRM:
- Исправлена ошибка
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLEна устройствах с API 31 и более поздних версий при воспроизведении контента L1 Widevine. Эта ошибка возникает из-за неполной реализации методаMediaDrm.requiresSecureDecoderфреймворка (#1603).
- Исправлена ошибка
- Эффект:
- Добавьте метод
release()вGlObjectsProvider.
- Добавьте метод
- Сеанс:
- Двойное нажатие на
KEYCODE_HEADSETHOOKтеперь выполняет действие "перейти к следующему", как описано в документации (#1493). - Обрабатывать
KEYCODE_HEADSETHOOKкак команду воспроизведения вMediaButtonReceiverпри принятии решения о том, следует ли игнорировать ее, чтобы избежатьForegroundServiceDidNotStartInTimeException(#1581).
- Двойное нажатие на
- Расширение RTSP:
- Пропуск недопустимых описаний медиафайлов при синтаксическом анализе SDP (#1087).
Версия 1.4.0
25 июля 2024 г.
Выпущены данные "androidx.media3:media3-*:1.4.0". Версия 1.4.0 содержит эти коммиты.
- Общая библиотека:
- Перенаправлять предполагаемые пустые вызовы перемотки в защищенные методы
BasePlayer.seekTo()иSimpleBasePlayer.handleSeek()вместо того, чтобы игнорировать их. Если вы реализуете эти методы в собственном проигрывателе, вам может потребоваться обработать дополнительные вызовы с помощьюmediaItemIndex == C.INDEX_UNSET. - Удалена зависимость компиляции от улучшенной десахаризации Java 8 (#1312).
- Убедитесь, что продолжительность, переданная в
MediaItem.Builder.setImageDurationMs(), игнорируется дляMediaItem, не являющегося изображением (как указано в документации). - Добавьте
Format.customData, чтобы хранить предоставленную приложением информацию об экземплярахFormat.
- Перенаправлять предполагаемые пустые вызовы перемотки в защищенные методы
- ExoPlayer:
- Добавьте
BasePreloadManager, который координирует предварительную загрузку для нескольких источников на основе приоритетов, определенных ихrankingData. Чтобы настроить его, расширьте этот класс. ДобавьтеDefaultPreloadManager, который используетPreloadMediaSourceдля предварительной загрузки медиафайлов из источников в память и целое числоrankingData, указывающее индекс элемента в интерфейсе. - Добавьте
PlayerIdв большинство методовLoadControl, чтобы реализацииLoadControlподдерживали несколько игроков. - Удалить
Buffer.isDecodeOnly()иC.BUFFER_FLAG_DECODE_ONLY. Устанавливать этот флаг не нужно, поскольку средства визуализации и декодеры будут пропускать буферы на основе временной метки. Специальные реализацииRendererдолжны проверять, составляет ли время буферизации не менееBaseRenderer.getLastResetPositionUs(), чтобы решить, следует ли показывать образец. Специальные реализацииSimpleDecoderмогут при необходимости проверятьisAtLeastOutputStartTimeUs()или помечать другие буферы с помощьюDecoderOutputBuffer.shouldBeSkipped, чтобы пропускать их. - Разрешить возвращать нулевое значение с помощью
TargetPreloadStatusControl.getTargetPreloadStatus(T), чтобы указать, что не нужно предварительно загружатьMediaSourceс заданнымrankingData. - Свойство
remove(MediaSource)добавлено в запросBasePreloadManager. - Добавьте
reset()вBasePreloadManager, чтобы освободить все удерживаемые источники, сохранив экземпляр менеджера предварительной загрузки. - Добавьте
ExoPlayer.setPriority()(иBuilder.setPriority()), чтобы определить значение приоритета, используемое вPriorityTaskManagerи для важности MediaCodec из API 35. - Исправлена проблема с обновлением времени последней буферизации, из-за которой в CMCD появлялся неверный ключ
bs(нехватка буфера) (#1124). - Добавьте
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource), чтобы указать, что источник загружен до конца. Это позволяетDefaultPreloadManagerи пользовательским реализациямPreloadMediaSource.PreloadControlпредварительно загружать следующий источник или выполнять другие действия. - Исправлена ошибка, из-за которой пропуск тишины в конце элементов мог вызывать исключение воспроизведения.
- Добавьте
clearвPreloadMediaSource, чтобы отменить период предварительной загрузки. - Добавлен новый код ошибки
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, который используется, когда ресурсы кодека задействуются для задач с более высоким приоритетом. - Теперь
AdsMediaSourceможет загружать видеорекламу в начале ролика до того, как будет завершена подготовка основного контента (#1358). - Исправлена ошибка, из-за которой воспроизведение переключалось на
STATE_ENDEDпри повторной подготовке многопериодной прямой трансляции DASH после того, как исходный период уже был удален из манифеста. - Переименуйте
onTimelineRefreshed()вonSourcePrepared()иonPrepared()вonTracksSelected()вPreloadMediaSource.PreloadControl. Также переименуйте IntDefs вDefaultPreloadManager.Stage. - Добавлена экспериментальная поддержка динамического планирования, чтобы лучше согласовывать работу с циклами пробуждения ЦП и задерживать пробуждение до тех пор, пока средства визуализации не смогут продолжить работу.
Вы можете включить эту функцию с помощью
experimentalSetDynamicSchedulingEnabled()при настройке экземпляра ExoPlayer. - Добавьте
Renderer.getDurationToProgressUs().Rendererможет реализовать этот метод, чтобы возвращать ExoPlayer длительность, на которую должно продвинуться воспроизведение, чтобы рендерер продолжил работу. ЕслиExoPlayerзадан с помощьюexperimentalSetDynamicSchedulingEnabled(), тоExoPlayerбудет вызывать этот метод при расчете времени для планирования рабочей задачи. - Добавьте
MediaCodecAdapter#OnBufferAvailableListener, чтобы получать оповещения о том, что входные и выходные буферы доступны для использованияMediaCodecRenderer.MediaCodecRendererбудет сигнализироватьExoPlayerпри получении этих обратных вызовов, и если дляExoPlayerзаданоexperimentalSetDynamicSchedulingEnabled(), тоExoPlayerбудет планировать свой рабочий цикл по мере того, как средства визуализации могут продвигаться вперед. - Используйте класс данных для методов
LoadControlвместо отдельных параметров. - Добавьте
ExoPlayer.isReleased(), чтобы проверить, был ли вызван методExoplayer.release(). - Добавлен параметр
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs(), позволяющий задать максимальную позицию, с которойseekToPrevious()переходит к предыдущему элементу (#1425). - Исправлены некоторые несоответствия фокуса аудио, например отсутствие отчетов о полной или временной потере фокуса, когда проигрыватель приостановлен (#1436).
- Исправлена потенциальная ошибка
IndexOutOfBoundsException, возникавшая, когда экстракторы сообщали о дополнительных треках после начального этапа подготовки (#1476). EffectsвExoPlayer.setVideoEffect()будет получать временные метки без смещения рендерера (#1098).- Исправлена потенциальная ошибка
IllegalArgumentExceptionпри обработке ошибки проигрывателя, которая возникала при упреждающем чтении другого элемента плейлиста (#1483).
- Добавьте
- Трансформатор:
- Добавьте
audioConversionProcessиvideoConversionProcessвExportResult, чтобы указать, как была создана соответствующая дорожка в выходном файле. - Смягчить проверку уровня H.264 при оптимизации обрезки.
- Добавлена поддержка переключения между входными медиафайлами SDR и HDR в последовательности.
- Добавлена поддержка аудиоэффектов на уровне композиции.
- Добавлена поддержка перекодирования изображений Ultra HDR в видео HDR.
- Исправлена ошибка, из-за которой
DefaultAudioMixerне выводит правильное количество байтов после сброса и повторного использования. - Устранена ошибка декодера, из-за которой количество аудиоканалов ограничивалось стерео при обработке входных данных PCM.
- При выборе дорожек в
ExoPlayerAssetLoaderигнорируйте ограничения на количество аудиоканалов, так как они применяются только при воспроизведении. - Замените интерфейс
androidx.media3.transformer.Muxerнаandroidx.media3.muxer.Muxerи удалитеandroidx.media3.transformer.Muxer. - Исправлена ошибка, из-за которой не загружались изображения HEIC из схем URI контента. (#1373).
- Чтобы улучшить синхронизацию аудио и видео, настройте длительность звуковой дорожки в
AudioGraphInput. - Удалить поле "
ExportResult.processedInputs". Если вы используете это поле для указания сведений о кодеке, то вместо него используйтеDefaultDecoderFactory.listener. В случае исключения кодека сведения о нем будут доступны вExportException.codecInfo.
- Добавьте
- Экстракторы:
- MPEG-TS: повторно внедрено изменение, обеспечивающее отрисовку последнего кадра за счет передачи последнего блока доступа потока в очередь выборки (#7909). Добавлены исправления, устраняющие проблемы, которые возникали только в потоках HLS с I-кадрами(#1150) и потоках HLS H.262 (#1126).
- MP3: размер данных из фрейма
Infoпредпочтительнее размера, указанного в базовом потоке (например, размера файла или заголовка HTTPContent-Length). Это позволяет исключить данные трейлера, которые не могут быть воспроизведены (например, обложку альбома), из расчетов поиска по постоянному битрейту, что делает поиск более точным (#1376). - MP3. Для вычисления среднего битрейта при поиске с постоянным битрейтом используется количество кадров и другие данные в кадре
Info(если он есть), а не экстраполяция битрейта кадра после кадраInfo, который может быть искусственно уменьшен, например кадрPCUT(#1376). - Исправлено извлечение аудиоформата PCM в контейнерах AVI.
- Аудио:
- Исправлены атрибуты кодирования DTS:X Profile 2 для сквозного воспроизведения (#1299).
- Для разгруженного воспроизведения сбросьте поле отслеживания завершения потока в
DefaultAudioSinkперед вызовомAudioTrack.stop(), чтобыAudioTrack.StreamEventCallback#onPresentationEndedправильно определял, когда все ожидающие данные были воспроизведены. - Исправлена ошибка в
SilenceSkippingAudioProcessor, из-за которой переходы между разными аудиоформатами (например, со стерео на моно) могли вызывать исключение процессора (#1352). - Реализуйте
MediaCodecAudioRenderer.getDurationToProgressUs(), чтобы ExoPlayer динамически планировал основной цикл работы, когда MediaCodecAudioRenderer может выполнять обработку.
- Видео:
- Исправлена ошибка, из-за которой
Listener.onRenderedFirstFrame()поступал слишком рано при переключении поверхностей во время воспроизведения. - Исправлена логика резервного декодера для Dolby Vision, чтобы при необходимости использовать совместимый декодер AV1 (#1389).
- Исправлена ошибка кодека, которая могла возникать при включении отрисовщика видео во время воспроизведения.
- Исправлена ошибка, из-за которой
- Текст:
- Исправлена ошибка, из-за которой субтитры, начинающиеся до позиции поиска, пропускались. Эта проблема появилась только в Media3 1.4.0-alpha01.
- Измените поведение синтаксического анализа субтитров по умолчанию, чтобы он выполнялся во время извлечения, а не во время рендеринга (см. схему архитектуры ExoPlayer, чтобы узнать разницу между извлечением и рендерингом).
- Это изменение можно переопределить, вызвав оба метода:
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)иTextRenderer.experimentalSetLegacyDecodingEnabled(true). Информацию о том, как добавить эти компоненты в экземплярExoPlayer, вы найдете в документации по настройке. Эти методы (и вся поддержка устаревшего декодирования субтитров) будут удалены в одном из будущих выпусков. - Если в приложении используется собственная реализация
SubtitleDecoder, ее нужно заменить наSubtitleParser(и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) неправильно сопоставлялись с тегами ID3TSO2,TSOAиTSOP(#1302). - Исправлено чтение числовых тегов MP4 (/iTunes)
gnre(жанр) иtmpo(темп), когда значение длиннее одного байта. - Передача фрейма ID3
TCONвMediaMetadata.genre(#1305).
- Исправлено сопоставление тегов сортировки MP4 и ID3. Ранее теги MP4 "album sort" (
- Изображение:
- Добавлена поддержка неквадратных сеток значков DASH (#1300).
- Добавлена поддержка AVIF для API 34 и более поздних версий.
- Разрешить использовать
nullв качестве параметра дляExoPlayer.setImageOutput(), чтобы очистить ранее заданное значениеImageOutput.
- DataSource:
- Реализуйте поддержку URI произвольных необработанных ресурсов
android.resource://package/id, гдеpackageотличается от пакета текущего приложения. Ранее этот способ не был задокументирован, но он позволяет получать доступ к ресурсам в другом пакете эффективнее, чем по названию. - Проверьте, что
urlне равно null в конструкторахDataSpec. Этот параметр уже был аннотирован как ненулевой. - Разрешено
ByteArrayDataSourceпреобразовывать URI в массив байтов во времяopen(), а не задавать его в коде при создании (#1405).
- Реализуйте поддержку URI произвольных необработанных ресурсов
- DRM:
- Добавлена возможность задавать
LoadErrorHandlingPolicyдляDefaultDrmSessionManagerProvider(#1271).
- Добавлена возможность задавать
- Эффект:
- Поддержка нескольких изменений скорости в одном
EditedMediaItemилиCompositionвSpeedChangeEffect. - Поддержка вывода HLG и PQ из входных данных растрового изображения Ultra HDR.
- Добавлена поддержка EGL_GL_COLORSPACE_BT2020_HLG_EXT, которая улучшает вывод поверхности HLG в ExoPlayer.setVideoEffect и 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внутри ComposeAndroidViewв API 34 (#1237).
- Добавлена поддержка показа изображений в
- Скачивания:
- Убедитесь, что
DownloadHelperне допускает утечки невыпущенных экземпляровRenderer, что может привести к сбою приложения с ошибкойIllegalStateException: Too many receivers, total of 1000, registered for pid(#1224).
- Убедитесь, что
- Расширение Cronet:
- Исправьте
SocketTimeoutExceptionвCronetDataSource. В некоторых версиях Cronet запрос, предоставляемый обратным вызовом, не всегда одинаков. В результате обратный вызов не завершается и время ожидания запроса истекает (https://issuetracker.google.com/328442628).
- Исправьте
- Расширение HLS:
- Исправлена ошибка, из-за которой ожидающие образцы EMSG, ожидающие разрыва, делегировались в
HlsSampleStreamWrapperс неправильным смещением, что приводило кIndexOutOfBoundsExceptionилиIllegalArgumentException(#1002). - Исправлена ошибка, из-за которой неосновные плейлисты постоянно перезагружались для трансляций LL-HLS (#1240).
- Исправлена ошибка, из-за которой включение CMCD для HLS с сегментами инициализации приводило к
Source ErrorиIllegalArgumentException. - Исправлена ошибка, из-за которой неосновные плейлисты не обновлялись во время трансляции (#1240).
- Исправлена ошибка, из-за которой включение CMCD для прямых трансляций HLS вызывало
ArrayIndexOutOfBoundsException(#1395).
- Исправлена ошибка, из-за которой ожидающие образцы EMSG, ожидающие разрыва, делегировались в
- Расширение DASH:
- Расширение Cast:
- Исправлена ошибка, из-за которой название альбома
MediaQueueItemпреобразовывалось в имя исполнителя в мультимедийном объекте Media3 (#1255).
- Исправлена ошибка, из-за которой название альбома
- Инструменты для тестирования:
- Реализуйте
onInit()иonRelease()вFakeRenderer. - Измените методы
TestPlayerRunHelper.runUntil()/playUntil(), чтобы они не выполнялись при некритических ошибках (например, тех, о которых сообщается вAnalyticsListener.onVideoCodecError()). Чтобы отключить это поведение, используйте новую цепочку методовTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX().
- Реализуйте
- Демонстрационное приложение:
- Используйте
DefaultPreloadManagerв демоприложении для коротких видео. - Добавлена возможность задавать режим повтора с помощью аргументов
Intentиз командной строки (#1266). - Используйте
HttpEngineDataSourceв качествеHttpDataSource, если устройство поддерживает эту функцию.
- Используйте
- Удалите устаревшие символы:
- Удалить
CronetDataSourceFactoryИспользуйте вместо негоCronetDataSource.Factory. - Удалите некоторые конструкторы
DataSpec. Используйте вместо негоDataSpec.Builder. - Удалите метод
setContentTypePredicate(Predicate)изDefaultHttpDataSource,OkHttpDataSourceиCronetDataSource. Вместо этого используйте эквивалентный метод для каждого объектаXXXDataSource.Factory. - Удалите конструкторы
OkHttpDataSourceиOkHttpDataSourceFactory. Используйте вместо негоOkHttpDataSource.Factory. - Удалить
PlayerMessage.setHandler(Handler)Используйте вместо негоsetLooper(Looper). - Удалить поле "
Timeline.Window.isLive". Вместо этого используйте методisLive(). - Удалите
DefaultHttpDataSourceконструктор. Используйте вместо негоDefaultHttpDataSource.Factory. - Удалить
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MSИспользуйте вместо негоDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS. - Удалить
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)Используйте вместо негоMediaCodecInfo.canReuseCodec(Format, Format). - Удалите методы
DrmSessionManager.DUMMYиgetDummyDrmSessionManager(). Используйте вместо негоDrmSessionManager.DRM_UNSUPPORTED. - Удалите
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format),AnalyticsListener.onVideoInputFormatChanged(EventTime, Format),AudioRendererEventListener.onAudioInputFormatChanged(Format),VideoRendererEventListener.onVideoInputFormatChanged(Format). Используйте перегрузки, которые принимаютDecoderReuseEvaluation. - Удалите IntDef
RendererSupport.FormatSupportи константыFORMAT_HANDLED,FORMAT_EXCEEDS_CAPABILITIES,FORMAT_UNSUPPORTED_DRM,FORMAT_UNSUPPORTED_SUBTYPE,FORMAT_UNSUPPORTED_TYPE. Используйте вместо них эквивалентные IntDef и константы вandroidx.media3.common.C(например,C.FORMAT_HANDLED). - Удалите интерфейс
Bundleable. В частности, будут удалены все постоянные поляBundleable.Creator<Foo> CREATOR. Вместо этого вызывающие объекты должны использовать методыBundle toBundle()иstatic Foo fromBundle(Bundle)для каждого типа.
- Удалить
Версия 1.4.0-rc01
10 июля 2024 г.
Используйте стабильную версию 1.4.0.
Версия 1.4.0-beta01
26 июня 2024 г.
Используйте стабильную версию 1.4.0.
Версия 1.4.0-alpha02
7 июня 2024 г.
Используйте стабильную версию 1.4.0.
Версия 1.4.0-alpha01
17 апреля 2024 г.
Используйте стабильную версию 1.4.0.
Версия 1.3.0
Версия 1.3.1
11 апреля 2024 г.
Выпущены данные "androidx.media3:media3-*:1.3.1". Версия 1.3.1 содержит эти фиксации.
- Общая библиотека:
- Добавьте
Format.labels, чтобы разрешить локализованные или другие альтернативные ярлыки.
- Добавьте
- ExoPlayer:
- Исправлена ошибка, из-за которой
PreloadMediaPeriodне может сохранить потоки при повторной предварительной загрузке. - При повторном выборе трека примените правильный
TrackSelectionResultк периоду воспроизведения. - Средства визуализации с ранним запуском теперь начинают работу только после перехода к следующему периоду воспроизведения при переключении между мультимедийными объектами (#1017).
- Добавлен отсутствующий тип возвращаемого значения в правило proguard
-keepclasseswithmembersдляDefaultVideoFrameProcessor.Factory.Builder.build()(#1187).
- Исправлена ошибка, из-за которой
- Трансформатор:
- Добавлен обходной путь для исключения, которое возникает из-за того, что
MediaMuxerне поддерживает отрицательные временные метки до API 30.
- Добавлен обходной путь для исключения, которое возникает из-за того, что
- Выбор дорожки:
DefaultTrackSelector: предпочтение отдается видеодорожкам с приемлемой частотой кадров (>=10 кадров/с) по сравнению с дорожками с более низкой или неустановленной частотой кадров. Это гарантирует, что проигрыватель выберет "настоящую" видеодорожку в файлах MP4, извлеченных из фото с движением, которые могут содержать две дорожки HEVC, одна из которых имеет более высокое разрешение, но очень небольшое количество кадров (#1051).
- Экстракторы:
- Исправлена ошибка, из-за которой при чтении фрагментов нечетного размера из файлов WAV не пропускалось заполнение (#1117).
- MP3: заполните поле
Format.averageBitrate, используя фреймы метаданных, напримерXINGиVBRI. - MPEG-TS: отменено изменение, которое должно было обеспечить отрисовку последнего кадра путем передачи последнего блока доступа потока в очередь выборки (#7909). Это связано с тем, что изменение вызывает новые проблемы с потоками HLS, содержащими только I-кадры (#1150), и потоками HLS H.262 (#1126).
- Аудио:
- Добавлена возможность восстановить средство визуализации, отключив разгрузку, если аудиодорожка не инициализируется в режиме разгрузки.
- Видео:
- Добавлено временное решение проблемы, из-за которой на Galaxy Tab S7 FE, Chromecast с Google TV и Lenovo M10 FHD Plus потоки H265 с частотой 60 кадров/с помечались как неподдерживаемые.
- Добавлено временное решение, которое обеспечивает рендеринг первого кадра при туннелировании, даже если устройство не делает это автоматически, как требуется API (#1169). (#966).
- Исправлена ошибка, из-за которой обработка информации о цвете HDR приводила к неправильной работе кодека и не позволяла переключаться между адаптивными форматами для видеодорожек SDR (#1158).
- Текст:
- WebVTT: предотвращено создание ложных дополнительных экземпляров
CuesWithTimingизWebvttParser.parse(#1177) при использовании непосредственно следующих друг за другом реплик.
- WebVTT: предотвращено создание ложных дополнительных экземпляров
- DRM:
- Устранена ошибка
NoSuchMethodError, которая могла возникать в фреймворкеMediaDrmвместоResourceBusyExceptionилиNotProvisionedExceptionна некоторых устройствах Android 14 (#1145).
- Устранена ошибка
- Эффект:
- Улучшено тональное отображение PQ в SDR за счет преобразования цветовых пространств.
- Сеанс:
- Интерфейс:
- Добавлена резервная функция, которая включает название языка звуковой дорожки, если
Localeне может определить отображаемое название (#988).
- Добавлена резервная функция, которая включает название языка звуковой дорожки, если
- Расширение DASH:
- Заполните все элементы
Labelиз манифеста вFormat.labels(#1054).
- Заполните все элементы
- Расширение RTSP:
- Пропуск пустых значений информации о сеансе (теги i) при синтаксическом анализе SDP (#1087).
- Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
- Отключите расширение MIDI как локальную зависимость по умолчанию, поскольку для него требуется настроить дополнительный репозиторий Maven. Пользователи, которым нужен этот модуль из локальной зависимости, могут включить его повторно.
Версия 1.3.0
6 марта 2024 г.
Выпущены данные "androidx.media3:media3-*:1.3.0". Версия 1.3.0 содержит эти коммиты.
- Общая библиотека:
- Реализуйте поддержку URI необработанных ресурсов
android.resource://package/[type/]name, гдеpackageотличается от пакета текущего приложения. В документации всегда было указано, что это работает, но правильно реализовано только сейчас. - Нормализуйте MIME-типы, заданные кодом приложения или считанные из медиафайлов, чтобы они были полностью в нижнем регистре.
- Определяйте объявления с помощью полного
MediaItem, а не одногоUriвAdPlaybackState. - Увеличьте значение
minSdkдо 19 (Android KitKat). Это соответствует всем остальным библиотекам AndroidX и необходимо для обновления до последних версий зависимостей AndroidX. - Заполняйте оба поля
artworkUriиartworkDataвMediaMetadata.Builder.populate(MediaMetadata), если хотя бы одно из них не равно null (#964).
- Реализуйте поддержку URI необработанных ресурсов
- ExoPlayer:
- Добавлены методы
PreloadMediaSourceиPreloadMediaPeriod, которые позволяют приложениям предварительно загружать источник медиаконтента с определенной начальной позиции перед воспроизведением.PreloadMediaSourceподготавливает источник медиаконтента к получениюTimeline, подготавливает и кеширует период в заданной начальной позиции, выбирает треки и загружает медиаданные для периода. Приложения управляют процессом предзагрузки, реализуяPreloadMediaSource.PreloadControl, и устанавливают предзагруженный источник в проигрыватель для воспроизведения. - Добавьте
ExoPlayer.setImageOutput, чтобы приложения могли задаватьImageRenderer.ImageOutput. - Теперь
DefaultRenderersFactoryпо умолчанию предоставляет проигрывателюImageRendererс нулевыми значениямиImageOutputиImageDecoder.Factory.DEFAULT. - Добавлена отправка события
Player.Listener.onPositionDiscontinuityпри пропуске тишины (#765). - Добавлена экспериментальная поддержка синтаксического анализа субтитров во время извлечения. Включить эту функцию можно с помощью
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(). - Поддержка адаптивных источников медиаконтента с помощью
PreloadMediaSource. - Реализуйте
HttpEngineDataSource,HttpDataSource, используя API HttpEngine. - Запретите создание подклассов
CompositeSequenceableLoader. Этот компонент ранее был расширяемым, но в библиотеке не было его подклассов. Настройки можно задать, обернув экземпляр с помощью шаблона декоратора и реализовав собственныйCompositeSequenceableLoaderFactory. - Исправлена ошибка, из-за которой повторение одного и того же времени приводило к удалению метаданных из этого элемента (#1007).
- Переименуйте методы
experimentalSetSubtitleParserFactoryвBundledChunkExtractor.FactoryиDefaultHlsExtractorFactoryвsetSubtitleParserFactoryи запретите передачуnull. Используйте новые методыexperimentalParseSubtitlesDuringExtraction(boolean), чтобы управлять поведением синтаксического анализа. - Добавлена поддержка настройки
SubtitleParser.Factory, используемого при извлечении. Для этого можно использоватьMediaSource.Factory.setSubtitleParserFactory(). - Добавить префикс источника ко всем полям
Format.id, сгенерированным изMergingMediaSource. Это помогает определить, какой источник создалFormat(#883). - Исправлено регулярное выражение, используемое для проверки названий ключей в пользовательских данных Common Media Client Data (CMCD). Теперь оно проверяет только наличие дефиса (#1028).
- Прекращено двойное кодирование параметров запроса CMCD (#1075).
- Добавлены методы
- Трансформатор:
- Добавлена поддержка выравнивания замедленных видео H.265/HEVC SEF.
- Увеличена скорость трансмультиплексирования, особенно при удалении видео.
- Добавьте API, чтобы выходной файл начинался с кадра видео. Это может сделать результат обрезки более совместимым с проигрывателями, которые не показывают первый кадр видео до его временной метки (#829).
- Добавлена поддержка оптимизации операций обрезки MP4-файлов с одним объектом.
- Добавьте поддержку, чтобы у кадра видео была первая временная метка в выходном файле. Исправлена ошибка, из-за которой выходные файлы начинались с черного кадра в проигрывателях на базе iOS (#829).
- Выбор дорожки:
- Добавьте
DefaultTrackSelector.selectImageTrack, чтобы включить выбор дорожки изображения. - Добавьте
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled, чтобы определить, нужно ли выбирать дорожку изображения, если доступны и дорожка изображения, и видеодорожка. Значение по умолчанию –false, то есть приоритет отдается выбору видеодорожки.
- Добавьте
- Экстракторы:
- Добавлен дополнительный синтаксический анализ AV1C в экстрактор MP4 для получения значений
ColorInfo.colorSpace,ColorInfo.colorTransferиColorInfo.colorRange(#692). - MP3: используйте постоянный битрейт (CBR) для поиска файлов с заголовком
Info(эквивалент CBR для заголовкаXing). Ранее мы использовали таблицу поиска из заголовкаInfo, но это приводило к менее точной перемотке, чем если бы мы игнорировали ее и предполагали, что файл имеет постоянный битрейт. - MPEG2-TS: добавлена поддержка DTS, DTS-LBR и DTS:X Profile2 (#275).
- Извлекайте типы аудио из дескрипторов TS и сопоставляйте их с флагами ролей, чтобы пользователи могли выбирать аудиодорожки (#973).
- Добавлен дополнительный синтаксический анализ AV1C в экстрактор MP4 для получения значений
- Аудио:
- Видео:
- Измените конструктор
MediaCodecVideoRenderer, который принимает аргументVideoFrameProcessor.Factory, и замените его конструктором, который принимает аргументVideoSinkProvider. Приложения, в которые нужно внедрить пользовательскийVideoFrameProcessor.Factory, могут создать экземплярCompositingVideoSinkProvider, использующий пользовательскийVideoFrameProcessor.Factory, и передать поставщика приемника видео вMediaCodecVideoRenderer.
- Измените конструктор
- Текст:
- Исправлена сериализация битовых карт, чтобы устранить ошибку
Tried to marshall a Parcel that contained Binder objectsпри использованииDefaultExtractorsFactory.setTextTrackTranscodingEnabled(#836). - CEA-708: игнорировать значение
rowLock. В спецификации CEA-708-E S-2023 указано, чтоrowLockиcolumnLockдолжны считаться истинными независимо от значений в потоке (поддержкаcolumnLockне реализована, поэтому фактически всегда считается ложной).
- Исправлена сериализация битовых карт, чтобы устранить ошибку
- Изображение:
- Добавлена поддержка значков DASH. Изображения в сетке обрезаются, и отдельные значки передаются в
ImageOutputнезадолго до времени показа.
- Добавлена поддержка значков DASH. Изображения в сетке обрезаются, и отдельные значки передаются в
- DRM:
- По умолчанию сразу воспроизводить незашифрованные фрагменты контента с DRM, даже если ключи для последующих зашифрованных фрагментов ещё не готовы. Это может привести к остановке воспроизведения, если ключи не будут готовы, когда позиция воспроизведения достигнет зашифрованных фрагментов (но ранее воспроизведение вообще не начиналось бы в этот момент). Это поведение можно отключить с помощью
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKeyилиDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.- Расширение IMA:
- Исправлена ошибка, из-за которой не воспроизводились объявления DASH и HLS без подходящего расширения имени файла.
- По умолчанию сразу воспроизводить незашифрованные фрагменты контента с DRM, даже если ключи для последующих зашифрованных фрагментов ещё не готовы. Это может привести к остановке воспроизведения, если ключи не будут готовы, когда позиция воспроизведения достигнет зашифрованных фрагментов (но ранее воспроизведение вообще не начиналось бы в этот момент). Это поведение можно отключить с помощью
- Сеанс:
- Отключено распознавание двойного нажатия для ТВ-приложений (#962).
- Исправлена ошибка, из-за которой
MediaItem.RequestMetadataс ненулевыми дополнительными данными не передавался между контроллерами мультимедиа и сеансами. - Добавьте конструктор в
MediaLibrarySession.Builder, который принимает толькоContextвместоMediaLibraryService.
- Расширение HLS:
- Уменьшите видимость
HlsMediaPeriodдо package-private. Этот тип не должен напрямую зависеть от внешних факторов пакета HLS. - Более эффективный переход к началу сегмента (#1031).
- Уменьшите видимость
- Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
- Декодер MIDI: игнорирование сообщений о событиях SysEx (#710).
- Инструменты для тестирования:
- Не приостанавливать воспроизведение в
TestPlayerRunHelper.playUntilPosition. Тест сохраняет воспроизведение в состоянии воспроизведения, но приостанавливает прогресс до тех пор, пока тест не сможет добавить утверждения и дальнейшие действия.
- Не приостанавливать воспроизведение в
- Демонстрационное приложение:
- Добавьте демонстрационный модуль коротких видео, чтобы показать, как использовать
PreloadMediaSourceдля коротких видео.
- Добавьте демонстрационный модуль коротких видео, чтобы показать, как использовать
Версия 1.3.0-rc01
22 февраля 2024 г.
Используйте стабильную версию 1.3.0.
Версия 1.3.0-beta01
7 февраля 2024 г.
Используйте стабильную версию 1.3.0.
Версия 1.3.0-alpha01
15 января 2024 г.
Используйте стабильную версию 1.3.0.
Версия 1.2.0
Версия 1.2.1
9 января 2024 г.
- ExoPlayer:
- Исправлена ошибка, из-за которой при ручной перемотке за пределы диапазона
LiveConfiguration.min/maxOffsetсмещение сбрасывалось наmin/maxOffset. - Исправлена ошибка, из-за которой макеты каналов OPUS и VORBIS были неправильными для 3, 5, 6, 7 и 8 каналов (#8396).
- Исправлена ошибка, из-за которой при выборе трека после перехода к началу трансляции она начиналась с позиции по умолчанию (#9347).
- Исправлена ошибка, из-за которой новые экземпляры
CmcdData.Factoryполучали отрицательные значения дляbufferedDurationUsиз источников фрагментов, что приводило кIllegalArgumentException(#888).
- Исправлена ошибка, из-за которой при ручной перемотке за пределы диапазона
- Трансформатор:
- Устранена проблема, из-за которой кодировщик выдавал ошибку во время настройки из-за высокой рабочей частоты.
- Экстракторы:
- Отмечайте дополнительные (невоспроизводимые) дорожки HEVC в фото с движением JPEG как
ROLE_FLAG_ALTERNATE, чтобы они не выбирались автоматически для воспроизведения из-за более высокого разрешения. - Исправлена ошибка, из-за которой неправильно определялись ключевые кадры для потоков TS H264 (#864).
- Исправлена оценка продолжительности потоков TS, которые длятся дольше 47 721 секунды (#855).
- Отмечайте дополнительные (невоспроизводимые) дорожки HEVC в фото с движением JPEG как
- Аудио:
- Исправлена обработка EOS для
SilenceSkippingAudioProcessorпри многократном вызове (#712).
- Исправлена обработка EOS для
- Видео:
- Добавлено временное решение проблемы, из-за которой на Galaxy Tab S7 FE, Chromecast с Google TV и Lenovo M10 FHD Plus потоки AVC с частотой 60 кадров/с помечались как неподдерживаемые (#693).
- Метаданные:
- Исправлена ошибка, из-за которой
MediaMetadataзаполнялся только из комментариев Vorbis с ключами в верхнем регистре (#876). - Добавлен перехват
OutOfMemoryErrorпри обработке очень больших фреймов ID3. Это позволяет продолжать воспроизведение без информации из тегов, а не прерывать его полностью.
- Исправлена ошибка, из-за которой
- DRM:
- Расширен обходной путь для ложного URL лицензии ClearKey
https://default.urlдо API 33+ (ранее обходной путь применялся только к API 33) (#837). - Исправлена ошибка
ERROR_DRM_SESSION_NOT_OPENED, возникавшая при переключении с зашифрованного контента на незашифрованный, если к проигрывателю не была подключена поверхность. Ошибка возникла из-за неправильного использования защищенного декодера для воспроизведения незащищенного контента.
- Расширен обходной путь для ложного URL лицензии ClearKey
- Сеанс:
- Специальные ключи и значения помещены в
MediaMetadataCompatдляMediaMetadata.extrasиMediaMetadata.extrasдляMediaMetadataCompat(#756, #802). - Исправлена трансляция
notifyChildrenChangedдля устаревших контроллеров (#644). - Исправлена ошибка, из-за которой установка отрицательного времени для отключенного таймера
setWhenуведомления приводила к сбою на некоторых устройствах (#903). - Исправлена ошибка
IllegalStateException, возникавшая, когда контроллер уведомлений мультимедиа не успевал подключиться к моменту запроса первого обновления уведомлений (#917).
- Специальные ключи и значения помещены в
- Интерфейс:
- Расширение DASH:
- Значение f800 в манифесте DASH теперь интерпретируется как 5 каналов для Dolby (#688).
- Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
- Расширение 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).
- Добавлена поддержка 24- и 32-битных PCM с прямым порядком байтов в MP4 и Matroska, а также синтаксический анализ кодировки PCM для
- Видео:
- Разрешить
MediaCodecVideoRendererиспользовать собственныйVideoFrameProcessor.Factory. - Исправлена ошибка, из-за которой первый кадр не мог быть обработан, если аудиопоток начинался с отрицательных временных меток (#291).
- Разрешить
- Текст:
- Удалить
ExoplayerCuesDecoderТекстовые дорожки сsampleMimeType = application/x-media3-cuesтеперь обрабатываются напрямую с помощьюTextRendererбез необходимости в экземпляреSubtitleDecoder.
- Удалить
- Метаданные:
MetadataDecoder.decodeбольше не будет вызываться для образцов, предназначенных только для декодирования, поскольку реализация в любом случае должна возвращать значение null.
- Эффект:
- Добавьте
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>), чтобы поставить в очередь входные данные битовой карты по временной метке. - Сделайте
VideoFrameProcessor.registerInputStream()неблокирующим. Приложения должны реализовыватьVideoFrameProcessor.Listener#onInputStreamRegistered(). - Параметры
frameRateиdurationUsдляVideoFrameProcessor.queueInputBitmapизменены наTimestampIterator.
- Добавьте
- Расширение IMA:
- Исправлена ошибка, из-за которой прямая трансляция DASH с несколькими периодами, не являющаяся первым элементом в плейлисте, могла вызывать исключение (#571).
- Освободите StreamManager перед вызовом
AdsLoader.destroy(). - Версия IMA SDK обновлена до 3.31.0.
- Сеанс:
- Для активной службы уведомлений задано поведение
FOREGROUND_SERVICE_IMMEDIATEвDefaultMediaNotificationProvider(#167). - Используйте только
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()выше API 31, чтобы избежать проблем с устаревшим API на устройствах Samsung (#167). - Используйте контроллер уведомлений мультимедиа в качестве прокси-сервера, чтобы задать доступные команды и настраиваемый макет, используемый для заполнения уведомления и сеанса платформы.
- Преобразуйте события кнопок мультимедиа, полученные
MediaSessionService.onStartCommand(), в Media3, а не направляйте их в сеанс платформы и обратно в Media3. Благодаря этому контроллер вызывающего абонента всегда является контроллером уведомлений мультимедиа, а приложения могут легко распознавать звонки, поступающие из уведомления, одинаковым образом на всех поддерживаемых уровнях API. - Исправлена ошибка, из-за которой
MediaController.getCurrentPosition()не продвигается при подключении к устаревшемуMediaSessionCompat. - Добавьте
MediaLibrarySession.getSubscribedControllers(mediaId)для удобства. - Переопределите
MediaLibrarySession.Callback.onSubscribe(), чтобы подтвердить доступность родительского идентификатора, на который подписан контроллер. Если все в порядке, подписка принимается и сразу же вызываетсяnotifyChildrenChanged(), чтобы сообщить об этом браузеру (#561). - Добавьте демонстрационный модуль сеанса для Automotive OS и включите демонстрацию сеанса для Android Auto.
- Не настраивайте очередь сеанса фреймворка, если
COMMAND_GET_TIMELINEнедоступен для контроллера уведомлений мультимедиа. Поскольку Android Auto выступает в качестве контроллера клиента, считывающего данные из сеанса фреймворка, кнопкаqueueв интерфейсе Android Auto не показывается (#339). - По умолчанию вместо
SimpleBitmapLoaderиспользуетсяDataSourceBitmapLoader(#271, #327). - Добавлен метод
MediaSession.Callback.onMediaButtonEvent(Intent), который позволяет приложениям переопределять обработку событий кнопок мультимедиа по умолчанию.
- Для активной службы уведомлений задано поведение
- Интерфейс:
- Добавьте реализацию
Player.Listenerдля устройств Wear OS, которая обрабатывает подавление воспроизведения из-заPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT, запуская системное диалоговое окно, позволяющее пользователю подключить подходящий аудиовыход (например, наушники Bluetooth). Воспроизведение автоматически возобновится, если подходящее устройство будет подключено в течение настраиваемого времени ожидания (по умолчанию – 5 минут).
- Добавьте реализацию
- Скачивания:
- Объявите тип активной службы "Синхронизация данных" для приложения "
DownloadService", чтобы обеспечить совместимость с Android 14. При использовании этого сервиса приложение также должно добавитьdataSyncкакforegroundServiceTypeв манифест и добавить разрешениеFOREGROUND_SERVICE_DATA_SYNC(#11239).
- Объявите тип активной службы "Синхронизация данных" для приложения "
- Расширение HLS:
- Обновление плейлиста трансляции HLS с интервалом, рассчитанным на основе времени начала последней загрузки, а не времени ее завершения (#663).
- Расширение DASH:
- Разрешить несколько одинаковых идентификаторов DASH в URL шаблона сегмента.
- Добавлена экспериментальная поддержка синтаксического анализа субтитров во время извлечения. В нем лучше поддерживается объединение перекрывающихся субтитров, в том числе устранение мерцания при переходе между сегментами субтитров. Включить эту функцию можно с помощью параметра
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()(#288).
- Расширение RTSP:
- Исправлено состояние гонки, которое могло приводить к ошибке
IndexOutOfBoundsExceptionпри возврате к TCP или зависанию воспроизведения в некоторых ситуациях. - Проверка состояния в настройке RTSP при возврате состояния загрузки
RtspMediaPeriod(#577). - Игнорирование специальных методов запроса RTSP в общедоступном заголовке ответа Options (#613).
- Использовать значение тайм-аута ответа на запрос настройки RTSP в интервале времени отправки запросов RTSP Options для поддержания активности (#662).
- Исправлено состояние гонки, которое могло приводить к ошибке
- Расширения декодера (FFmpeg, VP9, AV1, MIDI и т. д.):
- Выпущен модуль декодера MIDI, который обеспечивает поддержку воспроизведения стандартных MIDI-файлов с использованием библиотеки Jsyn для синтеза аудио.
- Добавьте
DecoderOutputBuffer.shouldBeSkipped, чтобы напрямую помечать выходные буферы, которые не нужно показывать. Этот вариант предпочтительнее, чемC.BUFFER_FLAG_DECODE_ONLY, поддержка которого будет прекращена. - Добавьте
Decoder.setOutputStartTimeUsиSimpleDecoder.isAtLeastOutputStartTimeUs, чтобы декодеры могли удалять образцы, предназначенные только для декодирования, до времени начала. Рекомендуем использовать его вместоBuffer.isDecodeOnly, поддержка которого будет прекращена. - Исправлена ошибка, из-за которой артефакт декодера MIDI не публиковался в репозитории Maven. Артефакт переименован в
media3-exoplayer-midi(#734).
- Расширение Leanback:
- Исправлена ошибка, из-за которой отключение поверхности могло вызвать
ArithmeticExceptionв коде Leanback (#617).
- Исправлена ошибка, из-за которой отключение поверхности могло вызвать
- Инструменты для тестирования:
- Сделайте
TestExoPlayerBuilderиFakeClockсовместимыми с тестами Espresso UI и Compose UI. Это исправляет ошибку, из-за которой воспроизведение продвигается недетерминированно во время взаимодействий с представлениями Espresso или Compose.
- Сделайте
- Удалите устаревшие символы:
- Удаление инструментов "
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)" и "TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)" ИспользуйтеComposition.Builder.setHdrMode(int)и передайтеCompositionвTransformer.start(Composition, String). - Удалите устаревший метод
DownloadNotificationHelper.buildProgressNotificationи используйте вместо него актуальный метод, который принимает параметрnotMetRequirements.
- Удаление инструментов "
Версия 1.2.0-rc01
1 ноября 2023 г.
Используйте стабильную версию 1.2.0.
Версия 1.2.0-beta01
19 октября 2023 г.
Используйте стабильную версию 1.2.0.
Версия 1.2.0-alpha02
29 сентября 2023 г.
Используйте стабильную версию 1.2.0.
Версия 1.2.0-alpha01
17 августа 2023 г.
Используйте стабильную версию 1.2.0.
Версия 1.1.0
Версия 1.1.1
16 августа 2023 г.
- Общая библиотека:
- Удалена случайно добавленная зависимость
multidexиз всех модулей (#499).
- Удалена случайно добавленная зависимость
- ExoPlayer:
- Исправлена ошибка в
PlaybackStatsListener, из-за которой после очистки плейлиста создавались ложныеPlaybackStats. - Добавлены дополнительные поля в журнал Common Media Client Data (CMCD): формат потоковой передачи (sf), тип потока (st), версия (v), максимальная скорость передачи данных (tb), продолжительность объекта (d), измеренная пропускная способность (mtp) и тип объекта (ot) (#8699).
- Исправлена ошибка в
- Аудио:
- Исправлена ошибка, из-за которой
Player.getState()не переходил вSTATE_ENDEDпри воспроизведении очень коротких файлов (#538).
- Исправлена ошибка, из-за которой
- Разгрузка аудио:
- Добавьте заголовок идентификатора Ogg и заголовок комментария к битовому потоку для воспроизведения Opus в соответствии с RFC 7845.
- Видео:
- H.265/HEVC: исправлена обработка информации о краткосрочных и долгосрочных опорных кадрах в SPS.
- Текст:
- CEA-608: изменена логика усечения подсказок, чтобы учитывался только видимый текст. Ранее отступ и табуляция учитывались при ограничении длины подсказки до 32 символов (что технически соответствовало спецификации) (#11019).
- Расширение IMA:
- Версия IMA SDK обновлена до 3.30.3.
- Сеанс:
- Добавьте специальный макет в состояние контроллера и предоставьте геттер для доступа к нему. При изменении пользовательского макета вызывается
MediaController.Listener.onCustomLayoutChanged. Приложения, которые хотят отправлять разные макеты разным контроллерам Media3, могут делать это вMediaSession.Callback.onConnectс помощьюAcceptedResultBuilder. Так макет будет доступен контроллеру, когда подключение завершится. - Исправлены случаи, когда
MediaLibraryServiceLegacyStubотправлял ошибку вResult, который не поддерживал это, что приводило кUnsupportedOperationException(#78). - Исправлена ошибка, из-за которой
PlayerWrapperсоздавалVolumeProviderCompat, определяяvolumeControlTypeс помощью устаревших команд (COMMAND_ADJUST_DEVICE_VOLUMEиCOMMAND_SET_DEVICE_VOLUME) и новых команд (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGSиCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).
- Добавьте специальный макет в состояние контроллера и предоставьте геттер для доступа к нему. При изменении пользовательского макета вызывается
Версия 1.1.0
5 июля 2023 г.
- Общая библиотека:
- Добавьте причину подавления для неподходящего аудиомаршрута и воспроизведите, когда будете готовы. Измените причину слишком долгого подавления. (#15).
- Добавьте команды в проигрыватель:
COMMAND_GET_METADATACOMMAND_SET_PLAYLIST_METADATACOMMAND_SET_DEVICE_VOLUME_WITH_FLAGSCOMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- Добавьте в Player перегруженные методы, которые позволяют пользователям указывать флаги громкости:
void setDeviceVolume(int, int)void increaseDeviceVolume(int)void decreaseDeviceVolume(int)void setDeviceMuted(boolean, int)
- Добавьте
BuilderдляDeviceInfoи прекратите поддержку существующего конструктора. - Добавьте
DeviceInfo.routingControllerId, чтобы указать идентификатор контроллера маршрутизации для удаленного воспроизведения. - Добавлен метод
Player.replaceMediaItem(s), позволяющий быстро добавлять и удалять элементы в одной и той же позиции (#8046).
- ExoPlayer:
- Разрешите ExoPlayer управлять громкостью устройства, только если пользователь явно дал на это согласие. Используйте
ExoPlayer.Builder.setDeviceVolumeControlEnabled, чтобы получить доступ к следующим возможностям:getDeviceVolume()isDeviceMuted()setDeviceVolume(int)иsetDeviceVolume(int, int)increaseDeviceVolume(int)иincreaseDeviceVolume(int, int)decreaseDeviceVolume(int)иdecreaseDeviceVolume(int, int)
- Добавьте
FilteringMediaSource, чтобы фильтровать доступные типы треков изMediaSource. - Добавлена поддержка включения данных Common Media Client Data (CMCD) в исходящие запросы адаптивных форматов потоковой передачи DASH, HLS и SmoothStreaming. Добавлены поля
br,bl,cid,rtpиsid(#8699). Структура и методы API:- По умолчанию ведение журнала CMCD отключено. Чтобы включить его, используйте
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory). - По умолчанию включены все ключи. Чтобы отфильтровать ключи, которые регистрируются, переопределите
CmcdConfiguration.RequestConfig.isKeyAllowed(String key). - Переопределите
CmcdConfiguration.RequestConfig.getCustomData(), чтобы включить ведение журнала специальных ключей.
- По умолчанию ведение журнала CMCD отключено. Чтобы включить его, используйте
- В манифест основного демоприложения добавлено дополнительное действие, которое упрощает запуск этого приложения с пользовательским файлом
*.exolist.json(#439). - Добавьте
ExoPlayer.setVideoEffects(), чтобы использоватьEffectво время воспроизведения видео. - Обновите
SampleQueue, чтобы хранитьsourceIdкакlong, а неint. Это изменяет сигнатуры общедоступных методовSampleQueue.sourceIdиSampleQueue.peekSourceId. - Добавьте параметры в методы
shouldStartPlaybackиonTracksSelectedклассаLoadControl, чтобы связать эти методы с соответствующим объектомMediaPeriod. - Измените сигнатуру
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), добавив параметр временной шкалы, который содержит периоды с UID, используемыми в качестве ключей в карте. Это необходимо, чтобы избежать проблем с параллельной обработкой в трансляциях с несколькими периодами. - Прекратить поддержку
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)иBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Вместо этого можно вызвать вариант методов безmediaTimeOffsetUs. Обратите внимание, что даже для устаревших вариантов смещение больше не добавляется кstartTimeUsиendTimeUsобъектовMediaLoadData, отправляемых диспетчером. - Переименуйте
ExoTrackSelection.blacklistвexcludeTrack, аisBlacklisted– вisTrackExcluded. - Исправлено несоответствие между
ExoPlayer.setMediaItem(s)иaddMediaItem(s)при вызове пустого плейлиста.
- Разрешите ExoPlayer управлять громкостью устройства, только если пользователь явно дал на это согласие. Используйте
- Трансформатор:
- Удалить
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)Используйте вместо него правилаExoPlayerAssetLoader.Factory(MediaSource.Factory)иTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory). - Удалить
Transformer.startTransformation(MediaItem, ParcelFileDescriptor) - Исправлена ошибка, из-за которой преобразование могло зависнуть (что приводило к тайм-ауту мультиплексора), если конец видеопотока был зафиксирован в момент, когда входной кадр ожидал обработки.
- Запрашивайте кодеки через
MediaCodecList, а не утилитыfindDecoder/EncoderForFormat, чтобы расширить поддержку. - Удалите конфигурацию B-кадров в
DefaultEncoderFactory, так как она не работает на некоторых устройствах.
- Удалить
- Выбор дорожки:
- Добавьте
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChangeкоторая по умолчанию отключена. Если включитьDefaultTrackSelector, то при изменении возможностей средства отрисовки будет запускаться выбор нового трека.
- Добавьте
- Экстракторы:
- Аудио:
- Исправлена ошибка, из-за которой не воспроизводились некоторые видео, если было включено туннелирование и активно
AudioProcessors, например при обрезке без пауз (#10847). - Инкапсулировать фреймы Opus в пакеты Ogg при прямом воспроизведении (разгрузка).
- Экстраполировать текущее местоположение во время сна с помощью планирования разгрузки.
- Добавьте
Renderer.release()иAudioSink.release(), чтобы освободить ресурсы в конце жизненного цикла проигрывателя. - Отслеживание изменений в возможностях аудио в
DefaultAudioSink. Добавьте обязательный параметрcontextв конструкторDefaultAudioSink, с помощью которогоDefaultAudioSinkбудет регистрироваться как прослушивательAudioCapabilitiesReceiverи обновлять свое свойствоaudioCapabilitiesпри получении информации об изменении функций. - Передача изменений в возможностях аудио через новое событие
onAudioCapabilitiesChangedв интерфейсеAudioSink.Listenerи новый интерфейсRendererCapabilities.Listener, который запускает событияonRendererCapabilitiesChanged. - Добавьте
ChannelMixingAudioProcessor, чтобы применить масштабирование или микширование к аудиоканалам. - Добавьте новое целочисленное значение
DISCARD_REASON_AUDIO_BYPASS_POSSIBLEвDecoderDiscardReasons, чтобы отключать декодер аудио, когда после изменения возможностей аудио можно использовать режим обхода. - Добавлена поддержка прямого воспроизведения для DTS Express и DTS:X (#335).
- Исправлена ошибка, из-за которой не воспроизводились некоторые видео, если было включено туннелирование и активно
- Видео:
- Сделайте так, чтобы
MediaCodecVideoRendererсообщал оVideoSizeс шириной и высотой, равными 0, когда средство визуализации отключено.Player.Listener.onVideoSizeChangedвызывается при измененииPlayer.getVideoSize(). Теперь размер видео ExoPlayer сMediaCodecVideoRendererимеет ширину и высоту 0, еслиPlayer.getCurrentTracksне поддерживает видео или размер поддерживаемой видеодорожки ещё не определен.
- Сделайте так, чтобы
- DRM:
- Ограничена видимость нескольких внутренних методов в
DefaultDrmSession, которые не должны вызываться за пределами пакета DRM:void onMediaDrmEvent(int)void provision()void onProvisionCompleted()onProvisionError(Exception, boolean)
- Ограничена видимость нескольких внутренних методов в
- Мультиплексор:
- Добавлена новая библиотека мультиплексора, которую можно использовать для создания файла контейнера MP4.
- Расширение IMA:
- Включите трансляции DASH с несколькими периодами для динамической вставки объявлений. Обратите внимание, что текущая реализация пока не поддерживает перемотку в прямых трансляциях (#10912).
- Исправлена ошибка, из-за которой в прямые трансляции вставлялась новая группа объявлений, поскольку рассчитанная позиция контента в последовательных хронологиях немного различалась.
- Сеанс:
- Добавьте вспомогательный метод
MediaSession.getControllerForCurrentRequest, чтобы получать информацию о контроллере, который в данный момент вызывает методPlayer. - Добавлен класс
androidx.media3.session.MediaButtonReceiver, позволяющий приложениям возобновлять воспроизведение с помощью событий кнопок мультимедиа, отправляемых, например, Bluetooth-гарнитурой (#167). - Добавлена реализация по умолчанию для
MediaSession.Callback.onAddMediaItems, чтобы запрашиваемыеMediaItemsможно было передавать вPlayer, если у них естьLocalConfiguration(например, URI) (#282). - Добавлены кнопки "Перейти к предыдущему" и "Перейти к следующему" в компактном режиме уведомлений медиа по умолчанию для Android 12 и более ранних версий (#410).
- Добавлена реализация по умолчанию для
MediaSession.Callback.onAddMediaItems, чтобы запрашиваемыеMediaItemsможно было передавать вPlayer, если у них естьLocalConfiguration(например, URI) (#282). - Добавлены кнопки "Перейти к предыдущему" и "Перейти к следующему" в компактном режиме уведомлений медиа по умолчанию для Android 12 и более ранних версий (#410).
- Добавьте вспомогательный метод
- Интерфейс:
- Добавьте методы Util
shouldShowPlayButtonиhandlePlayPauseButtonAction, чтобы создать собственные элементы интерфейса с кнопкой воспроизведения/паузы.
- Добавьте методы Util
- Расширение RTSP:
- Расширение DASH:
- Удалите смещение по времени из
MediaLoadData.startTimeMsиMediaLoadData.endTimeMsдля потоков DASH с несколькими периодами. - Исправлена ошибка, из-за которой повторная подготовка источника медиаконтента Dash с несколькими периодами приводила к
IndexOutOfBoundsException(#10838).
- Удалите смещение по времени из
- Расширение HLS:
- Добавьте
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), чтобы задать время ожидания инициализацииTimestampAdjusterдля потока загрузки. Если инициализация не завершится до истечения времени ожидания, будет выдана ошибкаPlaybackException, чтобы избежать бесконечной задержки воспроизведения. По умолчанию время ожидания равно нулю (#323).
- Добавьте
- Инструменты для тестирования:
- Проверьте, не зависит ли схема URI от регистра в
DataSourceContractTest.
- Проверьте, не зависит ли схема URI от регистра в
- Удалите устаревшие символы:
- Удалите конструкторы
DefaultAudioSinkи используйте вместо нихDefaultAudioSink.Builder. - Удалите
HlsMasterPlaylistи используйтеHlsMultivariantPlaylist. - Удалить
Player.stop(boolean)Вместо него используйтеPlayer.stop()иPlayer.clearMediaItems()(еслиreset– этоtrue). - Удалите два устаревших конструктора
SimpleCacheи используйте вместо них конструктор, который принимаетDatabaseProvider, чтобы повысить производительность. - Удалите конструктор
DefaultBandwidthMeterи используйте вместо негоDefaultBandwidthMeter.Builder. - Удалите конструкторы
DefaultDrmSessionManagerи используйте вместо нихDefaultDrmSessionManager.Builder. - Удалите два устаревших конструктора
HttpDataSource.InvalidResponseCodeExceptionи используйте конструктор, который принимает дополнительные поля(cause,responseBody), чтобы улучшить ведение журнала ошибок. - Удалите
DownloadHelper.forProgressive,DownloadHelper.forHls,DownloadHelper.forDashиDownloadHelper.forSmoothStreamingи используйте вместо нихDownloadHelper.forMediaItem. - Удалите устаревший конструктор
DownloadServiceи используйте вместо него конструктор, который позволяет указать параметрchannelDescriptionResourceId. - Удалите устаревшие строковые константы для наборов символов (
ASCII_NAME,UTF8_NAME,ISO88591_NAME,UTF16_NAMEиUTF16LE_NAME). Вместо них используйте наборы символов Kotlin из пакетаkotlin.text,java.nio.charset.StandardCharsetsилиcom.google.common.base.Charsets. - Удалите устаревший конструктор
WorkManagerSchedulerи используйте вместо него конструктор, который позволяет указать параметрContext. - Удалите устаревшие методы
createVideoSampleFormat,createAudioSampleFormat,createContainerFormatиcreateSampleFormat, которые использовались для создания экземпляра классаFormat. Для создания экземпляровFormatиспользуйтеFormat.Builder. - Удалите устаревшие методы
copyWithMaxInputSize,copyWithSubsampleOffsetUs,copyWithLabel,copyWithManifestFormatInfo,copyWithGaplessInfo,copyWithFrameRate,copyWithDrmInitData,copyWithMetadata,copyWithBitrateиcopyWithVideoSize. Вместо них используйтеFormat.buildUpon()и методы setter. - Удалите устаревший атрибут
ExoPlayer.retry()и используйте вместо негоprepare(). - Удалите устаревший конструктор
DefaultTrackSelectorс нулевым аргументом и используйте вместо негоDefaultTrackSelector(Context). - Удалите устаревший конструктор
OfflineLicenseHelperи используйте вместо негоOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher). - Удалите устаревший конструктор
DownloadManagerи используйте вместо него конструктор, который принимаетExecutor. - Удалите устаревшие конструкторы
Cueи используйте вместо нихCue.Builder. - Удалите устаревший конструктор
OfflineLicenseHelperи используйте вместо негоOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher). - Удалите четыре устаревших метода
AnalyticsListener:onDecoderEnabled, используйте вместо негоonAudioEnabledи/илиonVideoEnabled.onDecoderInitialized, используйте вместо негоonAudioDecoderInitializedи/илиonVideoDecoderInitialized.onDecoderInputFormatChanged, используйте вместо негоonAudioInputFormatChangedи/илиonVideoInputFormatChanged.onDecoderDisabled, используйте вместо негоonAudioDisabledи/илиonVideoDisabled.
- Удалите устаревшие атрибуты
Player.Listener.onSeekProcessedиAnalyticsListener.onSeekProcessedи используйте вместо нихonPositionDiscontinuityсDISCONTINUITY_REASON_SEEK. - Удалите
ExoPlayer.setHandleWakeLock(boolean)и используйте вместо негоsetWakeMode(int). - Удалите устаревший атрибут
DefaultLoadControl.Builder.createDefaultLoadControl()и используйте вместо негоbuild(). - Удалите устаревший атрибут
MediaItem.PlaybackPropertiesи используйте вместо негоMediaItem.LocalConfiguration. ПолеMediaItem.playbackPropertiesбольше не поддерживается. Теперь оно относится к типуMediaItem.LocalConfiguration.
- Удалите конструкторы
Версия 1.1.0-rc01
21 июня 2023 г.
Используйте стабильную версию 1.1.0.
Версия 1.1.0-beta01
7 июня 2023 г.
Используйте стабильную версию 1.1.0.
Версия 1.1.0-alpha01
10 мая 2023 г.
Используйте стабильную версию 1.1.0.
Версия 1.0.0
Версия 1.0.2
18 мая 2023 г.
Выпущены данные "androidx.media3:media3-*:1.0.2". Версия 1.0.2 содержит эти коммиты.
Этот выпуск соответствует ExoPlayer 2.18.7.
В этой версии внесены следующие изменения по сравнению с версией 1.0.1:
- Основная библиотека:
- Добавьте
Buffer.isLastSample(), чтобы указать, содержит лиBufferфлагC.BUFFER_FLAG_LAST_SAMPLE. - Исправлена ошибка, из-за которой последний кадр мог не отрисовываться, если последний образец с кадрами удалялся из очереди без считывания образца "конец потока". (#11079).
- Добавьте
- Экстракторы:
- Исправлена обработка H.265 SPS в файлах MPEG-TS за счет повторного использования логики обработки, которая уже применяется экстракторами RTSP и MP4 (#303).
- Текст:
- SSA: добавлена поддержка файлов UTF-16, если они начинаются с маркера последовательности байтов (#319).
- Сеанс:
- Исправлена ошибка, из-за которой
MediaControllerне обновляет доступные команды при подключении к устаревшему устройствуMediaSessionCompat, которое обновляет свои действия. - Исправлена ошибка, из-за которой
MediaLibraryServiceне возвращал значение null при вызове из системного интерфейса вCallback.onGetLibraryRootсparams.isRecent == trueв API 30 (#355). - Устранена утечка памяти
MediaSessionServiceилиMediaLibraryService(#346). - Исправлена ошибка, из-за которой одновременное обновление
Timelineи позиции вMediaSessionмогло привести к тому, чтоMediaControllerвыдавалIllegalStateException.
- Исправлена ошибка, из-за которой
Версия 1.0.1
18 апреля 2023 г.
Выпущены данные "androidx.media3:media3-*:1.0.1". Версия 1.0.1 содержит эти коммиты.
Этот выпуск соответствует ExoPlayer 2.18.6.
- Основная библиотека:
- Сброс переопределения целевой трансляции при переходе к позиции по умолчанию (#11051).
- Исправлена ошибка, из-за которой пустые потоки в медиаконтенте могли приводить к зависанию воспроизведения.
- Сеанс:
- Исправлена ошибка, из-за которой несколько идентичных элементов очереди, опубликованных устаревшим
MediaSessionCompat, приводили к исключению вMediaController(#290). - Добавлена отсутствовавшая переадресация
MediaSession.broadcastCustomCommandна устаревшийMediaControllerCompat.Callback.onSessionEvent(#293). - Исправлена ошибка, из-за которой вызов
MediaSession.setPlayerне обновлял доступные команды. - Исправлена ошибка, из-за которой экземпляры
TrackSelectionOverride, отправленные изMediaController, игнорировались, если они ссылались на группу сFormat.metadata(#296). - Исправлена ошибка, из-за которой для доступа к метаданным через устаревший
MediaSessionCompatтребовалось наличиеPlayer.COMMAND_GET_CURRENT_MEDIA_ITEM. - Исправлена ошибка, из-за которой экземпляры
MediaSessionв фоновом потоке приводили к сбоям при использовании вMediaSessionService(#318). - Исправлена ошибка, из-за которой библиотека объявляла получатель кнопки мультимедиа, даже если это не было предусмотрено приложением (#314).
- Исправлена ошибка, из-за которой несколько идентичных элементов очереди, опубликованных устаревшим
- DASH:
- Исправлена обработка пустых временных шкал сегментов (#11014).
- RTSP:
- Повторите попытку с TCP, если настройка RTSP с UDP не удалась и возникла ошибка RTSP 461 UnsupportedTransport (#11069).
Версия 1.0.0
22 марта 2023 г.
Выпущены данные "androidx.media3:media3-*:1.0.0". Версия 1.0.0 содержит эти коммиты.
Этот выпуск соответствует ExoPlayer 2.18.5.
Изменений по сравнению с версией 1.0.0-rc02 нет.
Версия 1.0.0-rc02
2 марта 2023 г.
Выпущены данные "androidx.media3:media3-*:1.0.0-rc02". Версия 1.0.0-rc02 содержит
эти коммиты.
Этот выпуск соответствует версии ExoPlayer 2.18.4.
- Основная библиотека:
- Скачивания:
- Добавлена возможность настраивать максимальную разницу во времени начала двух сегментов, которые нужно объединить, в
SegmentDownloaderи подклассах (#248).
- Добавлена возможность настраивать максимальную разницу во времени начала двух сегментов, которые нужно объединить, в
- Аудио:
- Видео:
- Сопоставьте формат HEVC HDR10 с
HEVCProfileMain10HDR10вместоHEVCProfileMain10. - Добавлено временное решение проблемы, из-за которой на Chromecast с Google TV и Lenovo M10 FHD Plus потоки AVC с частотой 60 кадров/с помечались как неподдерживаемые (#10898).
- Исправлены проблемы производительности при воспроизведении медиаконтента с частотой кадров, которая намного выше частоты обновления экрана.
- Сопоставьте формат HEVC HDR10 с
- Актеры:
- Исправлена временная ошибка
STATE_IDLEпри переходе между мультимедийными объектами (#245).
- Исправлена временная ошибка
- RTSP:
- Добавлена обработка исключения IllegalArgumentException, которое возникает при синтаксическом анализе недопустимых сообщений 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).
- При синтаксическом анализе атомов trak, если в таблице выборки (stbl) отсутствует обязательное описание выборки (stsd), выдавать
- Аудио:
- Используйте битрейт сжатого аудиоформата, чтобы рассчитать минимальный размер буфера для
AudioTrackпри прямом воспроизведении (сквозной передаче).
- Используйте битрейт сжатого аудиоформата, чтобы рассчитать минимальный размер буфера для
- Текст:
- Исправлена ошибка, из-за которой
TextRendererпередавал недопустимый (отрицательный) индекс вSubtitle.getEventTime, если файл субтитров не содержал подсказок. - SubRip: добавлена поддержка файлов UTF-16, если они начинаются с маркера последовательности байтов.
- Исправлена ошибка, из-за которой
- Метаданные:
- Выполнить синтаксический анализ нескольких значений, разделенных нулями, из фреймов ID3, как разрешено в ID3 v2.4.
- Добавьте
MediaMetadata.mediaType, чтобы указать тип контента или папки, описанных в метаданных. - Добавьте
MediaMetadata.isBrowsableвместоMediaMetadata.folderType. Поддержка типа папки будет прекращена в следующем выпуске.
- DASH:
- Добавлен полный синтаксический анализ для наборов адаптации изображений, включая количество фрагментов (#3752).
- Интерфейс:
- Исправлена устаревшая функция
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener), чтобы изменения видимости передавались зарегистрированному прослушивателю (#229). - Исправлен порядок элементов управления в центре проигрывателя в
PlayerViewпри использовании макета с направлением текста справа налево (#227).
- Исправлена устаревшая функция
- Сеанс:
- Добавлен абстрактный класс
SimpleBasePlayer, который помогает реализовать интерфейсPlayerдля пользовательских проигрывателей. - Добавлен вспомогательный метод для преобразования токена сеанса платформы в Media3
SessionToken(#171). - Используйте
onMediaMetadataChanged, чтобы запускать обновления медиасеанса платформы (#219). - Добавьте сеанс воспроизведения медиаконтента в качестве аргумента
getMediaButtons()вDefaultMediaNotificationProviderи используйте неизменяемые списки во избежание неясности (#216). - Добавьте прослушиватель обратного вызова
onSetMediaItems, чтобы изменять и задавать списокMediaItem, начальный индекс и позицию по сеансу перед настройкой проигрывателя (#156). - Исправлена ошибка, из-за которой двойное нажатие распознавалось для событий, не связанных с кнопками мультимедиа Bluetooth (#233).
- Повышена надежность
QueueTimelineв случае сомнительного состояния устаревшего сеанса (#241).
- Добавлен абстрактный класс
- Метаданные:
- Выполнить синтаксический анализ нескольких значений, разделенных нулями, из фреймов ID3, как разрешено в ID3 v2.4.
- Добавьте
MediaMetadata.mediaType, чтобы указать тип контента или папки, описанных в метаданных. - Добавьте
MediaMetadata.isBrowsableвместоMediaMetadata.folderType. Поддержка типа папки будет прекращена в следующем выпуске.
- Расширение Cast:
- Версия Cast SDK обновлена до 21.2.0.
- Расширение IMA:
- Удалите прослушиватель проигрывателя
ImaServerSideAdInsertionMediaSourceв потоке приложения, чтобы избежать проблем с потоками. - Добавьте свойство
focusSkipButtonWhenAvailableвImaServerSideAdInsertionMediaSource.AdsLoader.Builder, чтобы запрашивать фокусировку на кнопке пропуска на телевизорах, и по умолчанию задайте для него значение true. - Добавьте метод
focusSkipButton()вImaServerSideAdInsertionMediaSource.AdsLoader, чтобы программно запрашивать фокус на кнопке пропуска. - Версия IMA SDK обновлена до 3.29.0.
- Удалите прослушиватель проигрывателя
- Демонстрационное приложение:
- Добавлен запрос разрешения на уведомления о скачивании во время выполнения (#10884).
Версия 1.0.0-beta03
22 ноября 2022 г.
Выпущены данные "androidx.media3:media3-*:1.0.0-beta03". Версия 1.0.0-beta03 содержит эти коммиты.
Этот выпуск соответствует ExoPlayer 2.18.2.
- Основная библиотека:
- Добавьте
ExoPlayer.isTunnelingEnabled, чтобы проверить, включено ли туннелирование для выбранных треков (#2518). - Добавлен метод
WrappingMediaSource, упрощающий упаковку одного объектаMediaSource(#7279). - Очистить задний буфер, прежде чем воспроизведение остановится из-за нехватки памяти.
- Закройте блок doSomeWork в Tracing, когда разгрузка включена.
- Исправлена проблема с отслеживанием сеансов при быстрой перемотке в
PlaybackStatsListener(#180). - Отправка отсутствующего обратного вызова
onMediaItemTransitionпри вызовеseekToNextилиseekToPreviousв плейлисте с одним объектом (#10667). - Добавьте
Player.getSurfaceSize, который возвращает размер поверхности, на которой воспроизводится видео. - Исправлена ошибка, из-за которой удаление слушателей во время выпуска проигрывателя могло вызвать ошибку
IllegalStateException(#10758).
- Добавьте
- Сборка:
- Чтобы избежать ошибок компиляции, используйте минимальную версию
compileSdkVersion(#10684). - Не публикуйте блок, если он включен в другую сборку Gradle.
- Чтобы избежать ошибок компиляции, используйте минимальную версию
- Выбор дорожки:
- Если экран не поддерживает Dolby Vision, отдавайте предпочтение другим дорожкам. (#8944).
- Скачивания:
- Исправлена ошибка, из-за которой в
ProgressiveDownloaderмог возникнуть бесконечный цикл, если одновременно выполнялись скачивание и воспроизведение с одним и тем жеPriorityTaskManager(#10570). - Уведомление о скачивании появляется сразу (#183).
- Ограничено количество параллельных удалений скачанных файлов (не более одного), чтобы избежать создания лишних потоков (#10458).
- Исправлена ошибка, из-за которой в
- Видео:
- Если экран не поддерживает Dolby Vision, попробуйте альтернативный декодер. (#9794).
- Аудио:
- Используйте
SingleThreadExecutorдля освобождения экземпляровAudioTrack, чтобы избежать ошибок OutOfMemory при одновременном освобождении нескольких проигрывателей (#10057). - Добавляет
AudioOffloadListener.onExperimentalOffloadedPlaybackдля состояния разгрузки AudioTrack. (#134). - Сделайте
AudioTrackBufferSizeProviderобщедоступным интерфейсом. - Добавьте
ExoPlayer.setPreferredAudioDevice, чтобы задать предпочтительное устройство вывода аудио (#135). - Переименуйте
androidx.media3.exoplayer.audio.AudioProcessorвandroidx.media3.common.audio.AudioProcessor. - Сопоставление 8- и 12-канального аудио с масками каналов 7.1 и 7.1.4 соответственно во всех версиях Android (#10701).
- Используйте
- Метаданные:
- Теперь
MetadataRendererможно настроить так, чтобы метаданные отображались сразу, как только они станут доступны. Создайте экземпляр с помощьюMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), чтобы указать, будет ли средство визуализации выводить метаданные раньше или синхронно с позицией проигрывателя.
- Теперь
- DRM:
- Устранена ошибка в реализации ClearKey в Android 13, из-за которой возвращался непустой, но недействительный URL лицензии.
- Исправлена ошибка
setMediaDrmSession failed: session not opened, возникавшая при переключении между схемами DRM в плейлисте (например, с Widevine на ClearKey).
- Текст:
- CEA-608: обеспечена корректная обработка команд переключения сервисов в поле 2 (#10666).
- DASH:
- Анализ
EventStream.presentationTimeOffsetиз манифестов (#10460).
- Анализ
- Интерфейс:
- Использовать текущие переопределения проигрывателя в качестве набора настроек в
TrackSelectionDialogBuilder(#10429).
- Использовать текущие переопределения проигрывателя в качестве набора настроек в
- Сеанс:
- Обеспечьте выполнение команд в правильном порядке, даже если некоторые из них требуют асинхронного разрешения (#85).
- Добавьте
DefaultMediaNotificationProvider.Builder, чтобы построитьDefaultMediaNotificationProvider. Конструктор может настроить идентификатор уведомления, идентификатор канала уведомлений и название канала уведомлений, используемые поставщиком. Также добавьте методDefaultMediaNotificationProvider.setSmallIcon(int), чтобы задать маленький значок уведомлений. (#104). - Команды, отправленные до
MediaController.release(), больше не удаляются (#99). SimpleBitmapLoaderможет загружать растровые изображения из URIfile://(#108).- Исправлено утверждение, которое не позволяло
MediaControllerпропускать объявление в период (#122). - Когда воспроизведение заканчивается,
MediaSessionServiceостанавливается на переднем плане и появляется уведомление о перезапуске воспроизведения последнего воспроизведенного мультимедийного объекта (#112). - Не запускайте активную службу с отложенным намерением для паузы (#167).
- Вручную скрывайте значок, связанный с уведомлением, созданным
DefaultNotificationProviderв API 26 и API 27 (значок автоматически скрывается в API 28 и более поздних версиях) (#131). - Исправлена ошибка, из-за которой второе подключение связывателя от устаревшего MediaSession к Media3 MediaController вызывало исключения IllegalStateException (#49).
- RTSP:
- IMA:
- Добавлен тайм-аут для загрузки информации об объявлении, чтобы обрабатывать случаи, когда IMA SDK зависает при загрузке объявления (#10510).
- Исправлена ошибка, из-за которой можно было пропустить рекламу в середине видео, если перемотать его до конца (#10685).
- Правильно рассчитывать продолжительность окна для прямых трансляций с объявлениями, вставленными на стороне сервера, например IMA DAI (#10764).
- Расширение FFmpeg:
- Добавлены новые обязательные флаги для связывания библиотек FFmpeg с NDK 23.1.7779620 и более поздними версиями (#9933).
- Расширение AV1:
- Обновлена версия CMake, чтобы избежать несовместимости с последними выпусками Android Studio (#9933).
- Расширение Cast:
- Реализован метод
getDeviceInfo(), позволяющий идентифицироватьCastPlayerпри управлении воспроизведением с помощьюMediaController(#142).
- Реализован метод
- Трансформатор:
- Добавлен сторожевой таймер мультиплексора, который определяет, когда создание выходного образца происходит слишком медленно.
- Удалите устаревшие символы:
- Удалить
Transformer.Builder.setOutputMimeType(String)Эта функция удалена. Если используется мультиплексор по умолчанию, MIME-тип всегда будет MP4.
- Удалить
Версия 1.0.0-beta02
21 июля 2022 г.
Выпущены данные "androidx.media3:media3-*:1.0.0-beta02". Версия 1.0.0-beta02 содержит эти коммиты.
Этот выпуск соответствует версии ExoPlayer 2.18.1.
- Основная библиотека:
- Убедитесь, что изменение
ShuffleOrderс помощьюExoPlayer.setShuffleOrderприводит к вызовуPlayer.Listener#onTimelineChangedсreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED(#9889). - Для прогрессивных медиафайлов включайте в буферизованную позицию только выбранные треки (#10361).
- Добавлена возможность использовать собственный регистратор для всех выходных данных ExoPlayer (#9752).
- Исправлена реализация
setDataSourceFactoryвDefaultMediaSourceFactory, которая в некоторых случаях не работала (#116).
- Убедитесь, что изменение
- Экстракторы:
- DASH:
- Добавлена возможность извлекать URL лицензии ClearKey из манифестов (#10246).
- Интерфейс:
- Убедитесь, что TalkBack озвучивает выбранную скорость воспроизведения в меню элементов управления (#10298).
- RTSP:
- Добавлена обработка фрагментированных пакетов VP8 (#110).
- Расширение Leanback:
- Прослушивать изменения
playWhenReadyвLeanbackAdapter(10420).
- Прослушивать изменения
- Актеры:
Версия 1.0.0-beta01
16 июня 2022 г.
Выпущены данные "androidx.media3:media3-*:1.0.0-beta01". Версия 1.0.0-beta01
содержит эти коммиты.
Это соответствует выпуску ExoPlayer 2.18.0.
- Основная библиотека:
- Включить поддержку диагностики платформы Android через
MediaMetricsManager. ExoPlayer будет передавать платформе события воспроизведения и данные об эффективности, что позволит получать сведения о производительности системы и сведения для отладки на устройстве. Google также может собирать эти данные, если пользователь устройства разрешил отправку данных об использовании и диагностике. Приложения могут отказаться от передачи данных для диагностики платформы ExoPlayer с помощьюExoPlayer.Builder.setUsePlatformDiagnostics(false). - Исправлена ошибка, из-за которой треки сбрасывались слишком часто при использовании
MergingMediaSource, например при загрузке субтитров и изменении выбранных субтитров в середине воспроизведения (#10248). - Прекратить обнаружение сетей 5G-NSA в API 29 и 30. Для воспроизведения будет использоваться сеть 4G.
- Запретить передачу
nullвMediaSource.Factory.setDrmSessionManagerProviderиMediaSource.Factory.setLoadErrorHandlingPolicy. При необходимости можно явно передать экземплярыDefaultDrmSessionManagerProviderиDefaultLoadErrorHandlingPolicy. - Добавьте
MediaItem.RequestMetadata, чтобы представить метаданные, необходимые для воспроизведения медиаконтента, когда точныйLocalConfigurationнеизвестен. Также удалитеMediaMetadata.mediaUrl, так как теперь это включено вRequestMetadata. - Добавьте
Player.Command.COMMAND_SET_MEDIA_ITEM, чтобы игроки могли устанавливать один предмет.
- Включить поддержку диагностики платформы Android через
- Выбор дорожки:
- Объединить класс
TrackSelectionOverridesс классомTrackSelectionParametersи сделать классTrackSelectionOverrideклассом верхнего уровня. - Переименуйте
TracksInfoвTracks, аTracksInfo.TrackGroupInfo– вTracks.Group.Player.getCurrentTracksInfoиPlayer.Listener.onTracksInfoChangedтеперь называютсяPlayer.getCurrentTracksиPlayer.Listener.onTracksChanged. В частности, мы восстановили методPlayer.Listener.onTracksChanged, но с другими типами параметров. - Измените
DefaultTrackSelector.buildUponParametersиDefaultTrackSelector.Parameters.buildUpon, чтобы возвращатьDefaultTrackSelector.Parameters.Builderвместо устаревшегоDefaultTrackSelector.ParametersBuilder. - Добавьте
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities(включено по умолчанию). Если этот параметр включен,DefaultTrackSelectorбудет отдавать предпочтение аудиодорожкам, количество каналов в которых не превышает возможности вывода устройства. На мобильных устройствахDefaultTrackSelectorпредпочитает стерео- и моноформаты многоканальным, если только многоканальный формат не поддерживает пространственное звучание (Android 12L и более поздние версии) или не является форматом объемного звука Dolby. Кроме того, на устройствах, поддерживающих пространственное звучание,DefaultTrackSelectorбудет отслеживать изменения в свойствах 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.
- Измените
- Экстракторы:
- Интерфейс:
- Исправлена ошибка, из-за которой события не доставлялись в
OnClickListener, заданные вPlayerView, еслиuseController=false(#9605). Также исправьте передачу событий вOnLongClickListenerдля всех конфигураций представлений. - Исправлена ошибка, из-за которой последовательность событий касания, выходящих за границы
PlayerViewдоACTION_UP, ошибочно обрабатывалась как клик (#9861). - Исправлена ошибка специальных возможностей
PlayerView, из-за которой нажатие могло переключать воспроизведение, а не скрывать элементы управления (#8627). - Перепишите
TrackSelectionViewиTrackSelectionDialogBuilder, чтобы они работали с интерфейсомPlayer, а неExoPlayer. Это позволяет использовать представления с другими реализациямиPlayerи устраняет зависимость модуля пользовательского интерфейса от модуля ExoPlayer. Это критическое изменение. - Скрывать принудительные субтитры в селекторе дорожек
PlayerViewи оставлять подходящую дорожку с принудительными субтитрами, если выбрано "Нет" (#9432).
- Исправлена ошибка, из-за которой события не доставлялись в
- DASH:
- Анализ количества каналов из элементов DTS
AudioChannelConfiguration. Это позволяет повторно включить сквозную передачу аудио для потоков DTS (#10159). - Запретить передачу
nullвDashMediaSource.Factory.setCompositeSequenceableLoaderFactory. При необходимости экземплярыDefaultCompositeSequenceableLoaderFactoryможно передавать явным образом.
- Анализ количества каналов из элементов DTS
- HLS:
- Если атрибут CODECS плейлиста не содержит аудиокодек, то выполняется переход к подготовке фрагментов (#10065).
- Запретить передачу
nullвHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory,HlsMediaSource.Factory.setPlaylistParserFactoryиHlsMediaSource.Factory.setPlaylistTrackerFactory. При необходимости можно явно передать экземплярыDefaultCompositeSequenceableLoaderFactory,DefaultHlsPlaylistParserFactoryили ссылку наDefaultHlsPlaylistTracker.FACTORY.
- Smooth Streaming:
- Запретить передачу
nullвSsMediaSource.Factory.setCompositeSequenceableLoaderFactory. При необходимости экземплярыDefaultCompositeSequenceableLoaderFactoryможно передавать явным образом.
- Запретить передачу
- RTSP:
- Добавлен считыватель RTP для H263 (#63).
- Добавлен считыватель RTP для MPEG4 (#35).
- Добавлена программа чтения RTP для HEVC (#36).
- Добавлен считыватель RTP для AMR. В настоящее время поддерживаются только одноканальные потоки AMR без чередования. Составная полезная нагрузка 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).
- Обновите CMake до версии
- Удалите устаревшие символы:
- Удалить
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)Используйте вместо негоPlayer.Listener.onTracksChanged(Tracks). - Удалите
Player.getCurrentTrackGroupsиPlayer.getCurrentTrackSelections. Используйте вместо негоPlayer.getCurrentTracks. Вы также можете продолжать использоватьExoPlayer.getCurrentTrackGroupsиExoPlayer.getCurrentTrackSelections, хотя эти методы по-прежнему считаются устаревшими. - Удалите константы
DownloadHelper,DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTиDEFAULT_TRACK_SELECTOR_PARAMETERS. По возможности используйтеgetDefaultTrackSelectorParameters(Context), в противном случае –DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT. - Удалить конструктор "
DefaultTrackSelector(ExoTrackSelection.Factory)". Используйте вместо негоDefaultTrackSelector(Context, ExoTrackSelection.Factory). - Удалить
Transformer.Builder.setContextВместо этогоContextнужно передать в конструкторTransformer.Builder.
- Удалить
Версия 1.0.0-alpha03
14 марта 2022 г.
Выпущены данные "androidx.media3:media3-*:1.0.0-alpha03". Версия 1.0.0-alpha03 содержит эти коммиты.
Это соответствует выпуску ExoPlayer 2.17.1.
- Аудио:
- Исправлена ошибка, возникавшая при проверке поддержки Dolby Atmos (E-AC3-JOC) в HLS.
- Экстракторы:
- FMP4: исправлена ошибка, из-за которой метаданные семплов emsg могли выводиться в неправильном порядке для потоков, содержащих атомы emsg версий 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).
- Экстракторы:
- Текст:
- Добавлено поле
MediaItem.SubtitleConfiguration.id, которое распространяется на полеFormat.idдорожки субтитров, созданной на основе конфигурации (#9673). - Добавлена базовая поддержка субтитров WebVTT в контейнерах Matroska (#9886).
- Запретить
Cea708Decoderсчитывать данные, размер которых превышает заявленный размер блока сервиса.
- Добавлено поле
- DRM:
- Удалить данные об устройстве "
playbackLooper" из аккаунтаDrmSessionManager.(pre)acquireSession? Если приложение используетDrmSessionManagerв пользовательскомMediaSource, то вместо этого вDrmSessionManager.setPlayerнужно передатьplaybackLooper.
- Удалить данные об устройстве "
- Воспроизведение объявлений / IMA:
- Добавлена поддержка динамической вставки объявлений IMA (#8213).
- Добавлен метод в
AdPlaybackState, позволяющий сбрасывать группу объявлений, чтобы ее можно было воспроизвести снова (#9615). - Принудительно устанавливать скорость воспроизведения 1.0 во время показа рекламы (#9018).
- Исправлена ошибка, из-за которой группа объявлений, которую не удалось загрузить, вызывала немедленный сброс воспроизведения (#9929).
- Интерфейс:
- DASH:
- Добавьте обработанные основные и дополнительные свойства в
Representation(#9579). - Добавлена поддержка роли дорожки
forced-subtitle(#9727). - Прекратить интерпретировать роль дорожки
mainкакC.SELECTION_FLAG_DEFAULT. - Исправлена логика исключения базового URL для манифестов, в которых не объявлено пространство имен DVB (#9856).
- Добавлена поддержка относительных URL
MPD.Location(#9939).
- Добавьте обработанные основные и дополнительные свойства в
- HLS:
- Исправлено заполнение
Format.labelдля аудиопотоков HLS (#9608). - По умолчанию использовать подготовку без фрагментов, чтобы сократить время запуска. Если в ваших версиях есть мультиплексированные дорожки субтитров, которые не объявлены в главном плейлисте, добавьте их в него, чтобы они были доступны для воспроизведения, или отключите подготовку без фрагментов с помощью параметра
HlsMediaSource.Factory.setAllowChunklessPreparation(false). - Добавлена поддержка точного поиска по ключевым кадрам в HLS (#2882).
- Исправлено заполнение
- RTSP:
- Добавлен клиентский API, позволяющий переопределять
SocketFactory, используемый для любого подключения к серверу (#9606). - Если доступны оба метода аутентификации, DIGEST и BASIC, предпочтение отдается DIGEST (#9800).
- Добавлена обработка ситуаций, когда недоступны временные метки дорожки RTSP (#9775).
- Игнорирование недопустимых значений заголовка RTP-Info (#9619).
- Добавлен клиентский API, позволяющий переопределять
- Трансформатор:
- Минимальная требуемая версия API повышена до 21.
TransformationExceptionтеперь используется для описания ошибок, возникающих во время преобразования.- Добавьте
TransformationRequest, чтобы указать параметры преобразования. - Разрешить регистрацию нескольких прослушивателей.
- Исправлена ошибка, из-за которой Transformer зависал, когда выходные данные кодека считывались частично.
- Исправлена потенциальная ошибка NPE в
Transformer.getProgress, когда освобождение мультиплексора вызывает исключение. - Добавьте демонстрационное приложение для применения преобразований.
- Расширение MediaSession:
- По умолчанию
MediaSessionConnectorтеперь очищает плейлист при остановке. Приложения, которые хотят сохранить плейлист, могут вызватьsetClearMediaItemsOnStop(false)в коннекторе.
- По умолчанию
- Расширение Cast:
- Расширение FFmpeg:
- Сделано так, чтобы
build_ffmpeg.shзависел от 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).
- Обновите расширение Cast, чтобы оно зависело от
- Удалите устаревшие символы:
- Удалить
Player.EventListenerИспользуйте вместо негоPlayer.Listener. - Удалить
MediaSourceFactory#setDrmSessionManager,MediaSourceFactory#setDrmHttpDataSourceFactoryиMediaSourceFactory#setDrmUserAgent. Используйте вместо негоMediaSourceFactory#setDrmSessionManagerProvider. - Удалить
MediaSourceFactory#setStreamKeysИспользуйте вместо негоMediaItem.Builder#setStreamKeys. - Удалить
MediaSourceFactory#createMediaSource(Uri)Используйте вместо негоMediaSourceFactory#createMediaSource(MediaItem). - Удалить
setTagизDashMediaSource,HlsMediaSourceиSsMediaSource. Используйте вместо негоMediaItem.Builder#setTag. - Удалить
DashMediaSource#setLivePresentationDelayMs(long, boolean)ИспользуйтеMediaItem.Builder#setLiveConfigurationиMediaItem.LiveConfiguration.Builder#setTargetOffsetMs, чтобы переопределить манифест, илиDashMediaSource#setFallbackTargetLiveOffsetMs, чтобы указать резервное значение. - Удалить
(Simple)ExoPlayer.setThrowsWhenUsingWrongThreadОтказаться от принудительного использования цепочек больше нельзя. - Удалить
ActionFileиActionFileUpgradeUtil. Используйте ExoPlayer 2.16.1 или более раннюю версию, чтобы с помощьюActionFileUpgradeUtilобъединить устаревшие файлы действий вDefaultDownloadIndex. - Удалить
ProgressiveMediaSource#setExtractorsFactoryИспользуйте вместо него конструкторProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory). - Удалите
ProgressiveMediaSource.Factory#setTagиProgressiveMediaSource.Factory#setCustomCacheKey. Используйте вместо него правилаMediaItem.Builder#setTagиMediaItem.Builder#setCustomCacheKey. - Удалите конструкторы
DefaultRenderersFactory(Context, @ExtensionRendererMode int)иDefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Вместо них используйте конструкторDefaultRenderersFactory(Context), а также методыDefaultRenderersFactory#setExtensionRendererModeиDefaultRenderersFactory#setAllowedVideoJoiningTimeMs. - Удалите все общедоступные конструкторы
CronetDataSource. Используйте вместо негоCronetDataSource.Factory.
- Удалить
- Измените
IntDefsна@Target(TYPE_USE). Это может нарушить компиляцию в Kotlin. Чтобы исправить проблему, переместите аннотацию к типу (Int).@AacAudioObjectType@Ac3Util.SyncFrameInfo.StreamType@AdLoadException.Type@AdtsExtractor.Flags@AmrExtractor.Flags@AspectRatioFrameLayout.ResizeMode@AudioFocusManager.PlayerCommand@AudioSink.SinkFormatSupport@BinarySearchSeeker.TimestampSearchResult.Type@BufferReplacementMode@C.BufferFlags@C.ColorRange@C.ColorSpace@C.ColorTransfer@C.CryptoMode@C.Encoding@C.PcmEncoding@C.Projection@C.SelectionReason@C.StereoMode@C.VideoOutputMode@CacheDataSource.Flags@CaptionStyleCompat.EdgeType@DataSpec.Flags@DataSpec.HttpMethods@DecoderDiscardReasons@DecoderReuseResult@DefaultAudioSink.OutputMode@DefaultDrmSessionManager.Mode@DefaultTrackSelector.SelectionEligibility@DefaultTsPayloadReaderFactory.Flags@EGLSurfaceTexture.SecureMode@EbmlProcessor.ElementType@ExoMediaDrm.KeyRequest.RequestType@ExtensionRendererMode@Extractor.ReadResult@FileTypes.Type@FlacExtractor.Flags(в пакетеcom.google.android.exoplayer2.ext.flac)@FlacExtractor.Flags(в пакетеcom.google.android.exoplayer2.extractor.flac)@FragmentedMp4Extractor.Flags@HlsMediaPlaylist.PlaylistType@HttpDataSourceException.Type@IllegalClippingException.Reason@IllegalMergeException.Reason@LoadErrorHandlingPolicy.FallbackType@MatroskaExtractor.Flags@Mp3Extractor.Flags@Mp4Extractor.Flags@NotificationUtil.Importance@PlaybackException.FieldNumber@PlayerNotificationManager.Priority@PlayerNotificationManager.Visibility@PlayerView.ShowBuffering@Renderer.State@RendererCapabilities.AdaptiveSupport@RendererCapabilities.Capabilities@RendererCapabilities.DecoderSupport@RendererCapabilities.FormatSupport@RendererCapabilities.HardwareAccelerationSupport@RendererCapabilities.TunnelingSupport@SampleStream.ReadDataResult@SampleStream.ReadFlags@StyledPlayerView.ShowBuffering@SubtitleView.ViewType@TextAnnotation.Position@TextEmphasisSpan.MarkFill@TextEmphasisSpan.MarkShape@Track.Transformation@TrackOutput.SampleDataPart@Transformer.ProgressState@TsExtractor.Mode@TsPayloadReader.Flags@WebvttCssStyle.FontSizeUnit
Версия 1.0.0-alpha01
27 октября 2021 г.
Выпущены данные "androidx.media3:media3-*:1.0.0-alpha01". Версия 1.0.0-alpha01 содержит эти коммиты.
Новые функции
Media3 – это новый дом для библиотек поддержки медиа, включая ExoPlayer. Первая альфа-версия содержит ранние функциональные реализации библиотек для реализации вариантов использования мультимедиа, в том числе:
- ExoPlayer – медиапроигрыватель уровня приложения для Android, который легко настраивать и расширять.
- Функции сеанса мультимедиа для показа и управления воспроизведением. В новом модуле сеансов используется тот же интерфейс
Player, что и в ExoPlayer. - Компоненты пользовательского интерфейса для создания интерфейсов воспроизведения медиа.
- Модули, которые позволяют использовать в ExoPlayer функции других библиотек, например вставку объявлений с помощью IMA SDK.
Дополнительную информацию можно найти на странице проекта Media3 на GitHub.
Ранее ExoPlayer размещался в отдельном проекте ExoPlayer GitHub. В Media3 название пакета – androidx.media3.exoplayer. Мы планируем поддерживать и выпускать проект ExoPlayer на GitHub ещё некоторое время, чтобы у разработчиков было время перейти на Media3.
В Media3 есть замена для всех модулей ExoPlayer, кроме устаревших расширений media2 и mediasession, которые заменены новым модулем media3-session. Это обеспечивает прямую интеграцию между проигрывателями и медиасеансами без необходимости использовать класс адаптера/коннектора.