使用 Android NDK 中的 Lame 函数 hip_decode 解码 mp3 return 0

Using Lame function hip_decode in Android NDK to decode mp3 return 0

我正在使用 Lame 的 mpglib 将 mp3 解码为 Android NDK 中的 PCM 以便播放。但是当我调用 hip_decode() 时,它会返回 0,这意味着 "need more data before we can complete the decode"。我不知道如何解决它。有人可以帮助我吗?这是我的代码:

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。所以我认为它应该可以用于字面解码。

昨天我遇到了同样的问题。是同样的问题,但使用 lame_enc.dll。我不知道如何解决这个返回的 0,这就是这个 post.

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

  2. 为 pcm 数据创建两个缓冲区,但比 mp3 缓冲区大: 无符号短[4096 * 100];

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

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

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

  6. 你说的对,它returns0,它在向你索要更多的数据。

  7. 您需要重复读取 4096 个字节并调用 hip_decode 直到它 returns 一个有效的样本数。

这是我程序的重要部分:

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 文件。

我希望这会有用。