NdkMediaCodec 解码mp4
#include <media/NdkMediaExtractor.h>
#include <media/NdkMediaCodec.h>
#include <media/NdkMediaFormat.h>
void decodeMP4(const char* mp4Path) {
AMediaExtractor* extractor = AMediaExtractor_new();
AMediaExtractor_setDataSource(extractor, mp4Path);
int numTracks = AMediaExtractor_getTrackCount(extractor);
AMediaCodec* codec = NULL;
for (int i = 0; i < numTracks; i++) {
AMediaFormat* format = AMediaExtractor_getTrackFormat(extractor, i);
const char* mime;
if (!AMediaFormat_getString(format, AMEDIAFORMAT_KEY_MIME, &mime)) {
// Error handling
}
if (strncmp(mime, "video/", 6) == 0) {
AMediaExtractor_selectTrack(extractor, i);
codec = AMediaCodec_createDecoderByType(mime);
AMediaCodec_configure(codec, format, NULL, NULL, 0);
break;
}
AMediaFormat_delete(format);
}
if (codec == NULL) {
// Error handling
}
AMediaCodec_start(codec);
AMediaCodecBufferInfo info;
while (true) {
ssize_t bufidx = AMediaCodec_dequeueOutputBuffer(codec, &info, 2000);
if (bufidx >= 0) {
size_t bufsize;
uint8_t* buf = AMediaCodec_getOutputBuffer(codec, bufidx, &bufsize);
// Do something with the output buffer...
AMediaCodec_releaseOutputBuffer(codec, bufidx, false);
} else if (bufidx == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED) {
// Handle format change
} else if (bufidx == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) {
// Handle buffer change
} else if (bufidx == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
// Handle try again later
} else {
// Error handling
}
if (info.flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) {
break;
}
}
AMediaCodec_stop(codec);
AMediaCodec_delete(codec);
AMediaExtractor_delete(extractor);
}