li-heng 2023-08-16 19:11 采纳率: 81.5%
浏览 12
已结题

使用C++把PCM转换为MP3后,播放声音有问题

使用C++把PCM转换为MP3后,播放声音有问题,我使用的sox库,代码如下:


#include <sox.h>


    //输入和输出文件路径
    std::filesystem::path pcmPath(inputFilePath);
    std::filesystem::path outputFilePath = pcmPath.replace_extension(".mp3");


    //设置 输入音频
    sox_signalinfo_t inSignalInfo;
    inSignalInfo.rate = 16000;
    inSignalInfo.channels = 1;
    inSignalInfo.length = SOX_IGNORE_LENGTH;

    //输入音频的编码信息
    sox_encodinginfo_t inEncodingInfo;
    inEncodingInfo.encoding = SOX_ENCODING_SIGN2;
    inEncodingInfo.bits_per_sample = 16;
    inEncodingInfo.compression = 1.0;

    sox_format_t* inFormat = sox_open_read(inputFilePath, &inSignalInfo, &inEncodingInfo, "raw");
    if (!inFormat) {
        sox_quit();
        return 1;
    }

    sox_format_t* outFormat = sox_open_write(outputFilePath.c_str(), &inFormat->signal, nullptr, "mp3", nullptr, nullptr);
    if (!outFormat) {
        std::cerr << "Failed to open output file." << std::endl;
        sox_close(inFormat);
        return 1;
    }

    sox_effects_chain_t* effectsChain = sox_create_effects_chain(&inFormat->encoding, &outFormat->encoding);
    if (!effectsChain) {
        std::cerr << "Failed to create effects chain." << std::endl;
        sox_close(outFormat);
        sox_close(inFormat);
        return 1;
    }

    // Add "input" effect
    sox_effect_t* inputEffect = sox_create_effect(sox_find_effect("input"));
    char *inputArgs[] = {reinterpret_cast<char *>(inFormat)};
    sox_effect_options(inputEffect, 1, inputArgs);
    sox_add_effect(effectsChain, inputEffect, &inSignalInfo, &inSignalInfo);

    // Add "output" effect
    sox_effect_t* outputEffect = sox_create_effect(sox_find_effect("output"));
    char *outputArgs[] = {reinterpret_cast<char *>(outFormat)};
    sox_effect_options(outputEffect, 1, outputArgs);
    sox_add_effect(effectsChain, outputEffect, &inSignalInfo, &inSignalInfo);


    // 运行效果链
    int result = sox_flow_effects(effectsChain, nullptr, nullptr);

    if (result != SOX_SUCCESS) {
        std::cerr << "Error during effects processing: " << sox_strerror(result) << std::endl;
        // 在这里可以添加其他处理逻辑
    }

    // 清理资源
    sox_delete_effects_chain(effectsChain);

    sox_close(outFormat);
    sox_close(inFormat);

    std::cout << "Audio conversion successful." << std::endl;

求同学们帮忙定位原因,看下代码,是哪里没有写对呢

  • 写回答

6条回答 默认 最新

  • DarrenPig 2023-08-16 19:35
    关注

    你的代码中使用了sox库将PCM文件转换为MP3格式。在播放声音时遇到问题,这可能是由于以下几个原因导致的:

    1. 编码设置问题:在输入音频的编码信息中,你指定了16位的采样精度和SOX_ENCODING_SIGN2编码,但是MP3音频通常使用更高的压缩率和其他编码方式。请确保设置正确的编码参数以匹配所需的MP3格式。

    2. sox库版本问题:不同版本的sox库可能存在一些兼容性问题或错误。请确保你使用的是最新的sox库,并参考官方文档或社区支持寻求解决方案。

    3. 输入音频格式不支持:sox库对输入的音频格式有一些要求。请确保输入的PCM文件格式与sox库兼容。如果文件格式不符合要求,可能需要进行预处理或者使用其他工具将其转换为可接受的格式。

    4. 依赖库缺失:sox库可能依赖其他库来完成音频转换和处理操作。如果缺少某些依赖库,可能会导致功能异常或错误。请确保你已正确安装和链接所有必需的依赖库。

    解决问题的方法包括:

    1. 检查和调整输入音频的编码参数,以确保其与所需的MP3格式匹配。

    2. 更新sox库到最新版本,并查阅官方文档或社区支持,了解是否存在已知问题或解决方案。

    3. 确认输入音频文件的格式是否符合sox库的要求,如有需要,进行格式转换或预处理。

    4. 检查并安装所需的依赖库,确保它们与sox库正常链接。

    如果仍然遇到问题,请提供更详细的错误信息和运行环境,以便我能更好地帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月18日
  • 修改了问题 8月16日
  • 创建了问题 8月16日