在Android中使用swr_convert时的乱码音频解码

时间:2013-12-30 23:30:52

标签: android c ffmpeg java-native-interface

我正在使用以下C函数来解码Android中的数据包(使用JNI)。当我播放mp3文件时,代码工作正常,而wma文件导致音频不稳定。我怀疑问题可能出在“swr_convert”函数和我正在使用的data_size但我不确定。有谁知道为什么会发生这种情况?

int decodeFrameFromPacket(AVPacket *aPacket) {
    int n;
    AVPacket *pkt = aPacket;
    AVFrame *decoded_frame = NULL;
    int got_frame = 0;

    if (aPacket->stream_index == global_audio_state->audio_stream) {

        if (!decoded_frame) {
            if (!(decoded_frame = avcodec_alloc_frame())) {
                __android_log_print(ANDROID_LOG_INFO, TAG, "Could not allocate audio frame\n");
                return -2;
            }
        }

        if (avcodec_decode_audio4(global_audio_state->audio_st->codec, decoded_frame, &got_frame, aPacket) < 0) {
            __android_log_print(ANDROID_LOG_INFO, TAG, "Error while decoding\n");
            return -2;
        }

        int data_size = 0;

        if (got_frame) {
            /* if a frame has been decoded, output it */
            data_size = av_samples_get_buffer_size(NULL, global_audio_state->audio_st->codec->channels,
                    decoded_frame->nb_samples,
                    global_audio_state->audio_st->codec->sample_fmt, 1);
        }

        swr_convert(global_audio_state->swr, (uint8_t **) &gAudioFrameRefBuffer, decoded_frame->nb_samples, (uint8_t const **) decoded_frame->data, decoded_frame->nb_samples); 

        avcodec_free_frame(&decoded_frame);

        gAudioFrameDataLengthRefBuffer[0] = data_size;
        return AUDIO_DATA_ID;
    }

    return 0;
}

0 个答案:

没有答案