windows mp3解码库c c ++

时间:2013-03-05 14:09:10

标签: c++ windows mp3 decode

我花了一整天的时间在这上面并且让我疯狂

有人知道将mp3解码为简单的16位pcm(波形)文件的简单方法吗?我需要一些我可以随商业计划发货的东西所以我更喜欢.lib

我找到了libmpg123.dll,但我无法弄清楚如何让我的程序在msvc 2010中与dll链接。我知道我需要添加一个引用但是当我点击“添加新引用”时我得到的是带有项目名称和项目目录标题的空对话框,无需单击。我尝试使用lib工具将.dll转换为.lib,但一直抱怨.def文件格式不好。

我尝试构建madplayer,但我不能使用id3tag.h并且没有关于使用libmad的文档或示例我可以找到

Lame看起来太大了

快速解决.lib问题的任何想法都可以链接并完成它

谢谢,史蒂夫

2 个答案:

答案 0 :(得分:4)

mpg123没问题。我可以看到你在获取静态库(.lib)方面遇到了麻烦。

有两种获取lib的方法:

  1. 构建源代码。它更灵活,但有点棘手。如果您下载源,您可以通过路径找到VS2010的端口:ports \ MSVC ++ \ 2010。但在这种情况下,您将面临安装YASM和使用构建配置的问题(似乎在源代码包中未正确调整配置)。
  2. 通过转换.def文件来使用lib工具。您不需要源,因为二进制包已包含.h和.def文件。我将详细解释:

    1. 下载二进制文件(win32win64),然后解压缩到D:\mpg123文件夹。
    2. 从开始运行 - > Microsoft Visual Studio 2010 - > Visual Studio工具 - > Visual Studio命令提示符(2010)。
    3. 转到您的文件夹cd D:\mpg123D:并运行以下行:lib /def:libmpg123-0.dll.def(或调用def文件)。
    4. 现在您的文件夹中有所需的.lib文件libmpg123-0.dll.lib
  3. 但请注意,'Framework and References'属性页用于设置对.NET Framework程序集,COM组件或外部项目(MSDN)的引用,在您的情况下,您应该指定其他链接器依赖项您的项目[Configuration Properties =>链接器=>输入=>附加依赖]。

答案 1 :(得分:1)

Olexander的答案很有效,非常感谢你

当你下载mpg123-1.15.1-x86.zip时,我有一件小事要补充

你会看到libmpg123-0.dll(dll)和libmpg123-0.dll.def用于制作.lib的东西,如上所述。最好将名称更改为libmpg123-0.def,否则会查找名为libmpg123-0.dll的dll,这不是很好

除此之外,它很有效。几年前我无法相信这些信息不在互联网上。感谢Olexander并感谢stackoverflow

仅供参考,这是一个使用mpg123的简单mp3解码器

#include "mpg123/mpg123.h"

#define INBUFF  16384
#define OUTBUFF 32768


void loadMp3File(const char* filename)
{
    mpg123_handle *mh;
    unsigned char *buffer;
    size_t buffer_size;
    size_t done;
    int err;

    int channels, encoding;
    long rate;

    mpg123_init();
    mh = mpg123_new(NULL, &err);
    buffer_size = mpg123_outblock(mh);
    buffer = (unsigned char*) malloc(buffer_size * sizeof(unsigned char));

    /* open the file and get the decoding format */
    mpg123_open(mh, filename);
    mpg123_getformat(mh, &rate, &channels, &encoding);

    /* set the output format and open the output device */
    int m_bits = mpg123_encsize(encoding);
    int m_rate = rate;
    int m_channels = channels;


    /* decode and play */
    for (int totalBtyes = 0 ; mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK ; ) {
        totalBtyes += done;
    }


    /* clean up */
    free(buffer);
    mpg123_close(mh);
    mpg123_delete(mh);
    mpg123_exit();

}