libsndfile
阅读数:304 评论数:0
跳转到新版页面分类
C/C++
正文
一、简介
libsndfile是一个C语言写成的开放源代码(LGPL)的音频文件读写的库,可以读写WAV、FLAC等常见格式(因为专利原因不支持mp3)。
二、用法
1、SNDFILE* sf_open(const char* path, int mode, SF_INFO* sfinfo)
用来打开一个音频文件,mode有三个选项:
(1)SFM_READ 只读
(2)SFM_WRITE 只写
(3)SFM_RDWR 读写
音频文件的一些基本信息由sfinfo来返回。
typedef struct
{ sf_count_t frames ; /* Used to be called samples. */
int samplerate ;
int channels ;
int format ;
int sections ;
int seekable ;
} SF_INFO ;
如果是以只读模式打开一个文件,format字段需要预设为0,这样打开文件后查看format就可以知道音频文件的基本格式。
2、sf_count_t sf_seek(SNDFILE* sndfile, sf_count_t frames, int whence)
用来在音频文件的数据区中移动文件指针,所有的移动都是在数据区中进行,以数据帧为单位,相当的方便。
3、读取数据函数
sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ;
sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ;
sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ;
sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ;
上面8个函数用来从音频文件中读取数据。
(1)items和frames的区别
对于单声道的音频文件,item和frame是一样的,一个item对应一个数据点。
对于多声道音频文件,一个frame包含多个数据点,比如双声道音频文件,一个frame包括2个item。
另外,音频文件中可能用8bits来存储一个数据点,也可能是16bits,可能用整数也可能用浮点。sf_read_XXX系列函数会替你完成数据的转换工作。
4、写音频文件函数
sf_count_t sf_write_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ;
sf_count_t sf_write_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ;
sf_count_t sf_write_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ;
sf_count_t sf_write_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ;
sf_count_t sf_writef_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ;
sf_count_t sf_writef_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ;
sf_count_t sf_writef_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ;
sf_count_t sf_writef_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ;