将s16le的音频流转换为float类型

news/2025/2/25 19:04:38

这是一个将s16le格式音频文件转换为float类型并写入新文件的示例代码。


以下是代码的讲解:

  1. 定义WavHeader结构体,用于存储WAV文件头中的信息。
  2. 从命令行参数中获取输入和输出文件名(第一个参数代表程序自身,因此输入文件名为第二个参数,输出文件名为第三个参数)。
  3. 打开输入文件和输出文件,如果打开失败则返回错误码。
  4. 读取WAV文件头并检查其格式是否正确,如果不正确则返回错误码。
  5. 计算音频数据中的采样点数和每个采样点占用的字节数。
  6. 分配内存空间来存储音频数据,如果分配失败则返回错误码。
  7. 读取输入文件中的音频数据,并将每个采样点的值转换为float类型。
  8. 输出一些关于音频数据的基本信息。
  9. 将转换后的音频数据写入输出文件。
  10. 释放内存空间,关闭输入和输出文件,程序结束。
  11. 需要注意的是,在写入输出文件时,我们使用了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 -

http://www.niftyadmin.cn/n/197842.html

相关文章

智慧农业系统开发功能有哪些?

农业从古至今都是备受关注的话题&#xff0c;新时代背景下农业发展已经融合了互联网&#xff0c;数字化技术等新型发展方式&#xff0c;形成了农业物联网管控系统&#xff0c;让农业生产更加科技化、智能化、高效化&#xff0c;对农业可持续发展有巨大的推动作用。所以&#xf…

Android 环境配制

1.下载Andrioid SDK&#xff1a; 找到相应版本就可以下载了&#xff0c;安装按说明即可 https://www.androiddevtools.cn/ 组件安装 通过SDK Manager进行相应组件安装&#xff0c;SDK安装时&#xff0c;可以自动进入Manager安装页面&#xff0c;如果需要补安装其他组件&…

C 输入 输出

C 输入 & 输出 当我们提到输入时&#xff0c;这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入&#xff0c;并根据需要填充到程序中。 当我们提到输出时&#xff0c;这意味着要在屏幕上、打印机上或…

工程造价能不能预防超预算

决算超预算、预算超概算、概算超估算……工程造价总在超预算&#xff0c;这老大难问题到底该如何解决。 工程造价为何出现“三超”&#xff1f;要如何解决“三超”问题&#xff1f;首先我们先了解一下造成我国建设市场投资“三超”问题出现的原因。 项目的4个参与方 政府部门—…

【项目】Kafka

- 消息队列 消息队列是分布式系统中一个中间件&#xff0c;用于系统模块间进行通信。具有接收消息、存储消息、分发消息的功能。- RPC 和消息队列的区别 1、RPC 主要用来解决两个服务的远程通信问题&#xff0c;调远程像调用本地方法一样。是双向直接网络通讯。发出的调用一般会…

【Nowcoder-BC146.添加逗号 -OR63.删除公共字符】

Nowcoder-BC146.-OR63.Nowcoder-BC146.添加逗号Nowcoder-OR63.删除公共字符Nowcoder-BC146.添加逗号 题目&#xff1a;对于一个较大的整数 N(1<N<2,000,000,000) 比如 980364535&#xff0c;我们常常需要一位一位数这个数字是几位数&#xff0c;但是如果在这个数字每三位…

Redis(狂神)

一.概括 1.Redis是什么? Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 2.Redis能干什么 内存储存、…

Python自动录入ERP系统数据

大家好&#xff0c;我是毕加锁。 今天给大家带来的是用Python解决Excel问题的最佳姿势 文末送书&#xff01; 文末送书&#xff01; 文末送书&#xff01; 项目总体情况 软件&#xff1a;Pycharm 环境: Python 3.7.9(考虑到客户可能会有不同操作系统&#xff0c;为了兼容性…