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) ;

 

 

 




相关推荐