PCM音频文件格式的头信息

2023-05-16

一个裸的PCM格式音频数据,如果不带头信息,不知道其采样率等相关信息,就无法用播放器播放出来。下面是默认的头信息格式:

//音频头部格式
struct wave_pcm_hdr
{
    char            riff[4];                        // = "RIFF"
    SR_DWORD        size_8;                         // = FileSize - 8
    char            wave[4];                        // = "WAVE"
    char            fmt[4];                         // = "fmt "
    SR_DWORD        dwFmtSize;                      // = 下一个结构体的大小 : 16

    SR_WORD         format_tag;              // = PCM : 1
    SR_WORD         channels;                // = 通道数 : 1
    SR_DWORD        samples_per_sec;         // = 采样率 : 8000 | 6000 | 11025 | 16000
    SR_DWORD        avg_bytes_per_sec;       // = 每秒字节数 : dwSamplesPerSec * wBitsPerSample / 8
    SR_WORD         block_align;             // = 每采样点字节数 : wBitsPerSample / 8
    SR_WORD         bits_per_sample;         // = 量化比特数: 8 | 16

    char            data[4];                 // = "data";
    SR_DWORD        data_size;               // = 纯数据长度 : FileSize - 44 
} ;

//默认音频头部数据
struct wave_pcm_hdr default_pcmwavhdr = 
{
    { 'R', 'I', 'F', 'F' },
    0,
    {'W', 'A', 'V', 'E'},
    {'f', 'm', 't', ' '},
    16,
    1,
    1,
    16000,
    32000,
    2,
    16,
    {'d', 'a', 't', 'a'},
    0  
};

将头信息写入音频数据中:

struct wave_pcm_hdr pcmwavhdr = default_pcmwavhdr;

fwrite(&pcmwavhdr, sizeof(pcmwavhdr) ,1, fp);
while (1) 
{
    const void *data = QTTSAudioGet(sess_id, &audio_len, &synth_status, &ret);
    if (NULL != data)
    {
        fwrite(data, audio_len, 1, fp);
        pcmwavhdr.data_size += audio_len;//修正pcm数据的大小
    }
    if (synth_status == MSP_TTS_FLAG_DATA_END || ret != 0) 
        break;
}//合成状态synth_status取值可参考开发文档

//修正pcm文件头数据的大小
pcmwavhdr.size_8 += pcmwavhdr.data_size + 36;

