tee*_*yay 5 iphone audio aac objective-c avaudiorecorder
我正在使用AVAudioRecorder以下设置在iPhone上录制音频:
NSMutableDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[NSNumber numberWithFloat:44100.0], AVSampleRateKey,
[NSNumber numberWithInt:1], AVNumberOfChannelsKey,
[NSNumber numberWithInt:12800], AVEncoderBitRateKey,
[NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
[NSNumber numberWithInt: AVAudioQualityHigh], AVEncoderAudioQualityKey,
nil];
Run Code Online (Sandbox Code Playgroud)
(我可以灵活处理大多数这些设置,但我必须使用MPEG4 AAC.)
我将音频保存到文件中.
用户需要能够在以后返回并继续录制到同一文件.似乎没有选择直接使用AVAudioRecorder,所以我正在录制到一个新文件并连接它们.
目前我使用附加的文件AVMutableComposition和AVMutableCompositionTrack为在这里,但它是更长的录音很慢,所以这是不是真的可行.
我认为如果我可以从第二个文件中删除标题,将音频数据附加到第一个文件,然后更改组合文件的标题以反映新的持续时间,那会快得多.据我所知,两个文件都是使用完全相同的设置创建的,我认为标题中的其他细节应该相同.
遗憾的是,我无法找到有关标头格式的信息,或者是否可以通过这种方式组合文件.
所以我的问题是:
尽管我们要求AVAudioRecorder以 MPEG4-AAC 格式录制,但它总是生成 .caf(核心音频格式)文件。然而,这只是一种包装格式,它包含的实际音频数据是 AAC 格式。
最后,附加文件归结为逐字节操作 .caf 文件。核心音频格式文件的规范在这里。消化这个文档并相应地处理文件一开始有点令人不快,但事实证明规范非常清晰和完整,所以并不太繁重。
正如规范所解释的,.caf 文件由开头为四字节名称的块组成。对于 AAC 文件来说,总是有一个desc块和一个kuki块。我们知道两个原始文件的格式相同,因此我们可以将这些块原封不动地复制到输出文件中。
还有一pakt大块和一data大块。我们无法保证这些内容在输入文件中的顺序。可能有也可能没有free块 - 但这只包含填充 0x00,因此我们不需要将其复制到输出文件。
为了组合pakt块,我们需要检查块头并生成一个新pakt块,其mNumberPackets和mNumberValidFrames字段是输入文件中的块的总和。和始终为零 - 这些仅与流媒体相关mPrimingFrames。mRemainderFrames大部分块pakt(即实际的数据包表数据)可以直接连接起来。
类似地,对于data块:mChunkSize需要对字段进行求和,然后可以连接大量数据。
从这些文件中的所有二进制数字字段读取数据时要小心:文件是大端字节序,但 iPhone 是小端字节序。
为了获得额外的好处,您可能还想考虑从文件中删除音频片段,或将一个音频文件插入到另一个音频文件的中间。这有点棘手,因为您必须解析pakt块的内容。同样,这是遵循规范的情况:有一个很好的描述如何将数据包大小存储在可变长度整数中,因此您必须解析这些数据以查找每个数据包在块中占用多少字节,并计算它们的data大小相应的位置。
总而言之,这比我希望的要麻烦得多。也许有一个开源库可以为您完成这一切,但我找不到。
AVMutableComposition然而,与使用和相比,像这样处理原始文件的速度快得令人眼花缭乱AVMutableCompositionTrack,就像最初的问题一样 - 将一个小时长的录音插入另一个相同长度的录音大约需要两秒钟。
祝你好运!
| 归档时间: |
|
| 查看次数: |
3532 次 |
| 最近记录: |