NdkMediaCodec 解码mp4

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);
}

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/132632480
今日推荐