//将修正过的数据写回文件头部
fseek(fp, 4, 0);
fwrite(&pcmwavhdr.size_8,sizeof(pcmwavhdr.size_8), 1, fp);
fseek(fp, 40, 0);
fwrite(&pcmwavhdr.data_size,sizeof(pcmwavhdr.data_size), 1, fp);
fclose(fp);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCM音频文件格式的头信息 的相关文章

  • 语音处理:Python实现wav与pcm文件格式转换

    语音处理 xff1a Python实现wav与pcm格式转换 知识点wav转pcmpcm转wav参考资料 知识点 wave包的读写及参数设置文件路径操作拼接音频相关参数了解 wav文件存储的参数信息有 xff1a 通道数 采样率 位深 xf
  • wav转pcm格式

    批量wav格式音频转换pcm格式音频 import os path 61 39 audio 1 39 原始音频路径 new path pcm 61 39 audio new pcm 39 存储pcm音频路径 dir path 61 os g
  • python wav转pcm

    usr bin env python encoding utf 8 39 39 39 64 文件 wav2pcm py 64 说明 64 时间 2021 07 08 14 53 48 64 作者 shitao li 64 版本 1 0 39
  • pcm_get_htimestamp fail

    在获取pcm的时间戳用于音频同步 第一次使用pcm get htimestamp的时候 提示fail 导致无法获取时间 和可用的帧数 分析 由于在pcm start 后 直接使用pcm get htimestamp 进行了获取 但是这时候硬
  • python 使用pydub将mp3流转为pcm代码

    你可以使用Python中的pydub库来将MP3流转换为PCM代码 要使用pydub xff0c 你需要安装ffmpeg xff0c 然后你可以轻松访问pydub的API xff0c 如下所示 xff1a audio file 61 Aud
  • PCM数据格式

    什么是PCM PCM全称Pulse Code Modulation xff0c 翻译一下是脉冲调制编码 其实大可以不用关心英文释义 xff0c 之所以这么命名是因为一些历史原因 在音视频中 xff0c PCM是一种用数字表示采样模拟信号的方
  • PCM音频压缩A-Law算法,uLaw

    参考相关 xff1a 关于pcm音频头与a law音频头的互换代码 http blog csdn net fjhyy article details 6593049 https baike baidu com item A E5 BE 8B
  • Qt之实现录音播放及raw(pcm)转wav格式

    简述 在上一篇 Qt 之 WAV文件解析 中详细地分析了wav格式文件的文件头信息 通过QAudioInput实现录音功能 xff0c 但是录音生成的文件并不能用播放器打开 xff0c 就算更改后缀名也无法识别 xff08 有时候下载的一些
  • PCM音频 && I2S音频

    PCM Pulse Code Modulation 也被称为脉码编码调制 PCM中的声音数据没有被压缩 如果是单声道的文件 采样数据按时间的先后顺序依次存入 关于PCM的详细细节可以参考http blog csdn net yue76038
  • PDM信号与PCM信号

    总结一下PDM信号与PCM信号 PDM PDM 脉冲密度调制 模拟信号的幅值使用输出脉冲对应区域的密度表示 PWM波是PDM波转换频率固定的一种特例 在实际输出的一位数据流中 只存在 1 和 0 1的密度越大 代表该区域对应的模拟信号幅值越
  • 音频PCM数据的单声道、双声道之间的转换

    在使用tinyalsa处理PCM音频数据时发现该设备只能以双声道形式打开设备 tinypcminfo工具可以查看设备信息 out和in里面channels 最大和最小值都是2 但是实际使用中有时候又需要声卡采集和播放单声道数据怎么办 那就只
  • AudioTrack - 使用 jlayer(java mp3 解码器)的短数组到字节数组失真

    我使用 jLayer 来解码 MP3 数据 通过以下调用 SampleBuffer output SampleBuffer decoder decodeFrame frameHeader bitstream 此调用返回解码后的数据 返回一个
  • 我可以从 MediaPlayer 或 SoundPool 获取原始 PCM 数据吗?

    我使用 eclipse 和 android sdk 4 0 3 api lvl 15 创建一个基本的音乐播放器应用程序 我读了一下 发现有两个主要的类来播放声音 媒体播放器和声音池 SoundPool 在声音优先级和播放声音的速率方面具有更
  • 使用AndroidRecord API录制的音频无法播放

    正在开发一个具有记录用户语音功能的 Android 应用程序 为此 我使用了 AndroidRecord Audio API 目前pcm文件 录制的音频文件 recordedAudio pcm 已在sd卡中成功生成 但我无法播放该文件 我也
  • PCM -> AAC(编码器) -> PCM(解码器)实时且正确优化

    我正在尝试实施 AudioRecord MIC gt PCM gt AAC Encoder AAC gt PCM Decode gt AudioTrack SPEAKER with MediaCodec在 Android 4 1 API16
  • 如何从WAV样本数据中提取频率?

    我正在用 c 开发一个应用程序来读取简单的 PCM WAV 文件 我的问题是 我应该如何解释数据块中的样本 以便提取样本的频率 给定一个 WAV 示例 原始数据如何表示频率 例如 这个数据块 24 17 1e f3 对于立体声 16 位 左
  • 将 PCM 波形数据转换为 numpy 数组,反之亦然

    情况 我正在使用 WebRTC 中的 VAD 语音活动检测 WebRTC VAD https github com wiseman py webrtcvad Python 适配器 这示例实现 https github com wiseman
  • 从AVPlayer获取HLS的PCM数据

    这个问题在过去几年里似乎被问过几次 但没有人回答 我正在尝试处理来自 HLS 的 PCM 数据 并且必须使用 AVPlayer 这篇文章利用了本地文件https chritto wordpress com 2013 01 07 proces
  • 如何改变PCM数据流的音量(实验失败)

    Solved 我的代码以前从未用于处理有符号值 因此字节 gt 短转换错误地处理了符号位 这样做正确地解决了问题 问题是 我正在尝试更改 PCM 数据流的音量 我可以从立体声文件中提取单通道数据 通过跳过 复制它们 插入零 等方式对样本进行
  • 如何使用 JavaSound (Java, Java Sound) 从 .wave 文件读取信息

    您好 我需要从 wave 文件中读取采样率 信号频率和幅度 我怎样才能使用 JavaSound 做到这一点 您可以通过获取句柄来获取采样率AudioFormat object AudioInputStream audioInputStrea

