在这种情况下,我应该使用什么音频文件/格式?我能用.avi文件吗?
您可以选择压缩或非压缩格式。常见的非压缩格式包括Wav和AIFF。CAF可以表示压缩和非压缩数据。.avi不是一个选项(操作系统提供的)。
如果文件很大且存储空间(在磁盘上)是一个问题,您可以考虑将AAC格式保存在CAF(或者简单地.m4a)中。对于大多数应用程序,16位样本就足够了,并且您也可以通过以适当的采样率保存这些文件来节省空间,内存和CPU(参考:CD的采样率为44.1kHz)。
由于ExtAudioFile接口抽象了转换过程,因此您不必更改程序来比较压缩和非压缩格式在分发时的大小和速度差异(对于正常应用程序,CAF中的AAC就足够了)。
非压缩的CD质量音频每分钟会占用约5.3 MB的存储空间,每个通道。因此,如果您有2个立体声音频文件,每个文件长达3分钟,并且有一个3分钟的目标缓冲区,则您的内存需求将约为50 MB。
由于您有“几分钟”的音频,因此可能需要考虑避免一次性将所有音频数据加载到内存中。为了读取,操作和合并音频,您需要一个非压缩的表示形式以在内存中使用,因此压缩格式在这里无法帮助。同样,将压缩表示转换为pcm需要大量资源;读取压缩文件虽然字节数较少,但可能需要更多(或更少)的时间。
如何通过编程方式在动态时间设置后将第二个音频添加到第一个音频文件中?例如:如果第一个音频总时长为2分钟,则我可能需要在第一个文件的1分钟、1.5分钟或55秒处混合第二个音频文件(3秒音频)。它是动态的。
要读取文件并将其转换为要使用的格式,请使用ExtAudioFile API-这将为您转换为目标采样格式。内存中常见的PCM样本表示包括SInt32、SInt16和float,但这可以根据应用程序和硬件(超出iOS)而有很大变化。如果需要,ExtAudioFile API也会将压缩格式转换为PCM。
您的输入音频文件应具有相同的采样率。如果不是,则必须重新采样音频,这是一个复杂的过程,也需要大量资源(如果正确/准确执行)。如果您需要支持重新采样,则将分配给完成此任务所需的时间加倍(此处未详细说明过程)。
要添加声音,您将从文件请求PCM样本,进行处理,然后写入输出文件(或内存缓冲区)。
为了确定何时添加其他声音,您需要通过ExtAudioFileGetProperty获取输入文件的采样率。如果您想在目标缓冲区中将第二个声音写入55秒处,则可以从样品编号
SampleRate * 55
开始添加声音,其中
SampleRate
是您正在读取的文件的采样率。
要混合音频,您只需使用以下形式(伪代码):
mixed[i] = fileA[i] + fileB[i];
但是你必须确保避免溢出/下溢和其他算术错误。通常,您将使用某些整数值执行此过程,因为浮点计算可能需要很长时间(当存在这么多计算时)。对于某些应用程序,您可以只进行移位和加法而不必担心溢出-这将在添加它们之前有效地将每个输入减半。结果的振幅将减少一半。如果您控制文件内容(例如,它们都作为资源捆绑在一起),则可以简单地确保文件中的任何峰值样本均不超过全幅值的一半(约为-6dBFS)。当然,保存为浮点数将解决此问题,但会增加更高的CPU、内存和文件I/O需求。
此时,您需要打开两个文件进行读取,一个文件进行写入,然后使用一些小的临时缓冲区来处理和混合输入,然后将其写入输出文件。为了提高效率,您应该以块的形式执行这些请求(例如,从每个文件读取1024个样本,处理样本,写入1024个样本)。API对于缓存和缓冲效率没有太多保证。
如何将最终输出音频文件保存到设备上?如果我在程序中保存音频文件,我能再次播放吗?
ExtAudioFile API可满足您的读取和写入需求。是的,您可以稍后读取/播放它。