Advanced Options
Video rotation
You can set the output video rotation with the setRotation(int)
method. This will apply a clockwise
rotation to the input video frames. Accepted values are 0
, 90
, 180
, 270
:
kotlinTranscoder.into(filePath)
.setVideoRotation(rotation) // 0, 90, 180, 270
// ...
Time interpolation
We offer APIs to change the timestamp of each video and audio frame. You can pass a TimeInterpolator
to the transcoder builder to be able to receive the frame timestamp as input, and return a new one
as output.
kotlinTranscoder.into(filePath)
.setTimeInterpolator(timeInterpolator)
// ...
As an example, this is the implementation of the default interpolator, called DefaultTimeInterpolator
,
that will just return the input time unchanged:
kotlinoverride fun interpolate(type: TrackType, time: Long): Long {
// Receive input time in microseconds and return a possibly different one.
return time
}
It should be obvious that returning invalid times can make the process crash at any point, or at least the transcoding operation fail.
Video speed
We also offer a special time interpolator called SpeedTimeInterpolator
that accepts a float
parameter
and will modify the video speed.
- A speed factor equal to 1 will leave speed unchanged
- A speed factor < 1 will slow the video down
- A speed factor > 1 will accelerate the video
This interpolator can be set using setTimeInterpolator(TimeInterpolator)
, or, as a shorthand,
using setSpeed(float)
:
kotlinTranscoder.into(filePath)
.setSpeed(0.5F) // 0.5x
.setSpeed(1F) // Unchanged
.setSpeed(2F) // Twice as fast
// ...
Audio stretching
When a time interpolator alters the frames and samples timestamps, you can either remove audio or
stretch the audio samples to the new length. This is done through the AudioStretcher
interface:
kotlinTranscoder.into(filePath)
.setAudioStretcher(audioStretcher)
// ...
The default audio stretcher, DefaultAudioStretcher
, will:
- When we need to shrink a group of samples, cut the last ones
- When we need to stretch a group of samples, insert noise samples in between
Please take a look at the implementation and read class documentation.
Audio resampling
When a sample rate different than the input is specified (by the TrackStrategy
, or, when using the
default audio strategy, by DefaultAudioStrategy.Builder.sampleRate()
), this library will automatically
perform sample rate conversion for you.
This operation is performed by a class called AudioResampler
. We offer the option to pass your
own resamplers through the transcoder builder:
kotlinTranscoder.into(filePath)
.setAudioResampler(audioResampler)
// ...
The default audio resampler, DefaultAudioResampler
, will perform both upsampling and downsampling
with very basic algorithms (drop samples when downsampling, repeat samples when upsampling).
Upsampling is generally discouraged - implementing a real upsampling algorithm is probably out of
the scope of this library.
Please take a look at the implementation and read class documentation.