在目标c中将两个音频文件合并为一个

时间:2012-07-17 09:37:38

标签: objective-c audio cocos2d-iphone ios

  

可能重复:
  merge Audio files on iPhone

我正在尝试将2个音频文件合并为一个文件。 例如:file1.mp3 - 它说“我是”。 file2.mp3 - 它说“乔治”。 我想得到一个组合文件file3.mp3,它会说“我是乔治”。

如何在Objective-C中执行此操作?

3 个答案:

答案 0 :(得分:12)

查看 AVFoundation 框架......有很多方法,但最简单的方法可以是......

  • 为两个文件创建 AVAsset (使用 AVURLAsset 子类),
  • alloc AVMutableComposition 组合),
  • AVMutableCompositionTrack 添加到 AVMediaTypeAudio composition

[composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

  • 从第一个 AVAsset 获取曲目并添加 AVMutableCompositionTrack
  • 从第二个 AVAsset 获取曲目并将其附加到 AVMutableCompositionTrack
  • 然后使用您的作品创建 AVAssetExportSession 并将其导出。

简化说明,但是你得到了一个线索。取决于你有多少曲目,你想要使用什么样的效果,等等。

如果您确实想查看一些真实的代码,请打开 AVMovieExporter 示例,复制此代码并删除视频内容并仅在此处保留音频。

答案 1 :(得分:1)

您可以将2个mp3文件合并为: -

  NSMutableData *part1 = [NSMutableData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"file1" ofType: @"mp3"]];

  NSMutableData *part2 = [NSMutableData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"file2" ofType: @"mp3"]];

 [part1 appendData: part2];

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDir = [paths objectAtIndex:0];
    NSString *myMp3 = [documentsDir stringByAppendingPathComponent: @"final.mp3"];

    [part1 writeToFile:myMp3 atomically:YES];

这样你就可以直接将mp3文件附加到一个。我在我的一个应用程序中使用过它。对于需要分别更新文件头的其他格式,它会变得有点复杂,但使用mp3时相对简单。

<强>更新

那么你还必须注意你试图连接的mp3文件的比特率是一样的。如果它们不同,它们将合并,但只能部分播放,或者根本不播放。因此,请确保比特率彼此同步。

答案 2 :(得分:0)

另一种方法是使用AVAssetReader将所有mp3文件转换为未压缩的音频文件,如果音频足够短,甚至可以转换为内存缓冲区。然后,可以根据需要将未压缩的PCM数据连接,混合或交叉淡化。然后使用AVAssetWriter将结果写入某种压缩文件格式(如aac),如果需要的话。