------------------------------------全系列文章目录------------------------------------

  • PCM(Pulse Code Modulation,脉冲编码调制),PCM音频数据是指经过采样、量化、编码转换成的未压缩数字音频数据。

  • WAV最常见的声音文件格式之一,是微软公司专门为Windows开发的一种标准数字音频文件,该文件能记录各种单声道或立体声的声音信息,并能保证声音不失真

  • WAV格式组成

    • RIFF(Resource Interchange File Format,资源交换档案标准),是一种把资料储存在被标记的区块(tagged chunks)中的档案格式(meta-format),不同编码的音频/视频流按照RIFF所定义的存储规则保存,在读取播放时,就可以按照RIFF规则分析文件,正常解析出音频/视频流。
  • 示例代码

    • 按照上述定义,声明如下数据结构
    struct RIFF_t {char        ID[4];uint32_t    size;char        format[4];
    };struct FMT_t {char        ID[4];uint32_t    size;uint16_t    audio_format;uint16_t    channels;uint32_t    sample_rate;uint32_t    byte_rate;uint16_t    block_align;uint16_t    bits_per_sample;
    };struct DATA_t {char        ID[4];uint32_t    size;//void      *data;      //此处因为数据需要从文件中边读取边存储,因此为了方便操作,不声明data
    };struct PCM_to_WAV_t {char        *in_file_name;char        *out_file_name;FILE        *in_file;FILE        *out_file;uint16_t    pcm_data;    //保存从PCM文件中读取的数据,因为PCM数据大小必然是16的倍数,所以声明为uint16_tstruct RIFF_t   riff;struct FMT_t    fmt;struct DATA_t   data;
    };
    
    • 初始化操作
    int PCM_to_WAV_Init(PCM_to_WAV_t *p2w, int argc, char** argv)
    {if (argc == 3) {p2w->in_file_name        = argv[1];p2w->fmt.sample_rate     = 44100;p2w->fmt.channels        = 2;p2w->fmt.bits_per_sample = 16;p2w->out_file_name       = argv[2];} else if (argc == 6) {p2w->in_file_name        = argv[1];p2w->fmt.sample_rate     = atoi(argv[2]);p2w->fmt.channels        = atoi(argv[3]);p2w->fmt.bits_per_sample = atoi(argv[4]);p2w->out_file_name       = argv[5];} else {printf("$.exe $.pcm $sample_rate $channels $bits_per_sample $.wav\n");printf("Example: $.exe in.pcm 44100 2 16 out.wav\n");printf("$.exe $.pcm $.wav\n");printf("Example: $.exe in.pcm out.wav\n");return -1;}p2w->pcm_data = 0;p2w->in_file  = NULL;p2w->out_file = NULL;memcpy(p2w->riff.ID, "RIFF", 4);memcpy(p2w->riff.format, "WAVE", 4);p2w->riff.size = 36;memcpy(p2w->fmt.ID, "fmt ", 4);p2w->fmt.size           = 16;p2w->fmt.audio_format   = 1;p2w->fmt.byte_rate      = p2w->fmt.sample_rate * p2w->fmt.channels * p2w->fmt.bits_per_sample / 8;p2w->fmt.block_align    = p2w->fmt.channels * p2w->fmt.bits_per_sample / 8;memcpy(p2w->data.ID, "data", 4);p2w->data.size = 0;return 0;
    }
    
    • 转换过程
    int PCM_to_WAV(PCM_to_WAV_t *p2w)
    {p2w->in_file  = fopen(p2w->in_file_name, "rb+");p2w->out_file = fopen(p2w->out_file_name, "wb+");if (p2w->in_file == NULL || p2w->out_file == NULL) {printf("open file error\n");return -1;}fseek(p2w->out_file, sizeof(struct RIFF_t), 1);fwrite(&p2w->fmt, sizeof(struct FMT_t), 1, p2w->out_file);fseek(p2w->out_file, sizeof(struct DATA_t), 1);fread(&p2w->pcm_data, sizeof(uint16_t), 1, p2w->in_file);while (! feof(p2w->in_file) ) {p2w->data.size += 2;fwrite(&p2w->pcm_data, sizeof(uint16_t), 1, p2w->out_file);fread(&p2w->pcm_data, sizeof(uint16_t), 1, p2w->in_file);}p2w->riff.size += p2w->data.size;rewind(p2w->out_file);fwrite(&p2w->riff, sizeof(struct RIFF_t), 1, p2w->out_file);fseek(p2w->out_file, sizeof(struct FMT_t), 1);fwrite(&p2w->data, sizeof(struct DATA_t), 1, p2w->out_file);fclose(p2w->in_file);fclose(p2w->out_file);return 0;
    }
    
    • 打印块信息
    void PCM_to_WAV_Info(PCM_to_WAV_t *p2w)
    {printf("in file: %s\nout file: %s\n", p2w->in_file_name, p2w->out_file_name);printf("RIFF: \n\tID: %4.4s\n\tsize: %d\n\tformat: %4.4s\n",p2w->riff.ID, p2w->riff.size, p2w->riff.format);printf("FMT: \n\tID: %4.4s\n\tSize: %d\n\tAudio fmt: %d\n\tChannels: %d\n",p2w->fmt.ID, p2w->fmt.size, p2w->fmt.audio_format, p2w->fmt.channels);printf("\tsample rate: %d\n\tByte Rate: %d\n\tBlock Align: %d\n\tBits Per Sample: %d\n",p2w->fmt.sample_rate, p2w->fmt.byte_rate, p2w->fmt.block_align, p2w->fmt.bits_per_sample);printf("DATA: \n\tID: %4.4s\n\tSize: %d\n", p2w->data.ID, p2w->data.size);
    }
    
    • 调用
    int main(int argc, char **argv)
    {struct PCM_to_WAV_t pcm2wav;if (PCM_to_WAV_Init(&pcm2wav, argc, argv) != 0)return -1;if (PCM_to_WAV(&pcm2wav) != 0)return -1;PCM_to_WAV_Info(&pcm2wav);return 0;
    }
    
  • 参考资料

    • WaveFormat
    • 视音频数据处理入门:PCM音频采样数据处理
    • RIFF文件浅析

