public
final
class
MediaSync
extends Object
java.lang.Object | |
↳ | android.media.MediaSync |
MediaSync class can be used to synchronously playback audio and video streams. It can be used to play audio-only or video-only stream, too.
MediaSync is generally used like this:
MediaSync sync = new MediaSync(); sync.setSurface(surface); Surface inputSurface = sync.createInputSurface(); ... // MediaCodec videoDecoder = ...; videoDecoder.configure(format, inputSurface, ...); ... sync.setAudioTrack(audioTrack); sync.setCallback(new MediaSync.Callback() { @Override public void onAudioBufferConsumed(MediaSync sync, ByteBuffer audioBuffer, int bufferId) { ... } }, null); // This needs to be done since sync is paused on creation. sync.setPlaybackParams(new PlaybackParams().setSpeed(1.f)); for (;;) { ... // send video frames to surface for rendering, e.g., call // videoDecoder.releaseOutputBuffer(videoOutputBufferIx, videoPresentationTimeNs); // More details are available as below. ... sync.queueAudio(audioByteBuffer, bufferId, audioPresentationTimeUs); // non-blocking. // The audioByteBuffer and bufferId will be returned via callback. // More details are available as below. ... ... } sync.setPlaybackParams(new PlaybackParams().setSpeed(0.f)); sync.release(); sync = null; // The following code snippet illustrates how video/audio raw frames are created by // MediaCodec's, how they are fed to MediaSync and how they are returned by MediaSync. // This is the callback from MediaCodec. onOutputBufferAvailable(MediaCodec codec, int bufferId, BufferInfo info) { // ... if (codec == videoDecoder) { // surface timestamp must contain media presentation time in nanoseconds. codec.releaseOutputBuffer(bufferId, 1000 * info.presentationTime); } else { ByteBuffer audioByteBuffer = codec.getOutputBuffer(bufferId); sync.queueAudio(audioByteBuffer, bufferId, info.presentationTime); } // ... } // This is the callback from MediaSync. onAudioBufferConsumed(MediaSync sync, ByteBuffer buffer, int bufferId) { // ... audioDecoder.releaseBuffer(bufferId, false); // ... }The client needs to configure corresponding sink by setting the Surface and/or AudioTrack based on the stream type it will play.
For video, the client needs to call createInputSurface()
to obtain a surface on
which it will render video frames.
For audio, the client needs to set up audio track correctly, e.g., using MODE_STREAM
. The audio buffers are sent to MediaSync directly via queueAudio(ByteBuffer, int, long)
, and are returned to the client via onAudioBufferConsumed(MediaSync, ByteBuffer, int)
asynchronously. The client should not modify an audio buffer till it's returned.
The client can optionally pre-fill audio/video buffers by setting playback rate to 0.0, and then feed audio/video buffers to corresponding components. This can reduce possible initial underrun.
Nested classes | |
---|---|
class |
MediaSync.Callback
MediaSync callback interface. |
interface |
MediaSync.OnErrorListener
Interface definition of a callback to be invoked when there has been an error during an asynchronous operation (other errors will throw exceptions at method call time). |
Constants | |
---|---|
int |
MEDIASYNC_ERROR_AUDIOTRACK_FAIL
Audio track failed. |
int |
MEDIASYNC_ERROR_SURFACE_FAIL
The surface failed to handle video buffers. |
Public constructors | |
---|---|
MediaSync()
Class constructor. |
Public methods | |
---|---|
final
Surface
|
createInputSurface()
Requests a Surface to use as the input. |
void
|
flush()
Flushes all buffers from the sync object. |
PlaybackParams
|
getPlaybackParams()
Gets the playback rate using |
SyncParams
|
getSyncParams()
Gets the A/V sync mode. |
MediaTimestamp
|
getTimestamp()
Get current playback position. |
void
|
queueAudio(ByteBuffer audioData, int bufferId, long presentationTimeUs)
Queues the audio data asynchronously for playback (AudioTrack must be in streaming mode). |
final
void
|
release()
Make sure you call this when you're done to free up any opened component instance instead of relying on the garbage collector to do this for you at some point in the future. |
void
|
setAudioTrack(AudioTrack audioTrack)
Sets the audio track for MediaSync. |
void
|
setCallback(MediaSync.Callback cb, Handler handler)
Sets an asynchronous callback for actionable MediaSync events. |
void
|
setOnErrorListener(MediaSync.OnErrorListener listener, Handler handler)
Sets an asynchronous callback for error events. |
void
|
setPlaybackParams(PlaybackParams params)
Sets playback rate using |
void
|
setSurface(Surface surface)
Sets the output surface for MediaSync. |
void
|
setSyncParams(SyncParams params)
Sets A/V sync mode. |
Protected methods | |
---|---|
void
|
finalize()
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. |
Inherited methods | |
---|---|
From
class
java.lang.Object
|
int MEDIASYNC_ERROR_AUDIOTRACK_FAIL
Audio track failed.
See also:
Constant Value: 1 (0x00000001)
int MEDIASYNC_ERROR_SURFACE_FAIL
The surface failed to handle video buffers.
See also:
Constant Value: 2 (0x00000002)
MediaSync ()
Class constructor. On creation, MediaSync is paused, i.e., playback rate is 0.0f.
Surface createInputSurface ()
Requests a Surface to use as the input. This may only be called after
setSurface(Surface)
.
The application is responsible for calling release() on the Surface when done.
Returns | |
---|---|
Surface |
Throws | |
---|---|
IllegalStateException |
if not set, or another input surface has already been created. |
void flush ()
Flushes all buffers from the sync object.
All pending unprocessed audio and video buffers are discarded. If an audio track was configured, it is flushed and stopped. If a video output surface was configured, the last frame queued to it is left on the frame. Queue a blank video frame to clear the surface,
No callbacks are received for the flushed buffers.
Throws | |
---|---|
IllegalStateException |
if the internal player engine has not been initialized. |
PlaybackParams getPlaybackParams ()
Gets the playback rate using PlaybackParams
.
Returns | |
---|---|
PlaybackParams |
the playback rate being used. |
Throws | |
---|---|
IllegalStateException |
if the internal sync engine or the audio track has not been initialized. |
SyncParams getSyncParams ()
Gets the A/V sync mode.
Returns | |
---|---|
SyncParams |
the A/V sync params |
Throws | |
---|---|
IllegalStateException |
if the internal player engine has not been initialized. |
MediaTimestamp getTimestamp ()
Get current playback position.
The MediaTimestamp represents how the media time correlates to the system time in a linear fashion using an anchor and a clock rate. During regular playback, the media time moves fairly constantly (though the anchor frame may be rebased to a current system time, the linear correlation stays steady). Therefore, this method does not need to be called often.
To help users get current playback position, this method always anchors the timestamp
to the current system time
, so
getAnchorMediaTimeUs()
can be used as current playback position.
Returns | |
---|---|
MediaTimestamp |
a MediaTimestamp object if a timestamp is available, or null if no timestamp
is available, e.g. because the media player has not been initialized. |
See also:
void queueAudio (ByteBuffer audioData, int bufferId, long presentationTimeUs)
Queues the audio data asynchronously for playback (AudioTrack must be in streaming mode).
If the audio track was flushed as a result of flush()
, it will be restarted.
Parameters | |
---|---|
audioData |
ByteBuffer :
the buffer that holds the data to play. This buffer will be returned
to the client via registered callback. |
bufferId |
int :
an integer used to identify audioData. It will be returned to
the client along with audioData. This helps applications to keep track of audioData,
e.g., it can be used to store the output buffer index used by the audio codec. |
presentationTimeUs |
long :
the presentation timestamp in microseconds for the first frame
in the buffer. |
Throws | |
---|---|
IllegalStateException |
if audio track is not set or internal configureation has not been done correctly. |
void release ()
Make sure you call this when you're done to free up any opened component instance instead of relying on the garbage collector to do this for you at some point in the future.
void setAudioTrack (AudioTrack audioTrack)
Sets the audio track for MediaSync.
Currently, this is only supported in the Initialized state.
Parameters | |
---|---|
audioTrack |
AudioTrack :
Specify an AudioTrack through which to render the audio data. |
Throws | |
---|---|
IllegalArgumentException |
if the audioTrack has been released, or is invalid. |
IllegalStateException |
if setting the audio track is not supported, e.g. not in the Initialized state, or another audio track has already been set. |
void setCallback (MediaSync.Callback cb, Handler handler)
Sets an asynchronous callback for actionable MediaSync events.
This method can be called multiple times to update a previously set callback. If the handler is changed, undelivered notifications scheduled for the old handler may be dropped.
Do not call this inside callback.
Parameters | |
---|---|
cb |
MediaSync.Callback :
The callback that will run. Use null to stop receiving callbacks. |
handler |
Handler :
The Handler that will run the callback. Use null to use MediaSync's
internal handler if it exists.
|
void setOnErrorListener (MediaSync.OnErrorListener listener, Handler handler)
Sets an asynchronous callback for error events.
This method can be called multiple times to update a previously set listener. If the handler is changed, undelivered notifications scheduled for the old handler may be dropped.
Do not call this inside callback.
Parameters | |
---|---|
listener |
MediaSync.OnErrorListener :
The callback that will run. Use null to stop receiving callbacks. |
handler |
Handler :
The Handler that will run the callback. Use null to use MediaSync's
internal handler if it exists.
|
void setPlaybackParams (PlaybackParams params)
Sets playback rate using PlaybackParams
.
When using MediaSync with AudioTrack
, set playback params using this
call instead of calling it directly on the track, so that the sync is aware of
the params change.
This call also works if there is no audio track.
Parameters | |
---|---|
params |
PlaybackParams :
the playback params to use. Speed is the ratio between desired playback rate and normal one. 1.0 means
normal playback speed. 0.0 means pause. Value larger than 1.0 means faster playback,
while value between 0.0 and 1.0 for slower playback. Note: the normal rate
does not change as a result of this call. To restore the original rate at any time,
use speed of 1.0. |
Throws | |
---|---|
IllegalStateException |
if the internal sync engine or the audio track has not been initialized. |
IllegalArgumentException |
if the params are not supported. |
void setSurface (Surface surface)
Sets the output surface for MediaSync.
Currently, this is only supported in the Initialized state.
Parameters | |
---|---|
surface |
Surface :
Specify a surface on which to render the video data. |
Throws | |
---|---|
IllegalArgumentException |
if the surface has been released, is invalid, or can not be connected. |
IllegalStateException |
if setting the surface is not supported, e.g. not in the Initialized state, or another surface has already been set. |
void setSyncParams (SyncParams params)
Sets A/V sync mode.
Parameters | |
---|---|
params |
SyncParams :
the A/V sync params to apply |
Throws | |
---|---|
IllegalStateException |
if the internal player engine has not been initialized. |
IllegalArgumentException |
if params are not supported. |
void finalize ()
Called by the garbage collector on an object when garbage collection
determines that there are no more references to the object.
A subclass overrides the finalize
method to dispose of
system resources or to perform other cleanup.
The general contract of finalize
is that it is invoked
if and when the JavaTM virtual
machine has determined that there is no longer any
means by which this object can be accessed by any thread that has
not yet died, except as a result of an action taken by the
finalization of some other object or class which is ready to be
finalized. The finalize
method may take any action, including
making this object available again to other threads; the usual purpose
of finalize
, however, is to perform cleanup actions before
the object is irrevocably discarded. For example, the finalize method
for an object that represents an input/output connection might perform
explicit I/O transactions to break the connection before the object is
permanently discarded.
The finalize
method of class Object
performs no
special action; it simply returns normally. Subclasses of
Object
may override this definition.
The Java programming language does not guarantee which thread will
invoke the finalize
method for any given object. It is
guaranteed, however, that the thread that invokes finalize will not
be holding any user-visible synchronization locks when finalize is
invoked. If an uncaught exception is thrown by the finalize method,
the exception is ignored and finalization of that object terminates.
After the finalize
method has been invoked for an object, no
further action is taken until the Java virtual machine has again
determined that there is no longer any means by which this object can
be accessed by any thread that has not yet died, including possible
actions by other objects or classes which are ready to be finalized,
at which point the object may be discarded.
The finalize
method is never invoked more than once by a Java
virtual machine for any given object.
Any exception thrown by the finalize
method causes
the finalization of this object to be halted, but is otherwise
ignored.