广告
返回顶部
首页 > 资讯 > 移动开发 >iOS的音频文件的格式转换示例
  • 698
分享到

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

iOS音频文件格式转换 2022-05-24 20:05:18 698人浏览 安东尼
摘要

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

背景

因为我的公司需要设计到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头的函数并修改了一下


// 为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];
 
}

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


//录音格式的设置
+ (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的框架进行转换,这个框架网上资料一大堆

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



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

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

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

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

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

+ (NSData*) writeWavHead:(NSData *)audioData;
void conventToMp3(NSString *pcmFile,NSString *mp3File);
 

+ (NSDictionary*)GetAudioRecorderSettingDict;

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

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

--结束END--

本文标题: iOS的音频文件的格式转换示例

本文链接: https://www.lsjlt.com/news/30152.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • iOS的音频文件的格式转换示例
    背景 因为我的公司需要设计到app与硬件的通信,所以去年深入的研究了一下音频各种格式的转换,曾写过一篇简书,现在搬过来丰富下自己的blog。 首先介绍一下常用的音频文件格式 ...
    99+
    2022-05-24
    iOS 音频文件 格式转换
  • java 音频转换wav格式标准音频的操作
    目录简述环境依赖maven依赖ffmpeg依赖工具类代码总结简述 该工具类主要是为了将各类音频转为wav标准格式,其中可以调节采样率、声道数等指标。主要是使用ffmpeg命令进行转换...
    99+
    2022-11-12
  • PHP怎么将amr音频文件转换为mp3格式
    这篇文章主要介绍“PHP怎么将amr音频文件转换为mp3格式”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP怎么将amr音频文件转换为mp3格式”文章能帮助大家...
    99+
    2022-10-19
  • PHP将amr音频文件转换为mp3格式的操作细节
    说下整体思路1、服务器安装ffmpeg2、使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用exec函数执行即可)3、在网页端使用HTML5的audio标签来播放mp3文件下面是操作细节:一、服务器安装f...
    99+
    2022-06-02
    音频 amr php
  • Python中怎么将音频内容转换为文本格式
    这篇文章将为大家详细讲解有关Python中怎么将音频内容转换为文本格式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。搭建开发环境转到保存Python虚拟环境的目录。我将我的目录保存在用户主目...
    99+
    2023-06-16
  • Python实现将HTML转换成doc格式文件的方法示例
    本文实例讲述了Python实现将HTML转换成doc格式文件的方法。分享给大家供大家参考,具体如下: 网页上的一些文章,因为有格式的原因,它们在网页上的源码都是带有html标签的,用css来进行描述。本文利...
    99+
    2022-06-04
    转换成 示例 格式文件
  • windows中goldwave如何进行批量的音频格式转换
    今天小编给大家分享一下windows中goldwave如何进行批量的音频格式转换的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后...
    99+
    2023-01-04
    windows goldwave
  • java将XML文档转换成json格式数据的示例
    本文介绍了java将XML文档转换成json格式数据的示例,分享给大家,具体如下:功能将xml文档转换成json格式数据说明依赖包: jdom-2.0.2.jar : xml解析工具包; fastjson-1.1.36.jar : 阿里...
    99+
    2023-05-30
    java xml json
  • linux命令实现音频格式转换和拼接的方法
    安装FFmpeg flac eric@ray:~$ sudo apt install FFmpeg flac 安装lame faac eric@ray:~$ sudo apt install lame faac...
    99+
    2022-06-04
    linux 音频格式 转换 拼接
  • php将数组转换为json格式的示例
    小编给大家分享一下php将数组转换为json格式的示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在PHP中,可以使用json_encode()函数来将数组转换为json格式的数据,语法为“json_encode(数组变...
    99+
    2023-06-06
  • 怎么使用PHP将视频文件转换为MP4格式
    这篇文章主要讲解了“怎么使用PHP将视频文件转换为MP4格式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用PHP将视频文件转换为MP4格式”吧!首先,我们需要了解几个概念。一个视频文...
    99+
    2023-07-06
  • 如何将MP3格式的音乐转换成WAV格式
    这篇文章主要为大家展示了“如何将MP3格式的音乐转换成WAV格式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何将MP3格式的音乐转换成WAV格式”这篇文章吧...
    99+
    2022-10-19
  • fstab文件格式的示例分析
    这篇文章将为大家详细讲解有关fstab文件格式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。fstab文件中存放了与分区有关的重要信息,其中每一行为一个分区记录,每一行又可分为六个部份,下面以/...
    99+
    2023-06-13
  • Node.js中怎么转换文件编码的格式
    今天就跟大家聊聊有关Node.js中怎么转换文件编码的格式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。项目很多 lua 文件不是 utf-8格式,...
    99+
    2022-10-19
  • 基于Python实现RLE格式分割标注文件的格式转换
    目录1.Airbus Ship Detection Challenge2.数据展示2.1 标注数据2.2 图象文件3.格式转换4.转换结果1.Airbus Ship Detectio...
    99+
    2022-11-11
  • 将.ipynb格式的文件转换为.py格式的文件从而在pycharm中运行使用
    将xxx.ipynb 文件转换为 xxx.py 文件的两种方式 方法一:通过终端指令进行转换 如果你想将 xxx.ipynb 文件转换为 xxx.py 文件,打开终端,在xxx.ipynb文件所在目录...
    99+
    2023-09-29
    pycharm python ide
  • ios打开torrent格式文件的方法
    小编给大家分享一下ios打开torrent格式文件的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!ios打开torrent格式文件的方法:首先在Safari浏览器搜索并打开百度网盘官网;然后登录自己的百度网盘账号,并点...
    99+
    2023-06-06
  • 怎么使多浏览器播放wav格式的音频文件
    这篇文章主要介绍“怎么使多浏览器播放wav格式的音频文件”,在日常操作中,相信很多人在怎么使多浏览器播放wav格式的音频文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使多浏览器播放wav格式的音频文件...
    99+
    2023-06-04
  • MySQL隐式转换的示例分析
    这篇文章主要为大家展示了“MySQL隐式转换的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL隐式转换的示例分析”这篇文章吧。一、问题描述roo...
    99+
    2022-10-18
  • Python实现xml格式转txt格式的示例代码
    目录1、前言2、分析xml、txt数据3、转换过程4、最后结果对比1、前言 最近学习Yolo v5是遇见了个问题,找的数据集全是xml文件,VOC 的标注是 xml 格式的,而YOL...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作