3

可能重复:
在 iPhone 上合并音频文件

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

我如何在 Objective-C 中做到这一点?

4

3 回答 3

12

看看AVFoundation框架......有很多方法,但对你来说最简单的一种可以是......

  • 为两个文件创建AVAsset(使用AVURLAsset子类),
  • alloc AVMutableComposition (组合),
  • 将类型为 AVMediaTypeAudio 的AVMutableCompositionTrack添加合成中

[composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

  • 从第一个AVAsset获取轨道并将其添加AVMutableCompositionTrack
  • 从第二个AVAsset获取轨道并将其附加到AVMutableCompositionTrack
  • 然后使用您的合成创建AVAssetExportSession并将其导出。

简化的描述,但你得到一个线索。取决于你有多少轨道,你想使用什么样的效果等等。

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

于 2012-07-17T10:24:32.413 回答
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 文件的比特率是相同的。如果它们不同,它们将合并,但只会部分播放或根本不播放。因此,请确保比特率彼此同步。

于 2012-08-07T11:24:32.397 回答
0

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

于 2012-07-17T17:05:52.567 回答