在Android NDK中使用Lame函数hip_decode来解码mp3返回0

时间:2015-02-13 18:49:46

标签: android-ndk mp3 decode lame

我正在使用Lame的mpglib在Android NDK中将mp3解码为PCM进行播放。但是当我调用hip_decode()时,它会返回0,这意味着“在我们完成解码之前需要更多数据”。我不知道如何解决它。有人可以帮助我吗?这是我的代码:

void CBufferWrapper::ConvertMp3toPCM (AAssetManager* mgr, const char *filename){

    Print ("ConvertMp3toPCM:file:%s", filename);
    AAsset* asset = AAssetManager_open (mgr, filename, AASSET_MODE_UNKNOWN);
    // the asset might not be found
    assert (asset != NULL);

    // open asset as file descriptor
    off_t start, length;
    int fd = AAsset_openFileDescriptor (asset, &start, &length);
    assert (0 <= fd);
    long size = AAsset_getLength (asset);
    char* buffer = (char*)malloc (sizeof(char)*size);
    memset (buffer, 0, size*sizeof(char));
    AAsset_read (asset, buffer, size);
    AAsset_close (asset);

    hip_t ht = hip_decode_init ();
    int count = hip_decode (ht, (unsigned char*)buffer, size, pcm_l, pcm_r);
    free (buffer);
    Print ("ConvertMp3toPCM: length:%ld,pcmcount=%d",length, count);
}

我使用MACRO“HAVE_MPGLIB”在NDK中编译Lame。所以我认为它应该按字面解码。

1 个答案:

答案 0 :(得分:1)

昨天我遇到了同样的问题。是同样的问题,但使用lame_enc.dll。我不知道怎么解决这个0返回,这就是这篇帖子的原因。

  1. 创建一个缓冲区来放置mp3数据:unsigned char mp3Data [4096]

  2. 为pcm数据创建两个缓冲区,但大于mp3一个: unsigned short [4096 * 100];

  3. 打开mp3文件并初始化hip。

  4. 现在,输入do while循环,直到读取的字节数为0(文件末尾)。

  5. 在循环内部将4096个字节读入mp3Data并调用hip_decode hip_decode(ht,mp3Data,bytesRead,lpcm,rpcm);

  6. 你是对的,它返回0.它要求你提供更多数据。

  7. 您需要重复读取4096个字节并调用hip_decode,直到它返回有效的样本编号。

  8. 以下是我的计划的重要部分:

    int total = 0;
        int hecho = 0;
        int leido = 0;
        int lon = 0;
        int x;
        do
        {
        total = fread(mp3b, 1, MAXIMO, fich);
        leido += total;
        x = hip_decode(hgf, mp3b, total, izquierda, derecha);
        if(x > 0)
        {
            int tamanio;
            int y;
            tamanio = 1.45 * x + 9200;
            unsigned char * bu = (unsigned char *) malloc(tamanio);
            y = lame_encode_buffer(lamglofla, izquierda, derecha, x, bu, tamanio);
            fwrite(bu, 1, y, fichs);
            free(bu);
        }
        }while(total > 0);
    

    我的程序解码一个mp3文件,并将输出编码为另一个mp3文件。

    我希望这可能有用。