不当之处请在评论区指出

PCM音频数据封装为WAV文件相关推荐

  1. C# 模拟PCM数据并创建WAV文件

    最近由于着手一个无线电接受机信号处理的工作,需要处理解调模式下传递的PCM数据,绘制波形并播放声音,特此记录. 模拟PCM数据,保存到本地 private void button1_Click(obj ...

  2. 什么是PCM?它和.wav文件是什么关系?

    PCM(Pulse Code Modulation----脉码调制录音).所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录.PCM信号是由[1].[0]等符号构成的数字信号,而未经过任 ...

  3. matlab 音频fft,在wav文件和FFT的matlab中的Audioread

    那是因为你没有绘制幅度.您正在绘制的是系数,但这些是复杂的.因此,水平轴是实部,垂直轴是虚部.此外,当您单独使用 sound时,默认采样频率为8 kHz(准确地说是8192 Hz),这可以解释为什么您 ...

  4. mp3转换wav文件_如何将WAV文件转换为MP3

    mp3转换wav文件 WAV audio files are a great way to preserve the complete and accurate quality of a record ...

  5. python pcm,python pcm音频添加头转成Wav格式文件的方法

    如下所示: ''''' add Head Infomation for pcm file ''' import sys import struct import os __author__ = 'bo ...

  6. html5使用websocket发送(PCM)音频数据到服务器,再转在wav文件

    PCM格式 通过websocket发送音频数据. <html> <head><meta charset="utf-8"><title> ...

  7. PCM音频文件(.wav)压缩成ADPCM(.wav)

    PCM音频文件压缩成adpcm格式的文件有多中方法(如使用ms ACM.sox等),本文主要介绍使用公开的算法(如下所示,如果需要可到网上搜一下: ========================== ...

  8. PCM音频文件(.wav)压缩成ADPCM(.wav) ,wav文件分析,wav 文件格式

    本文来自: http://blog.csdn.net/jtlyr/article/details/5321884 这里还有介绍一些wav文件的其他网站,记录下: https://ccrma.stanf ...

  9. [Android] [音视频系列]在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件

    参考 官方文档地址:https://developer.android.google.cn/reference/android/media/AudioRecord GitHub 地址:https:// ...

最新文章

  1. 线上分享会预告之三维模型检索技术介绍
  2. Linux内置的审计跟踪工具:last命令
  3. 第二章、FastDFS单机搭建过程
  4. 执行后rosrun 显示找不到包 [rospack] Error: package ‘pluming_param_server‘ not found
  5. 《多元统计分析》学习笔记之主成分分析
  6. sql server numeric 可存几位小数_想成为优秀SQL高手?你就差这些细节
  7. 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
  8. 单元测试工具cmocka英文教程,非常漂亮
  9. 多线程编程:线程死锁的原因以及解决方法
  10. JDBC 数据连接池
  11. 微信通讯协议。自动加人
  12. hexo d上传报错鉴权失败
  13. 如何说服你的同事使用TDD
  14. Jenkins ERROR: Server rejected the 1 private key(s)
  15. 小程序如何写一个优美的tab选项卡
  16. 超低延迟直播~毫秒级直播观看体验(实测效果)
  17. 用python写九九乘法表(用format格式极其简单)
  18. Type mismatch Can‘t assign java.math.BigDecimal to java.lang.Double
  19. 一些程序员必备的英语词汇及释义
  20. IDEA的Project与Structure依赖jar包的方式

热门文章

  1. NOVA温控器参数笔记(十二)(工学单位EU、EUS)
  2. postgis——空间索引
  3. composer require报错:poser-plugin packages should have a class defined in their extra key to be usable
  4. C语言指针函数和函数指针详解
  5. 手机网赚操作真实赚钱项目揭秘
  6. 中国人保为北京洁美克工贸有限公司承保产品责任险,为消费者保驾护航
  7. Arduino的多任务管理
  8. 如何理解 Spring Boot 中的 Starters?
  9. 计算机服务里wlan功能是什么意思,移动wlan什么意思
  10. mysql全文检索性能