Release Notes (Android)
Android SDK Release Notes
Release notes for the v2 version of the Android SDK can be found here.
3.44.0
Released: 2023-09-18
Added
foregroundServiceType
andFOREGROUND_SERVICE_DATA_SYNC
permission toBitmovinDownloadService
RECEIVER_NOT_EXPORTED
flag to dynamically registeredBroadcastReceiver
inPlayerNotificationManager
Fixed
- Missing class definition when loading a VR configured source and using the default UI
Changed
- Updated Google Cast SDK to
21.3.0
- Updated IMA SDK dependency to version
3.31.0
. This may require an update of the dependent Google Ads Play Services - Updated JS dependencies, including the Bitmovin Player UI to 3.50.0
3.43.0
Released: 2023-09-04
Added
TweaksConfig.discardAdsWhileCasting
to control advertisement discard behavior when casting with advertisements scheduled- Warn when player without analytics load source with metadata
Fixed
- Pre-roll ad playback starts locally, when creating a player and starting playback while a cast session is connecting
- VMAP ad playback starts locally while casting. VMAP ad blocks are now suppressed and played back once the cast session stops
- Inconsistent API behaviour when creating and using a player while a cast session is connecting
3.42.0
Released: 2023-08-16
Added
AdItem.vastLoadTimeout
which can be used to change the timeout for VAST ad manifest downloads
3.41.0
Released: 2023-08-07
Added
Player
andSource
methods to collect Player Analytics using Bitmovin Analytics.
The following APIs can be used to collect playback analytic events:Player.create(Context, PlayerConfig, AnalyticsConfig, DefaultMetadata)
(extension), to create an analytics enabledPlayer
- In Java, call
PlayerFactory.create
- In Java, call
Source.create(SourceConfig, SourceMetadata)
(extension), to create aSource
with analytics metadata attached- In Java, call
SourceFactory.create
- In Java, call
Player.analytics
(extension), to control analytics collected by an analytics enabledPlayer
- In Java, call
AnalyticsApi.from(Player)
- In Java, call
Source.analytics
(extension), to control analytics collected by an analytics enabledSource
- In Java, call
SourceAnalyticsApi.from(Source)
- In Java, call
Fixed
getThumbnail
returns wrongThumbnail
for DASH in-manifest thumbnails, when the manifest does not start at epoch
Changed
- Updated Bitmovin Analytics collector
dependency to version3.0.0
. See also this release's [Added] section.
Dependent using the V2 standalone Bitmovin Analytics Collector may:- Recommended: migrate to the Player new built-in Analytics API with the help of our:
- Migrate to the V3 standalone Bitmovin Analytics Collector with the help of our
Analytics V2 to V3 Migration Guide - Discouraged: pin the Bitmovin Analytics Collector dependency to V2 with the help of our
FAQ- Note that the new Player Analytics APIs are incompatible with the Bitmovin Analytics Collector V2.
3.40.0
Released: 2023-07-19
Fixed
- Potential main content playback before pre-roll ads
- Content flash before pre-roll ads when
StyleConfig.isHideFirstFrame
is set totrue
Changed
- Some
AdItems
are processed quicker after scheduling, thus the timing of related ad event might change - No
PlayerEvent.Play
andPlayerEvent.Paused
are emitted before a pre-roll ad playback
3.39.1
Released: 2023-07-10
Changed
- Various internal improvements
3.39.0
Released: 2023-06-26
Added
Player.sdkVersion
to retrieve the Player SDK version name- Add support for handling arbitrary method calls from Player Web UI via
CustomMessageHandler
3.38.2
Released: 2023-06-12
Changed
- Various internal improvements
3.38.1
Released: 2023-05-30
Fixed
- Player freezing when seeking past multiple IMA VAST ads
3.38.0
Released: 2023-05-15
Added
- The Bitmovin Analytics Collector as a dependency of the Bitmovin player.
It is not yet used and is stripped when minification is enabled.
As a consequence, when using Gradle's default dependency resolution strategy, updating the player will also update the analytic collector version. - You can find the release notes for the Bitmovin Analytics Collector here.
3.37.2
Released: 2023-05-08
Fixed
- Image Media Playlist parsing fails with a warning if an attribute value on the
EXT-X-IMAGE-STREAM-INF
tag contains a colon, e.g. the scheme separator in an absolute URI
3.37.1
Released: 2023-05-02
Fixed
SourceConfig.startOffset
not respected when loading a source while connected to a cast-compatible device
3.37.0
Released: 2023-04-24
Fixed
- Potential duplicate class error when using the player along side another library that contains obfuscated symbols
- HTTP headers being stripped when a
NetworkConfig.preprocessHttpRequestCallback
is provided and its return value is notnull
Changed
- Enforced that consuming projects must use a
compileSdk
at least as recent as the playercompileSdk
(currently33
) to avoid runtime errors - Integrated changes from ExoPlayer version
2.18.4
3.36.0
Released: 2023-04-17
Changed
- Kotlin to version
1.8.20
Known Issues
- Potential duplicate class error when using the player along side another library that contains obfuscated symbols
3.35.2
Released: 2023-04-11
Fixed
- Metadata events for embedded event streams in a DASH source sometimes not being emitted if there are multiple video adaptation sets
Known Issues
- Potential duplicate class error when using the player along side another library that contains obfuscated symbols
3.35.1
Released: 2023-04-03
Fixed
PlayerEvent.CastWaitingForDevice
,PlayerEvent.CastStarted
andPlayerEvent.CastStopped
not being emitted when there is no active playback session- Volume on connected cast enabled device always being overwritten with 100% for certain cast devices when creating a new player instance while being connected to a cast enabled device
- Bitmovin Analytics Collector <=
2.14.0
throwing aClassNotFoundException
when trying to access the Player version
Known Issues
- Potential duplicate class error when using the player along side another library that contains obfuscated symbols
3.35.0
Released: 2023-03-20
Fixed
- Window color behind subtitle cue sometimes being black when it should be unset when using
SubtitleView
- Subtitles sometimes not being correctly centered when using the
SubtitleView
- Buffer level always returns zero after some time for HLS live streams
Known Issues
- Bitmovin Analytics Collector <=
2.14.0
throws aClassNotFoundException
when trying to access the Player version
3.34.0
Released: 2023-03-13
Added
TweaksConfig.enableExoPlayerLogging
that specifies whether ExoPlayer logs shall be printed to the logcat console
Known Issues
- Bitmovin Analytics Collector <=
2.14.0
throws aClassNotFoundException
when trying to access the Player version
3.33.1
Released: 2023-03-06
Fixed
- Player triggering VAST
complete
tracking event when being destroyed while playing an ad - Player triggering VAST
complete
tracking event when skippable ad is skipped - Player not continuing main content playback when a VAST ad is discarded by either connecting to a cast-compatible device or changing the
AdViewGroup
during ad playback
3.33.0
Released: 2023-02-27
Added
OfflineWarningCode.DrmGeneral
which is emitted in aOfflineEvent.Warning
when a general warning occurred for DRM handling
Fixed
- Memory leak when using the
BitmovinCastManager
and not updating the context on every activity switch
3.32.0
Released: 2023-02-20
Added
PlayerWarningCode.RemotePlaybackFailed
which is emitted when playback on a connected cast-compatible device produces an errorPlayerWarningCode.AdDiscarded
which is emitted when an ad is discarded by the player
Fixed
- Potential memory leak when destroying the player before an already loaded ad is played back
- Memory leak when playing an ad break of a VMAP ad and destroying the player before all remaining ad breaks have been reach
3.31.0
Released: 2023-02-13
Added
PlayerWarningCode.FeatureContextuallyUnsupported
which is emitted when a feature on thePlayer
is not supported in the current context
Fixed
- Some errors not being propagated during Ad playback
- Casting DRM protected content without providing
SourceConfig.httpHeaders
does not start the video on the connected cast-compatible device
3.30.0
Released: 2023-02-06
Added
PlayerWarningCode.IncorrectApiUsage
which is emitted when a certain API usage on thePlayer
is not correct and will have no effect
Fixed
- Detaching the renderer surface times out when destroying the player while metadata is being parsed
- Type safety (nullability) in
AudioLabeler
- Type safety (nullability) in
AudioQualityLabeler
- Type safety (nullability) in
VideoQualityLabeler
- Type safety (nullability) in
SubtitleLabeler
- Type safety (nullability) in
AdsManagerAvailableCallback
- Type safety (nullability) in
BeforeInitializationCallback
- Type safety (nullability) in
PrepareLicenseCallback
- Type safety (nullability) in
PrepareMessageCallback
- Type safety (nullability) in
ForecedSubtitleCallback
- Type safety (nullability) in
VideoAdaptation
- Type safety (nullability) in
PreprocessHttpRequestCallback
- Type safety (nullability) in
BitmovinSurfaceListener
- Type safety (nullability) in
VrRenderer
Changed
- Default Bitmovin Web UI version to 3.42.0
3.29.0
Released: 2023-01-30
Added
RemoteControlConfig.onConfigureMediaInfo
which can be used to configure Google CastMediaInfo
objects before they are loaded on the cast enabled devicePlayerWarningCode.IncorrectApiUsage
which is emitted when a certain API usage on thePlayer
is not correct and will have no effect
3.28.0
Released: 2023-01-23
Added
PlayerWarningCode.PlaylistManipulationFailed
which is emitted in aPlayerEvent.Warning
when it was not possible to manipulate the playlistPlayerWarningCode.AdvertisingGeneral
which is emitted in aPlayerEvent.Warning
when a general warning occurred in the advertising featurePlayerWarningCode.AdBreakFetchingFailed
which is emitted in aPlayerEvent.Warning
when the current ad break will not play any ads as no ads could be fetchedPlayerWarningCode.CastSourceMappingFailed
which is emitted in aPlayerEvent.Warning
when the playlist state on the cast enabled device is inconsistent to the local playlist stateOfflineWarningCode.DrmLicenseReleaseFailed
which is emitted in aOfflineEvent.Warning
when the DRM license failed to releaseSourceWarningCode.IncorrectApiUsage
which is emitted when a certain API usage is not correct and will have no effectSourceWarningCode.FeatureContextuallyUnsupported
which is emitted when a feature is not supported in the current context- Crash when playing Progressive Ads using Bitmovin Web UI
Fixed
ForegroundServiceStartNotAllowedException
thrown on Android 12 when download was paused and resumed in the background due to unmet requirements- Downloaded asset sometimes being corrupted when download was paused and resumed due to unmet requirements
3.27.0
Released: 2023-01-17
Changed
- Updated Google Cast SDK to
21.2.0
- Updated IMA SDK dependency to version
3.29.0
. This may require an update of the dependent Google Ads Play Services
3.26.1
Released: 2022-12-23
Fixed
- Player buffer level returns wrong values for DASH live streams with
availabilityStartTime
attribute set to time not at epoch - Unlike Kotlin's
EventEmitter
,JavaEventEmitter
'sEventListener
s could not receive base events.
3.26.0
Released: 2022-12-06
Added
EventEmitter
functionality toOfflineContentManager
enabling subscriptions toOfflineEvent
s emitted during theOfflineContentManager
lifecycle.OfflineEvent.Error
,OfflineEvent.Warning
andOfflineEvent.Info
are the supported eventsPlayerEvent.Info
andSourceEvent.Info
, which allow further monitoring ofPlayer
andSource
workflows
3.25.2
Released: 2022-11-23
Fixed
- Player very rarely is paused after calling
play
Player.duration
sometimes returning0.0
instead of-1.0
in case that the duration is unknown during casting- Crash when encountering an IMA ad error while using the Bitmovin Web UI
VideoDownloadQualityChangend
andAudioDownloadQualityChanged
are not emitted on period switches, if the according qualities have the same id- Duration in Bitmovin Web UI displaying 00:00 after error in pre-roll ad
3.25.1
Released: 2022-10-25
Fixed
- Image Media Playlists being downloaded and parsed for live HLS sources. The Image Media Playlist thumbnail feature is designed for VOD only but was also active for live sources causing potential performance implications. The old behaviour can be restored by enabling
TweaksConfig.enableImageMediaPlaylistThumbnailParsingForLive
- Query parameters missing from Image Media Playlist variant playlist requests and thumbnail URLs when parsing an Image Media Playlist with relative URLs
- Potential crash when rendering the first frame on some Android TV devices
Deprecated
ParcelUtil
as the provided functionality is generic parcelization logic and not required when interacting with the Player SDK
3.25.0
Released: 2022-10-11
Fixed
- Download service crashing when downloading content for as
SourceConfig
containing metadata VrConfig
not being usable without thekotlin-parcelize
plugin
Removed
- Gson serialization annotations and adapters for API models. The removal affects serialization of Bitmovin objects with Gson where no explicit serialization strategy is provided
Changed
- Integrated changes from ExoPlayer version
2.18.1
3.24.2
Released: 2022-09-27
Fixed
- Incorrectly formatted seekbar when the duration is unknown in the default Bitmovin Web UI. Negative durations are no longer exposed to the web UI which might effect existing custom implementations
3.24.1
Released: 2022-09-13
Fixed
- Some low latency streams fail with error when the
LowLatencyConfig
is configured
3.24.0
Released: 2022-08-30
Added
- Automatic failover for multiple base URLs for DASH Image Adaptation Set thumbnails
Deprecated
BitmovinCastManager.sendMessage(Map<String, Any>)
. UseBitmovinCastManager.sendMessage(String)
instead
3.23.0
Released: 2022-08-16
Added
- DASH Image Adaptation Set thumbnail support as specified in DASH-IF IOP
Fixed
EXT-X-DATERANGE
metadata tags are not processed for HLS playlists where theEXT-X-PROGRAM-DATE-TIME
maps the start of the playlist to epoch 0
3.22.0
Released: 2022-08-02
Changed
- Integrated changes from ExoPlayer version
2.17.1
3.21.0
Released: 2022-07-19
Added
AdvertisingConfig.imaUiElements
to configure the visible UI elements during IMA ad playback
3.20.0
Released: 2022-07-05
Added
PlaylistApi.remove
, which removes aSource
from an active playback sessionPlayerEvent.SourceRemoved
, which is emitted when a source was removed from an active playback session
Fixed
- Main content being visible between multiple ads configured at the same time in VMAP ad configurations
3.19.0
Released: 2022-06-21
Added
PlaylistApi.add
, which adds aSource
to an active playback sessionPlayerEvent.SourceAdded
, which is emitted when a source was added to the active playback sessionSourceEvent.AudioTrackAdded
to replaceSourceEvent.AudioAdded
for naming consistencySourceEvent.AudioTrackRemoved
to replaceSourceEvent.AudioRemoved
for naming consistencySourceEvent.AudioTrackChanged
to replaceSourceEvent.AudioChanged
for naming consistencySourceEvent.SubtitleTrackAdded
to replaceSourceEvent.SubtitleAdded
for naming consistencySourceEvent.SubtitleTrackRemoved
to replaceSourceEvent.SubtitleRemoved
for naming consistencySourceEvent.SubtitleTrackChanged
to replaceSourceEvent.SubtitleChanged
for naming consistency
Fixed
- Crash when trying to resume or delete a download initiated with player version < 3.14.1
Deprecated
SourceEvent.AudioAdded
. UseSourceEvent.AudioTrackAdded
insteadSourceEvent.AudioRemoved
. UseSourceEvent.AudioTrackRemoved
insteadSourceEvent.AudioChanged
. UseSourceEvent.AudioTrackChanged
insteadSourceEvent.SubtitleAdded
. UseSourceEvent.SubtitleTrackAdded
insteadSourceEvent.SubtitleRemoved
. UseSourceEvent.SubtitleTrackRemoved
insteadSourceEvent.SubtitleChanged
. UseSourceEvent.SubtitleTrackChanged
insteadPlayer.availableAudio
. InsteadSource.availableAudioTracks
can be used on the active sourcePlayer.source
Player.audio
. InsteadSource.selectedAudioTrack
can be used on the active sourcePlayer.source
Player.setAudio
. InsteadSource.setAudioTrack
can be used on the active sourcePlayer.source
Player.availableAudioQualities
. InsteadSource.availableAudioQualities
can be used on the active sourcePlayer.source
Player.audioQuality
. InsteadSource.selectedAudioQuality
can be used on the active sourcePlayer.source
Player.setAudioQuality
. InsteadSource.setAudioQuality
can be used on the active sourcePlayer.source
Player.availableVideoQualities
. InsteadSource.availableVideoQualities
can be used on the active sourcePlayer.source
Player.videoQuality
. InsteadSource.selectedVideoQuality
can be used on the active sourcePlayer.source
Player.setVideoQuality
. InsteadSource.setVideoQuality
can be used on the active sourcePlayer.source
Player.availableSubtitles
. InsteadSource.availableSubtitleTracks
can be used on the active sourcePlayer.source
Player.subtitle
. InsteadSource.selectedSubtitleTrack
can be used on the active sourcePlayer.source
Player.setSubtitle
. InsteadSource.setSubtitle
can be used on the active sourcePlayer.source
Player.removeSubtitle
. InsteadSource.removeSubtitleTrack
can be used on the active sourcePlayer.source
Player.getThumbnail
. InsteadSource.getThumbnail
can be used on the active sourcePlayer.source
3.18.1
Released: 2022-05-24
Fixed
- Target buffer level potentially not being reached for high bitrate qualities
- All but the first created
OfflineContentManager
failing unrecoverably if network connection is lost during download
3.18.0
Released: 2022-05-10
Added
Source.availableAudioTracks
, which provides the currently available audio tracks of the sourceSource.availableAudioQualities
, which provides the currently available audio qualities of the selected audio track of the sourceSourceEvent.AudioAdded
to be emitted from theSource
for which the audio track was added. It is now also emitted for inactive sources in a playlistSourceEvent.AudioRemoved
to be emitted from theSource
for which the audio track was added. It is now also emitted for inactive sources in a playlistSourceEvent.AudioTracksChanged
, which is emitted when theSource.availableAudioTracks
changedSourceEvent.AudioQualityAdded
, which is emitted when a new audio quality was added toSource.availableAudioQualities
SourceEvent.AudioQualityRemoved
, which is emitted when an audio quality was removed fromSource.availableAudioQualities
SourceEvent.AudioQualitiesChanged
, which is emitted when theSource.availableAudioQualities
changedSourceEvent.AudioChanged
to be emitted from theSource
for which the audio track changed. It is now also emitted for inactive sources in a playlistSource.setAudioTrack
, which allows setting an audio track for the sourceSource.selectedAudioTrack
, which provides the currently selected audio track of the sourceSourceEvent.AudioQualityChanged
to be emitted from theSource
for which the audio quality changed. It is now also emitted for inactive sources in a playlistSource.setAudioQuality
, which allows setting a fixed audio quality for the sourceSource.selectedAudioQuality
, which provides the currently selected audio quality of the sourceSourceEvent.AudioDownloadQualityChanged
to be emitted from theSource
for which the download quality changed. It is now also emitted for inactive sources in a playlistSourceEvent.Warning
andSourceEvent.Error
to be emitted from theSource
for which the respective warning or error occurred. It is now also emitted for inactive sources in a playlist
Fixed
- Crash when creating a
PlayerNotificationManager
on Android 31 devices - Some errors not being surfaced via the corresponding
SourceEvent.Error
orPlayerEvent.Error
listeners
3.17.0
Released: 2022-04-26
Added
Source.availableSubtitleTracks
, which provides the currently available subtitle tracks of the sourceSourceEvent.SubtitleAdded
to be emitted from theSource
for which the subtitle track was added. It is now also emitted for inactive sources in a playlistSourceEvent.SubtitleRemoved
to be emitted from theSource
for which the subtitle track was added. It is now also emitted for inactive sources in a playlistSourceEvent.SubtitleTracksChanged
, which is emitted when theSource.availableSubtitleTracks
changedSource.setSubtitleTrack
, which allows setting a subtitle track for the sourceSource.selectedSubtitleTrack
, which provides the currently selected subtitle track of the sourceSourceEvent.SubtitleChanged
to be emitted from theSource
for which the subtitle track changed. It is now also emitted for inactive sources in a playlist
Fixed
- User-Agent header being ignored/overridden when set via the
PreprocessHttpRequestCallback
- Download service crashing when setting the
OfflineConfig
before creating anOfflineContentManager
3.16.0
Released: 2022-04-12
Added
Source.setVideoQuality
, which allows setting a fixed video quality for the sourceSource.selectedVideoQuality
, which provides the currently selected video quality of the source
Fixed
- Last ad frame being visible after orientation changes on Android 12
- Main content being visible in background during fullscreen ad playback, if aspect ratio does not exactly fit the screens ratio
- No audio being played back after switching from a fixed
AudioQuality
to "auto" AudioTrack
selection being ignored after selecting aAudioQuality
- Foreground notification of the download service not vanishing if all downloads are suspended
Changed
- Download Service stops itself when all downloads are suspended
3.15.0
Released: 2022-03-16
Added
Source.availableVideoQualities
, which provides the currently available video qualities of the sourceSourceEvent.VideoQualityAdded
, which is emitted when a video quality has been added to the sourceSourceEvent.VideoQualityRemoved
, which is emitted when a video quality has been removed from the sourceSourceEvent.VideoQualitiesChanged
, which is emitted when when theSource.availableVideoQualities
changedSourceEvent.VideoDownloadQualityChanged
to be emitted from theSource
for which the download quality changed. It is now also emitted for inactive sources in a playlist
Fixed
- Offline thumbnail scrubbing not working on devices running Android 11+
- Casting to a remote device being stopped when destroying the Bitmovin Player
ExpandedControllerActivity
loading endlessly if pausing an active cast session- Wrong video qualities being displayed in Bitmovin Web UI when video qualities change during playback
- Potential crash when getting a buffer level via
BufferApi.getLevel
SubtitleTrack
selection is reset to default when selecting anAudioTrack
AudioTrack
selection is reset to default when selecting aSubtitleTrack
- Incomplete telemetry data being sent to Bitmovin backend
3.14.1
Released: 2022-03-16
Fixed
- Incomplete telemetry data being sent to Bitmovin backend
3.14.0
Released: 2022-03-01
Fixed
- Live edge being clamped to
EXT-X-START:TIME-OFFSET
value if present in a live HLS playlist. This could lead to an invalid DVR window, affecting potentialtimeshift
operations
Known Issues
- Telemetry data being sent to Bitmovin backend is incomplete. While this has no impact on the viewer experience, Bitmovin relies on this data to measure and maintain quality of service on behalf of our customers. We therefore recommend upgrading to version
3.14.1+
AudioTrack
selection is reset to default when selecting aSubtitleTrack
and vice versa
Changed
- Integrated changes from ExoPlayer version
2.16.1
SourceOptions.startOffset
is now nullable andnull
per default. This change was necessary to properly supportEXT-X-START:TIME-OFFSET
values
3.13.3
Released: 2022-03-16
Fixed
- Incomplete telemetry data being sent to Bitmovin backend
3.13.2
Released: 2022-02-15
Fixed
PlayerEvent.TimeChanged
being emitted before the start offset is applied for live sourcesPlayerEvent.TimeChanged
not being emitted after a successful seek or time shift when paused
Known Issues
- Telemetry data being sent to Bitmovin backend is incomplete. While this has no impact on the viewer experience, Bitmovin relies on this data to measure and maintain quality of service on behalf of our customers. We therefore recommend upgrading to version
3.13.3+
3.13.1
Released: 2022-02-03
Fixed
- Player emitting an error when the app that uses the Player is obfuscated by R8
Known Issues
- Telemetry data being sent to Bitmovin backend is incomplete. While this has no impact on the viewer experience, Bitmovin relies on this data to measure and maintain quality of service on behalf of our customers. We therefore recommend upgrading to version
3.13.3+
3.13.0
Released: 2022-02-01
Added
Source.seekableRange
, which returns a time range in seconds the player can seek in between. Does not return valid values for live sources yetAdaptationConfig.initialBandwidthEstimateOverride
to replaceAdaptationConfig.startupBitrate
as the latter does not do what the name suggests
Fixed
Player.seek
orPlayer.timeshift
being ignored when called insidePlayerEvent.Ready
listener
Known Issues
- The existing proguard rules that should be used with the Player do not work with this version and the Player emits an error when the app that uses the Player is obfuscated by R8. This is already fixed in version
3.13.1
- Telemetry data being sent to Bitmovin backend is incomplete. While this has no impact on the viewer experience, Bitmovin relies on this data to measure and maintain quality of service on behalf of our customers. We therefore recommend upgrading to version
3.13.3+
Changed
- Updated IMA SDK dependency to version
3.26.0
. This may require an update of the dependent Google Ads Play Services - Updated Google Cast SDK to
21.0.1
PlayerEvent.TimeChanged
is now emitted on the main thread
Deprecated
AdaptationConfig.startupBitrate
as it does not do what the name suggests. UseAdaptationConfig.initialBandwidthEstimateOverride
instead
3.12.0
Released: 2022-01-18
Added
- Support for different audio and video codec priorities via
SourceConfig.audioCodecPriority
andSourceConfig.videoCodecPriority
when multiple sources are part of a playback session
Fixed
- Playhead on the seekbar jumping back and forth while seeking when using the default Bitmovin Web UI
SourceErrorCode.General
error description in Bitmovin Web UI showing placeholder instead of a proper message- Potential
NullReferenceException
when playing multi period DASH live streams - Muting during casting does not mute the connected cast-compatible device
Changed
- Default Bitmovin Web UI version to 3.32.0
3.11.1
Released: 2021-12-21
Fixed
- Streams containing unsupported metadata not playing
Player.currentTime
returning incorrect values for progressive live streams- Post-roll IMA ads occasionally being played back only when replaying the source
ResourceIdentifierCallback
not being called for DASH segmentsSourceEvent.SubtitleChanged
containing a specialoff
subtitle track instead ofnull
when enabling/disabling subtitles during casting. This behaviour was not in line with the same event during local playback.- Subtitles not disabling when passing
null
toPlayer.setSubtitle
during casting.
3.11.0
Released: 2021-12-07
Added
SourceEvent.DrmDataParsed
to be emitted from the correspondingSource
Player.playbackTimeOffsetToRelativeTime
to convert absolute live timestamps to relative timestampsPlayer.playbackTimeOffsetToAbsoluteTime
to convert relative live timestamps to absolute timestamps
Fixed
Player.playbackVideoData
returningnull
after a period switch to a DASH period containing different qualities than the previous onePlayerEvent.VideoPlaybackQualityChanged
being emitted withnull
as the new quality after a period switch to a DASH period containing different qualities than the previous one- Setting
Player.volume
and callingPlayer.mute
orPlayer.unmute
not working when there is no source loaded - Setting
Player.volume
and callingPlayer.mute
orPlayer.unmute
not working while connecting to a cast-compatible device - Initial volume and muted state sometimes not being respected for ad playback
- Muxed tracks being listed as separate
OfflineOptionEntry
s for download - Invalid tracks being listed as
OfflineOptionEntry
s for download
Changed
- Integrated changes from ExoPlayer version
2.15.1
- Muted state is not being synced between the local device and any cast receiver anymore as the audio setup between those devices is too different for this to be a sensible default behavior. The old behavior can be achieved by manually muting or unmuting after
PlayerEvent.CastStarted
orPlayerEvent.CastStopped
is emitted
3.10.0
Released: 2021-11-23
Added
SourceEvent.MetadataParsed
to be emitted for in-band metadata from theSource
the metadata actually belongs to. With this addition all metadata formats are emitted correctly through the respectiveSource
Fixed
Player.currentTime
not returning an epoch timestamp for DASH live streams with periods declaring astart
timePlayer.currentTime
returning the seek target timestamp while seekingPlayer.currentTime
returning the time shift target timestamp while time shiftingPlayerEvent.Seeked
being emitted before enough data is loaded to continue playbackPlayerEvent.TimeShifted
being emitted before enough data is loaded to continue playback- Incorrect
Metadata.startTime
for in-band metadata in the first Period of a DASH live streams - Incorrect
Metadata.startTime
for EventStream metadata in DASH live streams - Low Latency catchup and fallback mechanism not working when close to the live edge
- Not selected media tracks being downloaded when they contain metadata
PlayerEvent.TimeShift
not containing absolute timestamps when time shifting in a DASH live sourcePlayerEvent.TimeShift
not containing relative timestamps when time shifting in an HLS live source
Changed
PlayerEvent.Seeked
is now emitted once the seek operation is actually completed and enough data is buffered to continue playback instead of it being emitted immediately after callingPlayer.seek
PlayerEvent.TimeShifted
is now emitted once the time shift operation is actually completed and enough data is buffered to continue playback instead of it being emitted immediately after callingPlayer.timeshift
PlayerEvent.StallStarted
andPlayerEvent.StallEnded
are not emitted during seek or time shift operations anymore- The new event sequence when triggering replay by calling
Player.play
when the player has finished playback isPlayerEvent.Play
,PlayerEvent.PlaylistTransition
,PlayerEvent.Playing
instead ofPlayerEvent.PlaylistTransition
,PlayerEvent.Play
,PlayerEvent.Playing
Known Issues
- Incorrect
Metadata.startTime
for in-band metadata in periods that are not at the first position in DASH live streams
3.9.0
Released: 2021-11-10
Added
SourceEvent.DownloadFinished
to be emitted for inactive sources in a playlist- Details on what caused a specific error (if available) to
OfflineErrorEvent
Fixed
- General offline error being surfaced via
SourceErrorCode.General
instead ofOfflineErrorCode.General
Known Issues
- Due to a limitation in the Google Cast SDK, casting does not work when targetSdkVersion is set to 31. This is tracked in https://issuetracker.google.com/issues/195588434
Removed
- Koin dependency
3.8.1
Released: 2021-10-28
Fixed
- Suspended offline downloads of individual tracks that were started utilizing Player SDK version 2 cannot be resumed with Player SDK version 3
Known Issues
- Due to a limitation in the Google Cast SDK, casting does not work when targetSdkVersion is set to 31. This is tracked in https://issuetracker.google.com/issues/195588434
3.8.0
Released: 2021-10-12
Added
PlayerNotificationManager.createWithNotificationChannel
overload that takes aCustomActionReceiver
Source.getThumbnail
to expose thumbnails for inactive sources in a playerAdItem.preloadOffset
to specify the amount of seconds the ad manifest should be loaded in advance compared to when the ad break is scheduled for playback- Support for background playback of IMA ads
Fixed
- Bitmovin Web UI having an invalid duration when joining an existing cast session
- Bitmovin Web UI occasionally not reflecting the correct current time when starting a cast session while playback is paused
- Bitmovin Web UI having an invalid duration after pre-roll ad was played when autoplay is enabled
- Cast receiver incorrectly displaying live source with VoD UI
Player.duration
returning0.0
instead of-1.0
if it is unknown during castingPlayer
crashing if it gets detached from thePlayerView
while ads are scheduled
Known Issues
- Due to a limitation in the Google Cast SDK, casting does not work when targetSdkVersion is set to 31. This is tracked in https://issuetracker.google.com/issues/195588434
Changed
- The offset with which the manifest for ads was preloaded now defaults to
0
seconds (instead of10
). With introducing thepreloadOffset
on theAdItem
this can now be configured per ad break
3.7.1
Released: 2021-09-28
Fixed
- Ad playback not pausing if hosting app is sent to background
3.7.0
Released: 2021-09-14
Added
ResourceIdentifierCallback
parameter toOfflineContentManager.getOfflineContentManager()
in order to not lose already downloaded resources when the resource URLs (e.g. segment URLs) have changed since the last time the source was downloaded for offline playback- Support for the
@endNumber
attribute in DASH manifests
Fixed
- Additional
PlayerEvent.Playing
being emitted when player resumes playback after stall and it was playing before the stall PlayerEvent.Paused
being emitted when pausing a fresh playback session wherePlayer.play
was never called beforePlayer.isPaused
returning true for a fresh playback session wherePlayer.play
was never called before pausingPlayerEvent.CastPlaybackFinished
being emitted immediately after connecting to a cast-compatible device, even though playback is not finishedPlayerEvent.CastPlaying
being emitted immediately after connecting to a cast-compatible device, even though content is not playingPlayerEvent.CastPaused
being emitted immediately after connecting to a cast-compatible device, even though content was not explicitly pausedPlayerEvent.Paused
being emitted when connecting to a cast-compatible device when content was already playing on the local device before- Additional
PlayerEvent.Play
andPlayerEvent.Playing
being emitted when returning from a cast-compatible device to local device playback and content was already playing on the cast-compatible device - Replay button not showing on the local device when playback has finished while casting to a cast-compatible device
SourceConfig.audioCodecPriority
andSourceConfig.videoCodecPriority
not being respected when loading a single source into the playerDownloadFinished.lastRedirectionLocation
beingnull
when a redirect happened
Changed
PlayerEvent.Play
,PlayerEvent.Playing
,PlayerEvent.Paused
andPlayerEvent.PlaybackFinished
are now also emitted while connected to a cast-compatible device
Deprecated
PlayerEvent.CastPaused
,PlayerEvent.CastPlaying
,PlayerEvent.CastPlaybackFinished
.PlayerEvent.Paused
,PlayerEvent.Playing
andPlayerEvent.PlaybackFinished
can be used instead
Removed
TweaksConfig.shouldEmitAllPendingMetadataOnStreamEnd
as it has no effect anymore. The expected behaviour is now achieved without the need to configure it
3.6.0
Released: 2021-08-03
Added
PlaybackConfig.audioFilter
andPlaybackConfig.videoFilter
that can be set to a newMediaFilter
to specify how strictly potentially unsupported media tracks and qualities are filtered out of a playback sessionTweaksConfig.devicesThatRequireSurfaceWorkaround
to workaround a potential problem with some device'sSurface
implementationCue.verticalType
to represent the vertical orientation of a cue
Fixed
- Subtitles being rendered off-screen when using the Bitmovin Player Web UI
Changed
- Media tracks and qualities that are definitely not supported during a playback session are now filtered out by default, meaning that they will not be exposed via
Player.availableAudio
,Player.availableAudioQualities
andPlayer.availableVideoQualities
.PlaybackConfig.audioFilter
andPlaybackConfig.videoFilter
can be set to a differentMediaFilter
to make the filtering more strict or to not filter at all - Paddings and font sizes in the Web UI are slightly adjusted
3.5.0
Released: 2021-07-20
Added
- Support for EXT-X-DATERANGE metadata tags in HLS playlists, which are surfaced via
SourceEvent.MetadataParsed
andPlayerEvent.Metadata
events
Fixed
- Wrong text positioning when using the
SubtitleView
Player.destroy
leading to a deadlock if called while metadata is being decoded
3.4.0
Released: 2021-07-06
Added
SourceEvent.MetadataParsed
to be emitted for inactive sources in a playlist when DASHEventStream
metadata is parsed
Fixed
EventMessage.durationMs
returning a nonsensical value when the duration is unknown- Possible crash near end of stream with subtitles enabled
Changed
SourceEvent.MetadataParsed
for DASHEventStream
metadata is now emitted as soon as the manifest is parsed instead of near the start time of the metadataEventMessage.durationMs
is now nullable and is null if the duration of the metadata event is unknown
3.3.0
Released: 2021-06-22
Added
SourceEvent.MetadataParsed
to be emitted for inactive sources in a playlist when SCTE metadata is parsed for HLS content
Fixed
- Potentially wrong
timeshift
values after loading a source into a player that has played a live source before SourceEvent.Unloaded
not being emitted through thePlayer
when unloading the player- Video freezing when skipping an ad
- Duplicate
PlayerEvent.PlaybackFinished
being emitted when loading, unloading or pausing the player after playback has finished BufferApi.getLevel
returning the wrong buffer level when the next source in a playlist starts to load
3.2.0
Released: 2021-06-08
Added
TweaksConfiguration.useDrmSessionForClearSources
that specifies whether a DRM session should be used for clear sources in a playlist if they follow after a DRM protected source- Performance improvements when using the Bitmovin Web UI by caching values that are fetched frequently
Fixed
- TTML image subtitle positioning in
SubtitleView
- Potential crash when detaching and attaching a
Surface
to the player while playing non-DRM protected content and then detaching again when playing DRM protected content within the same playback session
3.1.0
Released: 2021-05-26
Added
BufferConfig.startupThreshold
to configure the minimum amount of seconds of playback data to buffer before starting playback for the first timeBufferConfig.restartThreshold
to configure the minimum amount of seconds of playback data to buffer before starting playback again after a stall
Fixed
- Potential
RemoteServiceException
when setting anOfflineConfig
- UI not reflecting correct video qualities and playback speed when attaching the
Player
to thePlayerView
after loading a source
3.0.1
Released: 2021-05-11
Fixed
- Potential crash when starting playback during a cast session
PlayerEvent.Inactive
not being emitted for the previous playback session when loading new sources into an already active player- Potential exception when casting to a remote device is stopped while it is actively playing
- Potential selection of wrong tracks when downloading HLS content
- Deadlock when using VR functionality
- UI always becoming visible after exiting PiP, ignoring previously set visibility
- PiP button not being displayed in the web UI
- Progressive content not being downloaded for offline playback
3.0.0
Released: 2020-04-27
Added
- Scope information to dependencies in the generated POM file of the SDK in order to not unnecessarily pollute the namespace of the consuming project
- The SDK now includes the source-code of the
api
package for a better developer experience without the need to consult the JavaDocs or external docs frequently - Completely reworked documentation for a more productive and enjoyable learning experience. The new docs are based on Kotlin and include more information, a new design, search functionality and more
- More intuitive and flexible way of handling event subscriptions with the new
EventEmitter
, which is implemented by thePlayer
,Source
andPlayerView
. It now requires less boilerplate to subscribe/unsubscribe to events and works with either lambdas orEventListener
implementations, offering intuitive usage from Kotlin and Java Player
, which replaces theBitmovinPlayer
as the main player type. APlayer
instance can be created viaPlayer.create
Source
, which represents the new main type that is loaded into aPlayer
. It emits its own events and is configured via theSourceConfig
. ASource
instance can be created viaSource.create
PlaylistConfig
, which allows the configuration of a playlist consisting of multipleSource
s. This config can then be loaded into a player instance in order to enable gapless playback across multiple sources, as upcoming sources can be preloaded before they begin playbackPlayer.playlist
to manage the player's playlist and transition between sourcesPlayer.source
, which returns the currently activeSource
Player.load(Source)
to enable loading of the newSource
typeSourceConfig.url
, which returns the url of theSourceConfig
SourceConfig(url: String, type: SourceType)
constructor to create aSourceConfig
of a specific typePlayerEvent.PlaylistTransition
, which is emitted when the player transitions between two sources in a playlistSourceEvent.DurationChanged
, which is emitted when a source transitions from live to VoDPlayerEvent.Active
, which is emitted when a playback session starts (i.e. aSource
orPlaylistConfig
is loaded into the player)PlayerEvent.Inactive
, which is emitted when the player is unloaded
Changed
- Renamed Maven
artifactId
fromplayercore
toplayer
. The full dependency is nowcom.bitmovin.player:player:<version>
- Moved all public API to new
com.bitmovin.player.api
package, requiring a simple re-import. Some concrete implementations were not moved - Renamed all classes/interfaces that have acronyms in their name to follow a consistent naming pattern (e.g.
VR
toVr
,API
toApi
) - Replaced
BitmovinPlayerEvent
withEvent
and two subtypes:PlayerEvent
andSourceEvent
- All events are now split up between
PlayerEvent
andSourceEvent
(e.g.ReadyEvent
is nowPlayerEvent.Ready
,SourceLoadedEvent
is nowSourceEvent.Loaded
) - Error codes were reworked and split up into
PlayerErrorCode
andSourceErrorCode
enums - Warning codes were reworked and split up into
PlayerWarningCode
andSourceWarningCode
enums EventListener
now has aonEvent
function to make it generic and usable for all events instead of requiring a different interface for each eventSourceEvent.Load.sourceConfig
of typeSourceConfig
toSourceEvent.Load.source
of typeSource
SourceEvent.Loaded.sourceConfig
of typeSourceConfig
toSourceEvent.Loaded.source
of typeSource
PlayerEvent.Seek
now hasfrom
andto
properties of typeSeekPosition
- Default Bitmovin Web UI version to 3.23.0
- CAF is now used as the default cast receiver
- Renamed
SourceItem
toSourceConfig
- Renamed all configuration objects to use the
Config
suffix instead of theConfiguration
suffix - Refactored many configs to data classes, making it possible to use named parameters instead of setters (e.g.
PlayerConfig(advertisingConfig = AdvertisingConfig())
) - Changed enum code style from SCREAMING_SNAKE_CASE to PascalCase
- Renamed
BitmovinPlayerView
toPlayerView
- Renamed
BitmovinSubtitleView
toSubtitleView
- Renamed
BitmovinPlayerNotificationManager
toPlayerNotificationManager
SourceConfig
to only handle a singleProgressiveSource
SourceConfig
to only handle a singleDrmConfig
SourceConfig.setPersistentPoster
tosourceConfig.setPosterPersistent
- Renamed
MediaSourceType
toSourceType
- Deprecated constructor
SourceConfig(url: String)
in favour ofSourceConfig.fromUrl(url: String)
- Changed all
Array
return types in thePlayer
to returnList
instead - Improved nullability information on
PlayerConfig
,VrConfig
andLowLatencyConfig
- Renamed
FullscreenHandler.isFullScreen
toFullscreenHandler.isFullscreen
for consistency SourceConfig.posterSource
is now of typeString?
instead ofURLResource
- Changed return type of
AdvertisingConfig.schedule
fromArray
toList
- Changed return types of
PlaybackConfig.videoCodecPriority
andPlaybackConfig.audioCodecPriority
fromArray
toList
- Renamed
AdaptationConfig.isAllowRebuffering
toAdaptationConfig.isRebufferingAllowed
Track.id
is not nullable anymore
Deprecated
MediaSource
,AdaptiveSource
,HlsSource
,SmoothSource
,ProgressiveSource
andDashSource
.SourceConfig
should instead be constructed using an url and aSourceType
. Alternatively,SourceConfig.fromUrl(String)
can be used to try and auto-detect the source type. These deprecated functions will be removed in an upcoming minor versionSourceConfig.addSubtitleTrack
functions that do not take aSubtitleTrack
directly. These deprecated functions will be removed in an upcoming minor versionSourceConfig.setThumbnailTrack
function that does not take aThumbnailTrack
directly. This deprecated function will be removed in an upcoming minor version
Removed
- Support for Bitmovin Web UI v2. Use Bitmovin Web UI v3 instead
- Support for non-CAF cast receivers
EventHandler
. Refer to the newEventEmitter
to see how to subscribe to events of thePlayer
/Source
/PlayerView
- All
*Listener
classes, as the newEventEmitter
works with lambdas or genericEventListener
implementations Player.setup
. In order to re-configure player behaviour, a new player must be createdConfigurationUpdatedEvent
Player.load(SourceConfiguration)
. UsePlayer.load(Source)
orPlayer.load(SourceConfig)
insteadflags
parameter fromOfflineContentManager.getOfflineContentManager()
andBitmovinDownloadService()
- Empty
Config
interface that some configs implemented CastConfig
. UseRemoteControlConfig
insteadPlaybackConfig.getAutoplayEnabled
. UseisAutoplayEnabled
insteadPlaybackConfig.getMuted
. UseisMuted
insteadPlaybackConfig.getTimeShiftEnabled
. UseisTimeShiftEnabled
insteadAdBreakConfig.skippable
. UseskippableAfter
insteadLinearAd.skippable
. UseskippableAfter
instead- Deprecated
BitmovinCastManager.initialize
functions Track.getDefault
. UseisDefault
insteadThumbnailTrack
constructor which allows setting theurl
,label
,id
andisDefault
. UseThumbnailTrack(url)
insteadStyleConfig.getUiEnabled
. UseisUiEnabled
insteadgetShowErrors
,isShowErrors
andsetShowErrors
from theStyleConfig
- Deprecated methods from
SourceConfig
- Deprecated
PlayerAPI
functions. The removed functionality can be found on their individual namepsaces (e.g.Player.buffer
,Player.lowLatency
,Player.vr
) PlayerConfig.fromJSON
PlayerAPI
and moved definitions to thePlayer
interface- Generic type parameter from
UserInterfaceApi
DrmSystems
enum. UseWidevineConfig
andClearKeyConfig
directlyPlayerView
constructor that takes aPlayerConfig
. UsePlayerView(Context, Player?)
to provide a custom player insteadGoogleCastReceiverVersion
and all usagesPlayerFragment
JsonConverter
Updated 6 days ago