iOS的音频文件的格式转换示例

2025-05-29 0 36

背景

因为我的公司需要设计到app与硬件的通信,所以去年深入的研究了一下音频各种格式的转换,曾写过一篇简书,现在搬过来丰富下自己的blog。

首先介绍一下常用的音频文件格式

  • .amr:体积很小,1秒到约为1kb,所以音质缩水也很厉害,一般用于手机铃声或彩信
  • .mp3:比较流行的,有损音频,某些部分失真,,音质随码率的提高,越高越好
  • .wav:为无损音频
  • .pcm:无损的wav文件中音频数据的一种编码方式

由于App是通过AVAudioRecorder录制音频,默认格式为pcm,文件比较大,所以不适合用于聊天通信的文件格式,所以最优的选择是转换成amr格式

音频格式转换方式

.pcm–>.wav–>.amr

a)将pcm转成wav

什么是WAV和PCM?

WAV:wav是一种无损的音频文件格式,WAV符合 PIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。

PCM:PCM(Pulse Code Modulation—-脉码调制录音)。所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的影响效果。

简单来说:wav是一种无损的音频文件格式,pcm是没有压缩的编码方式。

WAV和PCM的关系

WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的Decode,就可以欣赏这些WAV了。在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。

简单来说:pcm是无损wav文件中音频数据的一种编码方式,但wav还可以用其它方式编码。

这里详细写了pcm和wav的区别,我简单概括成pcm少了一个wav头描述信息。为此我从讯飞语音的sdk中移植出填写wav头的函数并修改了一下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74
// 为pcm文件写入wav头

+ (NSData*) writeWavHead:(NSData *)audioData {

long sampleRate = [[self GetAudioRecorderSettingDict][AVSampleRateKey] longValue];

long numOfChannelsKey = [[self GetAudioRecorderSettingDict][AVNumberOfChannelsKey] longValue];

Byte waveHead[44];

waveHead[0] = 'R';

waveHead[1] = 'I';

waveHead[2] = 'F';

waveHead[3] = 'F';

long totalDatalength = [audioData length] + 44;

waveHead[4] = (Byte)(totalDatalength & 0xff);

waveHead[5] = (Byte)((totalDatalength >> 8) & 0xff);

waveHead[6] = (Byte)((totalDatalength >> 16) & 0xff);

waveHead[7] = (Byte)((totalDatalength >> 24) & 0xff);

waveHead[8] = 'W';

waveHead[9] = 'A';

waveHead[10] = 'V';

waveHead[11] = 'E';

waveHead[12] = 'f';

waveHead[13] = 'm';

waveHead[14] = 't';

waveHead[15] = ' ';

waveHead[16] = 16; //size of 'fmt '

waveHead[17] = 0;

waveHead[18] = 0;

waveHead[19] = 0;

waveHead[20] = 1; //format

waveHead[21] = 0;

waveHead[22] = numOfChannelsKey; //chanel

waveHead[23] = 0;

waveHead[24] = (Byte)(sampleRate & 0xff);

waveHead[25] = (Byte)((sampleRate >> 8) & 0xff);

waveHead[26] = (Byte)((sampleRate >> 16) & 0xff);

waveHead[27] = (Byte)((sampleRate >> 24) & 0xff);

long byteRate = sampleRate * 2 * (16 >> 3);;

waveHead[28] = (Byte)(byteRate & 0xff);

waveHead[29] = (Byte)((byteRate >> 8) & 0xff);

waveHead[30] = (Byte)((byteRate >> 16) & 0xff);

waveHead[31] = (Byte)((byteRate >> 24) & 0xff);

waveHead[32] = 2*(16 >> 3);

waveHead[33] = 0;

waveHead[34] = 16;

waveHead[35] = 0;

waveHead[36] = 'd';

waveHead[37] = 'a';

waveHead[38] = 't';

waveHead[39] = 'a';

long totalAudiolength = [audioData length];

waveHead[40] = (Byte)(totalAudiolength & 0xff);

waveHead[41] = (Byte)((totalAudiolength >> 8) & 0xff);

waveHead[42] = (Byte)((totalAudiolength >> 16) & 0xff);

waveHead[43] = (Byte)((totalAudiolength >> 24) & 0xff);

NSMutableData *pcmData = [[NSMutableData alloc]initWithBytes:&waveHead length:sizeof(waveHead)];

[pcmData appendData:audioData];

return pcmData;

// [pcmData writeToFile:kVoiceWav atomically:true];

}

同时还需把关键的属性抽取出来(如:采样率,通道数…)

?

1

2

3

4

5

6

7

8

9

10
//录音格式的设置

+ (NSDictionary*)GetAudioRecorderSettingDict{

NSDictionary *recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:

[NSNumber numberWithFloat: 8000],AVSampleRateKey, //采样率

[NSNumber numberWithInt: kAudioFormatLinearPCM],AVFormatIDKey,

[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,//采样位数 默认 16

[NSNumber numberWithInt: 2], AVNumberOfChannelsKey,//通道的数目

nil];

return recordSetting;

}

b)将wav转成amr

使用VoiceConvert(by:Tang Xiaoping)库能将wav转成amr,后来发现环信的EaseUI框架中也使用了这个

反过来转换也是差不多的

pcm<—>mp3

这个就很简单了,用lame的框架进行转换,这个框架网上资料一大堆

本人为此花了不少时间整理了一下这些文件格式的转换方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62
/**

* 转换wav到amr

*

* @param wavPath wav文件路径

* @param isDelete 转换成功后是否删除源文件

*

* @return NO 失败 YES成功

*/

+ (BOOL) wav2Amr:(NSString *)wavPath isDeleteSourchFile:(BOOL)isDelete;

/**

* 转换amr到wav

*

* @param amrPath amr文件路径

* @param isDelete 转换成功后是否删除源文件

*

* @return NO 失败 YES成功

*/

+ (BOOL) amr2Wav:(NSString *)amrPath isDeleteSourchFile:(BOOL)isDelete;

/**

* 转换pcm到mp3

*

* @param pcmPath pcm文件路径

* @param isDelete 转换成功后是否删除源文件

*

* @return NO 失败 YES成功

*/

+ (BOOL) pcm2Mp3: (NSString *)pcmPath isDeleteSourchFile:(BOOL)isDelete;

/**

* 转换pcm到wav

*

* @param pcmPath pcm文件路径

* @param isDelete 转换成功后是否删除源文件

*

* @return NO 失败 YES成功

*/

+ (BOOL) pcm2Wav: (NSString *)pcmPath isDeleteSourchFile:(BOOL)isDelete;

/**

* 转换pcm到amr

*

* @param pcmPath pcm文件路径

* @param isDelete 转换成功后是否删除源文件

*

* @return NO 失败 YES成功

*/

+ (BOOL) pcm2Amr:(NSString *)pcmPath isDeleteSourchFile:(BOOL)isDelete;

/**

* 为pcm文件写入wav头

*/

+ (NSData*) writeWavHead:(NSData *)audioData;

void conventToMp3(NSString *pcmFile,NSString *mp3File);

/**

录音格式设置,转换的时候需要获取.(如:采样率、采样位数、通道的数目)

建议使用此设置,如有修改,则转换amr时也要对应修改参数,比较麻烦

@returns 录音设置

*/

+ (NSDictionary*)GetAudioRecorderSettingDict;

demo的下载地址https://github.com/qq631192328/PFAudio.git,如果觉得好麻烦点下星,如果有什么问题欢迎指正

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 iOS的音频文件的格式转换示例 https://www.kuaiidc.com/88997.html

相关文章

发表评论
暂无评论