MP4ReadSampleFromTime - Read a track sample based on a specified time
#include <mp4.h>
bool MP4ReadSampleFromEditTime(
MP4FileHandle hFile,
MP4TrackId trackId,
MP4Timestamp when,
u_int8_t** ppBytes,
u_int32_t* pNumBytes,
MP4Timestamp* pStartTime = NULL,
MP4Duration* pDuration = NULL,
MP4Duration* pRenderingOffset = NULL,
bool pIsSyncSample = NULL
);
Upon success, true (1). Upon an error, false (0).
MP4ReadSampleFromTime reads the sample corresponding to the time on the track timeline from the specified track. Typically this sample is then decoded in a codec dependent fashion and rendered in an appropriate fashion.
The argument, ppBytes, allows for two possible approaches for buffering:
If the calling application wishes to handle its own buffering it can set *ppBytes to the buffer it wishes to use. The calling application is responsible for ensuring that the buffer is large enough to hold the sample. This can be done by using either MP4GetSampleSize() or MP4GetTrackMaxSampleSize() to determine before-hand how large the receiving buffer must be.
If the value of *ppBytes is NULL, then an appropriately sized buffer is automatically malloc'ed for the sample data and *ppBytes set to this pointer. The calling application is responsible for free'ing this memory.
The last four arguments are pointers to variables that can receive optional sample information.
Typically for audio none of these are needed. MPEG audio such as MP3 or AAC has a fixed sample duration and every sample can be accessed at random.
For video, all of these optional values could be needed. MPEG video can be encoded at a variable frame rate, with only occasional random access points, and with "B frames" which cause the rendering (display) order of the video frames to differ from the storage/decoding order.
Other media types fall between these two extremes.
MP4(3) MP4ReadSample(3) MP4GetSampleIdFromTime(3) MP4ReadSampleFromEditTime(3)