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 - 混合两个音频文件的主要内容,如果未能解决你的问题,请参考以下文章