随机推荐

  • 仿照爱时间app写的时钟 自定义view

    MyClockView MyClockView 仿照 爱时间app 写的自定义时间控件 爱时间的 控件 我写的控件 可以看到我写的在指针 刻度上面 是比他要精细一些的 后面的点击事件 还有中间文字的绘制 都是一些套路 我的时间也不够多 就不
  • dagger2简单使用与理解笔记

    文章目录 使用dagger2好处具体案例查看github 1 使用dagger2注入基本使用流程概念 2 dagger2中各种注解基本使用引入dagger20 写两个对象 用来实际操作的1 写module类 注解Module Provide
  • electron调用dll文件

    Electron 对系统层能力的使用可能比较弱 xff0c 此时需要求助 Python C 43 43 C 等语言 xff0c 通过 ffi napi 库可以让 Node js 使用 C 43 43 dll xff0c 通过 electro
  • 动态库和静态库的区别

    什么是库文件 一般来说 一个程序 通常都会包含目标文件和若干个库文件 经过汇编得到的目标文件再经过和库文件的链接 就能构成可执行文件 库文件像是一个代码仓库或代码组件的集合 为目标文件提供可直接使用的变量 函数 类等 库文件包含了静态链接库
  • reactor/proactor模型简介

    Reactor和preactor都是IO多路复用模式 xff0c 一般地 I O多路复用机制都依赖于一个事件多路分离器 Event Demultiplexer 分离器对象可将来自事件源的I O事件分离出来 xff0c 并分发到对应的read
  • c语言中的带参宏定义

    C语言允许宏带有参数 在宏定义中的参数称为形式参数 xff0c 在宏调用中的参数称为实际参数 xff0c 这点和函数有些类似 对带参数的宏 xff0c 宏展开和用实参替代形参 xff0c 发生在预处理阶段 示例1 xff1a define
  • ZCU102 Zynq MPSoC IP设置与说明

    目录 1 前言2 设置与说明2 1 PS UltraScale 43 Block Design2 2 I O Configuration2 2 1 Bank0 3电压 xff1a 2 2 2 Low SpeedQSPISD卡CANI2CPM
  • ROS下使用激光雷达RPLIDAR-A2进行SLAM完成地图的构建

    想要进行一个完整的地图建立离不开以下几个模块 xff1a 1 坐标 2 激光数据 3 绘图算法 ROS工程可以从我的GitHub上面下载 xff1a https github com LJianlin ROS SLAM Gmapping 下
  • C 语言Socket 实现http 带参数的POST请求

    本文叙述C语言中结合socket 如何实现http POST请求 xff0c 对于http协议相关内容可以查看HTTP协议详解 对于不带参数的post请求 xff0c 只需要按照http格式发送即可 下面以带参数的POST请求为例 1 C
  • 【学习C++】1.开始学习C++

    从今天开始学习C 43 43 xff0c 争取一年之内把 C 43 43 Primer Plus 看上两遍 xff0c 平均一周看一章 xff0c 并做课后对应习题 今天把 C 43 43 Primer Plus 的第二章看完了 xff0c
  • Ubuntu下安装make

    方法一 xff1a xff08 自动安装 xff09 1 进入root权限 xff1a su root 2 更新安装列表 xff1a apt get update 3 安装make xff1a apt get install ubuntu
  • nginx源码分析之http解码实现

    分析nginx是如何解析并且存储http请求的 对非法甚至恶意请求的识别能力和处理方式 可以发现nginx采用状态机来解析http协议 xff0c 有一定容错能力 xff0c 但并不全面 相关配置 跟解码有关的配置 merge slashe
  • 经纬高坐标系-ECEF坐标系-ENU坐标系

    无人机搭载的RTK获得的经纬高坐标要转换为东北天坐标 xff0c 才能用于局部的导航和定位 为了这个目的 xff0c 查阅资料 xff0c 越查越懵逼 xff0c 竟然这么多的坐标系 xff0c 略懂之后 xff0c 将学到的信息记录如下
  • Docker基础操作

    安装curl时报错 curl Depends libcurl3 gnutls 61 7 47 0 1ubuntu2 12 but 7 58 0 2ubuntu3 6 is to be installed sudo apt get purge
  • 1. COM是一个更好的C++

    看COM本质论做的总结 1 1 软件分发和C 43 43 class FastString span class token punctuation span span class token keyword char span span
  • 2.COM接口

    2 1 再谈接口与实现 其实从上一章 COM是个更好的C 43 43 可以看出 xff0c COM最重要的就是将接口与实现分离 上一章中接口定义头文件中采用C 43 43 抽象类的形式 xff0c 如果调用方是C 43 43 环境当然不会有
  • [QT]QMessageBox 的四种用法

    之前的一些QT笔记 xff0c 整理一下 void MainWindow on info clicked info QMessageBox information this 34 Title 34 34 Text 34 void MainW
  • svn执行update,却被告知database is locked

    svn执行update xff0c 却被告知database is locked xff01 执行 svn update xff0c 却抛出个错误警报 xff1a svn E200033 database is locked executi
  • ffmpeg解码RTSP/TCP视频流H.264(QT界面显示视频画面)

    源码下载地址 http download csdn net detail liukang325 9489952 我用的ffmpeg版本为 ffmpeg 2 1 8 tar bz2 版本低了恐怕有些头文件和API找不到 在Linux下解压后编
  • PCM音频文件格式的头信息

    一个裸的PCM格式音频数据 xff0c 如果不带头信息 xff0c 不知道其采样率等相关信息 xff0c 就无法用播放器播放出来 下面是默认的头信息格式 xff1a span class hljs comment 音频头部格式 span s