2012-07-17 155 views
1

可能重复:
merge Audio files on iPhone合并两个音频文件合并为一个目标C

我想2个音频文件合并成一个文件。 例如:file1.mp3 - 它说“我是”。 file2.mp3 - 它说“乔治”。 我想要一个组合文件file3.mp3,它会说“我是乔治”。

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

+0

我看到了这个文档。有合并而不合并。我想在file3之后​​成为file1之后的file2。 – Rendel 2012-07-17 09:52:21

+1

只是一个快速提示:我不会在这里使用'.mp3'。它是一种许可证保护的文件格式,如果您的应用程序获得超过1000个用户,突然您需要向Fraunhofer Gesellschaft支付版税。 – 2012-07-17 11:42:10

+0

如果只播放,可以吗? (使用Apple的框架) – 2012-07-17 12:26:04

回答

11

AVFoundation框架......有很多种方式,但最简单的一个,你可以...

  • 创建AVAsset两个文件(使用AVURLAsset子类) ,
  • ALLOC AVMutableComposition组合物),
  • 添加AVM从第一AVAsset utableCompositionTrack类型AVMediaTypeAudio组合物

[composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

  • 获取轨道(一个或多个),并将其添加AVMutableCompositionTrack
  • GET音轨从第二个AVAsset并将其追加到AVMutableCompositionTrack
  • 然后创建AVAssetExportSession与您的组成并导出它。

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

如果你想看到一些实际的代码,开放AVMovieExporter例如,复制此代码,并删除视频的东西,离开那里只有音频。

+0

tnx为您的答案。 你能写一些代码吗?我有2个文件:file1,mp3和file2.mp3。我只需要将它们结合起来(先播放file1然后file2) – Rendel 2012-07-17 10:27:12

+13

对不起,我不会为你写代码。这是你的任务,我告诉你如何做到这一点,以及在哪里可以找到已经编写代码的例子,在这里你可以清除视频部分,并得到你想要的东西。 – robertvojta 2012-07-17 10:39:33

+0

我已经完成了2个步骤。但我不能添加类型AVMediaTypeAudio AVMutableCompositionTrack。它说错误不明确AVMediaTypeAudio – Rendel 2012-07-17 10:57:23

0

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

+0

好的。谢啦。 – Rendel 2012-07-18 11:57:37

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来说则相对简单。

UPDATE:

那么你也必须要小心,你正试图以连接mp3文件的比特率相同。如果他们不同,他们会合并,但只会部分或根本不会。所以请确保比特率彼此同步。

+0

哇真的有用吗?而且只是MP3文件的一个属性? – 2012-08-08 11:02:48

+0

MP3文件是音频流文件。因此,将一个文件附加到另一个文件将解决您的要求。尝试一下。它应该工作。 – 2012-08-13 08:51:11

+0

即使有两个音频文件具有相同的比特率,这也不起作用,只有第一个MP3播放我的情况。 – Fatso 2012-12-23 21:17:29

相关问题