1

我花了一整天的时间在这上面,它让我发疯

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

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

我试图构建 madplayer,但我无法很好地 id3tag.h 并且没有关于使用 libmad 的文档或示例,我可以找到

跛脚看起来太大了

我可以链接并完成 .lib 快速解决方案的任何想法

谢谢,史蒂夫

4

2 回答 2

5

mpg123 没问题。我可以看到您在获取静态库 (.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

但请注意,“框架和引用”属性页用于设置对 .NET Framework 程序集、COM 组件或外部项目 ( MSDN ) 的引用,在您的情况下,您应该在项目中指定额外的链接器依赖项 [Configuration Properties =>链接器 => 输入 => 附加依赖项]。

于 2013-03-05T14:39:37.473 回答
1

亚历山大的回答很好,非常感谢

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

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

除此之外,它工作得很好。我不敢相信这些信息几年前不在互联网上。感谢亚历山大,感谢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();

}
于 2013-03-06T01:45:28.663 回答