wav文件的采样位数从16位转换到8位的C语言实现

本文介绍了使用C语言将wav文件的采样位数从16位转换到8位的程序解析,讲解了malloc与free、memcpy、feof函数,并附带源码解析。程序通过右移8位清除高8位数据,然后赋值给8位wav文件,实现了位深度的转换。
摘要由CSDN通过智能技术生成

前言

今天来对自己找到的一份网上的有关将wav文件的采样位数从16位转化成8位的程序进行解析,通过分析后加入到自己的程序中,从而完成一个自己毕设软件中的一个功能。

程序解析及源码

函数学习

首先对程序中遇到的新函数进行学习,便于后面对于程序的理解。

malloc与free函数

由于malloc函数与free函数一般都是连用的,故而放在一起进行说明。
作用:malloc函数用于向操作系统申请一片内存,free函数对应的是释放这片申请的内存,如果申请后不释放会造成内存泄漏的错误,故而free函数是必要的。

头文件: #include <stdlib.h>
函数原型:
void *malloc(size_t size);
void free(void *ptr);
参数:
malloc:size是指需要分配的字节数。
free:ptr-- 指针指向一个要释放内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果传递的参数是一个空指针,则不会执行任何动作。
返回值:
malloc:分配成功,则返回一个指向分配空间的指针。失败返回NULL指针。
free:void类型,不返回任何值。

memcpy函数

作用:C和C++使用的内存拷贝函数。从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。
头文件: #include <string.h>
函数原型
void *memcpy(void destin, void source, unsigned n);
参数
destin: 指向用于存储复制内容的目标数组,类型强制转换为 void
指针。
source:指向要复制的数据源,类型强制转换为 void
指针。
n: 要被复制的字节数。
返回值
该函数返回一个指向目标存储区destin的指针。

feof函数

作用:检测流上的文件结束符。文件结束:返回非0值,文件未结束,返回0值。
头文件: #include <stdio.h>
函数原型
int feof(FILE *stream);
参数
stream:FILE结构的指针
返回值
文件结束:返回非0值,文件未结束,返回0值。

PS:feof判断文件结束是通过读取函数fread/fscanf等返回错误来识别的,故而判断文件是否结束应该是在读取函数之后进行判断。比如,在while循环读取一个文件时,如果是在读取函数之前进行判断,则如果文件最后一行是空白行,可能会造成内存错误。

源码解析

下面附上我注释过的源码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

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

	short      
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值