【问题标题】:Combine two audio files into one in objective c [duplicate]在目标c中将两个音频文件合并为一个[重复]
【发布时间】:2012-07-17 09:37:38
【问题描述】:

可能重复:
merge Audio files on iPhone

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

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

【问题讨论】:

  • 我看到了那个文档。有合并而不是合并。我想在file3中一起成为file1之后的file2。
  • 请注意:我不会在这里使用.mp3。它是一种受许可保护的文件格式,如果您的应用程序拥有超过 1000 名用户,您突然需要向 Fraunhofer Gesellschaft 支付版税。
  • 只播放可以吗? (使用 Apple 的框架)
  • 您询问了有关创建文件的问题,而不仅仅是播放。 iOS 中没有用于构建 .mp3 文件的内置代码或 API。你需要在某个地方找到一个巨大的图书馆(也许还要支付版税)。

标签: objective-c audio cocos2d-iphone ios


【解决方案1】:

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

  • 为两个文件创建 AVAsset(使用 AVURLAsset 子类),
  • alloc AVMutableComposition (composition),
  • 将类型为 AVMediaTypeAudioAVMutableCompositionTrack 添加到 composition

[composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

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

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

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

【讨论】:

  • tnx 为您解答。你能写一些代码吗?我有 2 个文件:file1、mp3 和 file2.mp3。我只需要将它们组合起来。(先播放 file1,然后播放 file2)
  • 对不起,我不会为你写代码。这是你的任务,我告诉你怎么做,在哪里可以找到已经编写好的代码示例,你可以在其中删除视频部分,然后得到你想要的。
  • 我已经完成了 2 个步骤。但我无法添加类型为 AVMediaTypeAudio 的 AVMutableCompositionTrack。它说一个错误 undecleared AVMediaTypeAudio
  • AVMediaTypeAudio 在 AVMediaFormat.h 中定义。您是否在代码中包含 并且是否将 AVFoundation 框架添加到您的项目中?
  • 我解决了这个问题。但我如何附加或导出会话?我已经创建了曲目。
【解决方案2】:

您可以将 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 文件的比特率是相同的。如果它们不同,它们将合并,但只会部分播放或根本不播放。因此,请确保比特率彼此同步。

【讨论】:

  • 哇,这真的有效吗?并且只是 MP3 文件的属性吗?
  • MP3 文件是音频流文件。因此,将一个文件附加到另一个文件将解决您的要求。尝试一下。它应该可以工作。
  • 即使有 2 个具有相同比特率的音频文件,这也不起作用,在我的情况下只能播放第一个 mp3。
  • 哦,这很奇怪,我又试了一次,但颠倒了(第 2 部分),现在可以了。这能解释什么?
  • 这不适用于带有 ID3 标签的 MP3 文件。有关 MP3 文件的说明,请参阅en.wikipedia.org/wiki/MP3
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多