iOS - 混合两个音频文件

Posted

技术标签:

【中文标题】iOS - 混合两个音频文件【英文标题】:iOS - Mixing two audio files 【发布时间】:2017-05-11 17:05:04 【问题描述】:

我正在尝试将 2 个音轨混合为一个(视频的声音和一些音乐)。

借助 AVFoundation,我可以使用此方法将两个轨道设置为视频文件:

https://***.com/a/16316985/5120292

这是结果输出文件,在我的电脑上使用 ffmpeg 检查:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'IMG_3789.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    creation_time   : 2017-05-11T15:46:52.000000Z
  Duration: 00:00:22.63, start: 0.000000, bitrate: 38210 kb/s
    Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1696x848, 37782 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      creation_time   : 2017-05-11T15:46:52.000000Z
      handler_name    : Core Media Video
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 250 kb/s (default)
    Metadata:
      creation_time   : 2017-05-11T15:46:52.000000Z
      handler_name    : Core Media Audio
    Stream #0:2(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
    Metadata:
      creation_time   : 2017-05-11T15:46:52.000000Z
      handler_name    : Core Media Audio 

您可以看到该文件包含两个音轨。我需要将两个曲目合并为一个,因为有些玩家只播放第一首曲目。

是否可以将它们混合成一首曲目而不是 2 首单独的曲目?

提前致谢!任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

这段代码将音轨合并为一个 - 我认为这要归功于AVMutableComposition(而不是AVAssetExportSession):

AVAssetTrack *videoTrack = ...;
AVAssetTrack *audioTrack1 = ...;
AVAssetTrack *audioTrack2 = ...;

AVMutableComposition *composition = [AVMutableComposition composition];

for (AVAssetTrack* inputTrack in @[videoTrack, audioTrack1, audioTrack2]) 
    AVMutableCompositionTrack* outputTrack;
    outputTrack = [composition addMutableTrackWithMediaType:inputTrack.mediaType preferredTrackID:kCMPersistentTrackID_Invalid];

    NSError* error;
    if (![outputTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, inputTrack.timeRange.duration) ofTrack:inputTrack atTime:kCMTimeZero error:&error]) 
        NSLog(@"insertTimeRange error: %@", error);
    


AVAssetExportSession* exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality];

NSURL *outputURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0] URLByAppendingPathComponent:@"output.mp4"];
[[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil];

exportSession.outputFileType = AVFileTypeMPEG4;
exportSession.outputURL = outputURL;

[exportSession exportAsynchronouslyWithCompletionHandler:^
    if (AVAssetExportSessionStatusCompleted == exportSession.status) 
        NSLog(@"success %@", outputURL);
     else 
        NSLog(@"failed %li", (long)exportSession.status);
    
];

【讨论】:

除了我使用 AVAssetExportPresetPassthrough 而不是 AVAssetExportPresetHighestQuality 之外,我们做同样的事情。看来您的预设将两个音轨合并为一个,谢谢!您能否确认使用我的预设制作了 2 个音轨?提前致谢! 当我使用AVAssetExportPresetPassthrough时它根本不起作用... 好的,我想这就是问题所在。非常感谢!

以上是关于iOS - 混合两个音频文件的主要内容,如果未能解决你的问题,请参考以下文章

使用不同的起点条目快速混合两个音频文件

使用 NAudio 混合两个音频文件

如何混合两个 PCM 音频文件

混合来自 MP3 文件的两个音频样本

iOS 将 2 个或多个音频文件合并(混合)为 wav 格式

iOS - 如何将混合音频合成导出到文件大小最小的文件?