我正在使用android NDK和FFmpeg本机库开发解码器。我使用Android工具为项目提供了本地支持,并且在videodecoder.cpp文件中有C代码。在文件中,下面的函数给出了这个问题

JNIEXPORT jint Java_ssrp_android_ffmpegdecoder_H264Decoder_consumeNalUnitsFromDirectBuffer(
        JNIEnv* env, jobject thiz, jobject nal_units, jint num_bytes,
        jlong pkt_pts) {
    DecoderContext *ctx = get_ctx(env, thiz);

    void *buf = NULL;
    if (nal_units == NULL) {
        D("Received null buffer, sending empty packet to decoder");
    } else {
        buf = env->GetDirectBufferAddress(nal_units);
        if (buf == NULL) {
            D("Error getting direct buffer address");
            return -1;
        }
    }

    AVPacket packet = {.data = (uint8_t*) buf, .size = num_bytes, .pts = pkt_pts };

    int frameFinished = 0;
    int res = avcodec_decode_video2(ctx->codec_ctx, ctx->src_frame,&frameFinished, &packet);

    if (frameFinished)
        ctx->frame_ready = 1;

    return res;
}

AVPacket packet = {.data = (uint8_t*) buf, .size = num_bytes, .pts = pkt_pts };
上面说“声明”对“AVPAcket”没有影响
int res = avcodec_decode_video2(ctx->codec_ctx, ctx->src_frame,&frameFinished, &packet);
上面说Invalid arguments 'Candidates are:int avcodec_decode_video2(AVCodecContext *, AVFrame *, int *, const AVPacket *)'

最佳答案

问题是

AVPacket packet = {.data = (uint8_t*) buf, .size = num_bytes, .pts = pkt_pts }

因为编译器不理解类型/初始化。
这将导致无效参数错误。
或许可以分成:
AVPacket packet;
packet.data = (uint8_t*) buf;
packet.size = num_bytes;
packet.pts = pkt_pts;

这将得到更清晰的错误输出。

10-08 11:34