
Handling of the stream offset and start position was unnecessarily complex and even incorrect. It was going to be an issue for concatenation of video and image input. The stream offset is the offset added before decoding/encoding to make sure it doesn’t fail in case of negative timestamps (which do rarely occur). The start position is equal to the stream offset, plus the clipping start time if the media is clipped. Before this change: - Samples were offset by the start position before decoding, and this offset was removed before muxing. - The startPosition of the first MediaItem in a sequence was used for all the MediaItems in this sequence (which is incorrect). - The stream offset was removed before applying the GL effects and added back before encoding so that it was not visible to the OpenGL processing. After this change: - The start position is subtracted in the AssetLoader, so that the downstream components don’t have to deal with the stream offsets and start positions. - Decoded samples with negative timestamps are not passed to the SamplePipelines. The MediaMuxer doesn’t handle negative timestamps well. If a stream is 10 secondes long and starts at timestamp -2 seconds, the output will only contain the samples corresponding to the first 8 (10 - 2) seconds. It won’t contain the last 2 seconds of the stream. It seems acceptable to remove the first 2 seconds instead. PiperOrigin-RevId: 520916464
Transformer module
Provides functionality for transforming media files.
Getting the module
The easiest way to get the module is to add it as a gradle dependency:
implementation 'androidx.media3:media3-transformer:1.X.X'
where 1.X.X
is the version, which must match the version of the other media
modules being used.
Alternatively, you can clone this GitHub project and depend on the module locally. Instructions for doing this can be found in the top level README.