【音视频开发(一)】---MediaCodec NDK解码

该博客介绍了如何在Android平台上使用MediaCodec进行H264视频流的解码。代码详细展示了初始化解码器、解码线程的运行逻辑以及解码过程,包括输入数据的处理、解码器的配置、输出缓冲区的管理和图像数据的释放。此外,还包含了时间戳的获取、数据入队和解码器的去初始化等辅助功能。
摘要由CSDN通过智能技术生成

初始化解码器:


void VideoDecoder::Init(int width, int height, int buffNumber)
{
    DM_NATIVE_PRINT("VideoDecoder::Init Start... %dx%d", width, height);
    imageW = width;
    imageH = height;

    //带解码图像队列个数
    mMaxBufferNumber = buffNumber;
    
    mInputDataList = new DmSyncQueue<InputData_t>(buffNumber);
    mOutputDataList = new DmSyncQueue<InputData_t>(buffNumber);
    //解码器为H264解码类型
    const char* mine = "video/avc";
    //创建解码器
    mMediaCodec =  AMediaCodec_createDecoderByType(mine);

    AMediaFormat* videoFormat = AMediaFormat_new();
    AMediaFormat_setString(videoFormat, "mime", mine);
    AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_WIDTH, width); // 视频宽度
    AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_HEIGHT, height); // 视频高度
    //设置PPS和SPS
    if (videoCsd0 != NULL) {
        AMediaFormat_setBuffer(videoFormat, "csd-0", videoCsd0, videoCsd0Size);
        DM_NATIVE_PRINT(" videoCsd0 = %d\n", videoCsd0Size);
    }
    if (videoCsd1 != NULL) {
        AMediaFormat_setBuffer(videoFormat, "csd-1", videoCsd1, videoCsd1Size);
        DM_NATIVE_PRINT(" videoCsd1 = %d\n", videoCsd1Size);
    }
    //不需要设置图像格式
    //AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_COLOR_FORMAT, 21);
    //配置解码器
    media_status_t status = AMediaCodec_configure(mMediaCodec, videoFormat, NULL, NULL, 0);
    if (status != AMEDIA_OK)
    {
        DM_NATIVE_ERR_PRINT("AMediaCodec_configure() failed with error %i for format %u", (int)status, 21);
    } else {
        //开始解码器状态机
        status = AMediaCodec_start(mMediaCodec);
        if (status != AMEDIA_OK)
        {
            DM_NATIVE_ERR_PRINT("AMediaCodec_start: Could not start decoder.");
        }
        run = true;
        //创建解码线程
        mLoopThread = new std::thread(&Vide
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值