广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现将s16le的音频流转换为float类型
  • 540
分享到

C++怎么实现将s16le的音频流转换为float类型

2023-07-06 00:07:32 540人浏览 安东尼
摘要

本文小编为大家详细介绍“c++怎么实现将s16le的音频流转换为float类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现将s16le的音频流转换为float类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来

本文小编为大家详细介绍“c++怎么实现将s16le的音频流转换为float类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现将s16le的音频流转换为float类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

以下是代码的讲解:

定义WavHeader结构体,用于存储WAV文件头中的信息。

从命令行参数中获取输入和输出文件名(第一个参数代表程序自身,因此输入文件名为第二个参数,输出文件名为第三个参数)。

打开输入文件和输出文件,如果打开失败则返回错误码。

读取WAV文件头并检查其格式是否正确,如果不正确则返回错误码。

计算音频数据中的采样点数和每个采样点占用的字节数。

分配内存空间来存储音频数据,如果分配失败则返回错误码。

读取输入文件中的音频数据,并将每个采样点的值转换为float类型。

输出一些关于音频数据的基本信息。

将转换后的音频数据写入输出文件。

释放内存空间,关闭输入和输出文件,程序结束。

需要注意的是,在写入输出文件时,我们使用了fwrite函数,将整个音频数据数组写入文件。

示例代码

#include <stdio.h>#include <stdlib.h>typedef struct {    char chunkId[4];    int chunkSize;    char fORMat[4];    char subchunk1Id[4];    int subchunk1Size;    short audioFormat;    short numChannels;    int sampleRate;    int byteRate;    short blockAlign;    short bitsPerSample;    char subchunk2Id[4];    int subchunk2Size;} WavHeader;int main(int arGC, char**argv) {    const char* infile = argv[1];    FILE* infp = fopen(infile, "rb");    if (!infp) {        printf("Failed to open input file %s.\n", infile);        return 1;    }    const char* outfile = argv[2];    FILE* outfp = fopen(outfile, "wb");    if (!outfp) {        printf("Failed to open input file %s.\n", infile);        return 1;    }    // Read WAV file header    WavHeader wavHeader;    fread(&wavHeader, sizeof(WavHeader), 1, infp);    if (strncmp(wavHeader.chunkId, "RIFF", 4) != 0 ||        strncmp(wavHeader.format, "WAVE", 4) != 0 ||        strncmp(wavHeader.subchunk1Id, "fmt ", 4) != 0 ||        wavHeader.audioFormat != 1) {        printf("Invalid WAV file.\n");        fclose(infp);        return 1;    }    // Calculate number of samples and bytes per sample    int numSamples = wavHeader.subchunk2Size / (wavHeader.numChannels * (wavHeader.bitsPerSample / 8));    int bytesPerSample = wavHeader.bitsPerSample / 8;    // Allocate memory for audio data    float* buffer = (float*) malloc(numSamples * wavHeader.numChannels * sizeof(float));    if (!buffer) {        printf("Failed to allocate memory.\n");        fclose(infp);        return 1;    }    // Read audio data and convert to float    int i, j;    short sampleValue;    for (i = 0; i < numSamples; i++) {        for (j = 0; j < wavHeader.numChannels; j++) {            fread(&sampleValue, bytesPerSample, 1, infp);            buffer[i * wavHeader.numChannels + j] = (float) sampleValue / 32768.0f;        }    }    // Print some information about the audio data    printf("Input file: %s\n", infile);    printf("Format: %d-channel s16le, %d Hz\n", wavHeader.numChannels, wavHeader.sampleRate);    printf("Duration: %.3f seconds\n", (float) numSamples / wavHeader.sampleRate);    // write to output file.    fwrite(buffer, numSamples * wavHeader.numChannels * sizeof(float), 1, outfp);    // Clean up    free(buffer);    fclose(infp);    fclose(outfp);    return 0;}

编译后测试

./s16letofloat chendu-96k.wav chendu-96kflt.pcm

FFmpeg 播放

ffmpeg -ar 96000 -ac 2 -f f32le -i chendu-96kflt.pcm -f wav pipe:1 | ffplay -

读到这里,这篇“C++怎么实现将s16le的音频流转换为float类型”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++怎么实现将s16le的音频流转换为float类型

本文链接: https://www.lsjlt.com/news/356796.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现将s16le的音频流转换为float类型
    这是一个将s16le格式音频文件转换为float类型并写入新文件的示例代码。 以下是代码的讲解: 定义WavHeader结构体,用于存储WAV文件头中的信息。 从命令行参数中获取输入...
    99+
    2023-05-15
    C++实现音频流转float类型 C++音频流转float类型 C++音频流转float C++音频
  • C++怎么实现将s16le的音频流转换为float类型
    本文小编为大家详细介绍“C++怎么实现将s16le的音频流转换为float类型”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现将s16le的音频流转换为float类型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-06
  • java怎么实现将Object类型转换为int类型
    这篇文章主要介绍“java怎么实现将Object类型转换为int类型”,在日常操作中,相信很多人在java怎么实现将Object类型转换为int类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么实...
    99+
    2023-06-20
  • C#怎么实现数组元素的数据类型转换
    这篇文章主要介绍“C#怎么实现数组元素的数据类型转换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#怎么实现数组元素的数据类型转换”文章能帮助大家解决问题。一、场景假设假设有一串字符串如下所示,字...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作