147人参与 • 2025-05-19 • 苹果IOS
将多个音频文件(如 .mp3、.m4a)合并为一个音频文件。
// 合并音频文件(支持 .mp3/.m4a 等格式)
- (void)mergeaudiofiles:(nsarray<nsurl *> *)audiourls completion:(void (^)(nsurl *outputurl, nserror *error))completion {
// 1. 创建 avmutablecomposition 对象
avmutablecomposition *composition = [avmutablecomposition composition];
// 2. 添加音频轨道
avmutablecompositiontrack *audiotrack = [composition addmutabletrackwithmediatype:avmediatypeaudio preferredtrackid:kcmpersistenttrackid_invalid];
// 3. 插入每个音频文件到轨道中
cmtime currenttime = kcmtimezero;
for (nsurl *url in audiourls) {
avurlasset *asset = [avurlasset urlassetwithurl:url options:nil];
avassettrack *assettrack = [[asset trackswithmediatype:avmediatypeaudio] firstobject];
[audiotrack inserttimerange:cmtimerangemake(kcmtimezero, asset.duration)
oftrack:assettrack
attime:currenttime
error:nil];
currenttime = cmtimeadd(currenttime, asset.duration);
}
// 4. 导出合并后的音频
avassetexportsession *exportsession = [[avassetexportsession alloc] initwithasset:composition presetname:avassetexportpresetapplem4a];
nsstring *outputpath = [nstemporarydirectory() stringbyappendingpathcomponent:@"mergedaudio.m4a"];
exportsession.outputurl = [nsurl fileurlwithpath:outputpath];
exportsession.outputfiletype = avfiletypeapplem4a;
[exportsession exportasynchronouslywithcompletionhandler:^{
if (exportsession.status == avassetexportsessionstatuscompleted) {
nslog(@"音频合并成功: %@", outputpath);
if (completion) completion([nsurl fileurlwithpath:outputpath], nil);
} else {
nserror *error = exportsession.error;
nslog(@"音频合并失败: %@", error.localizeddescription);
if (completion) completion(nil, error);
}
}];
}
// 示例:合并两个音频文件
nsarray<nsurl *> *audiourls = @[
[nsurl fileurlwithpath:[[nsbundle mainbundle] pathforresource:@"audio1" oftype:@"mp3"]],
[nsurl fileurlwithpath:[[nsbundle mainbundle] pathforresource:@"audio2" oftype:@"mp3"]]
];
[self mergeaudiofiles:audiourls completion:^(nsurl *outputurl, nserror *error) {
if (outputurl) {
nslog(@"合并后的音频路径: %@", outputurl.path);
}
}];
将多个视频文件(如 .mp4)合并为一个视频文件。
// 合并视频文件(支持 .mp4 等格式)
- (void)mergevideofiles:(nsarray<nsurl *> *)videourls completion:(void (^)(nsurl *outputurl, nserror *error))completion {
// 1. 创建 avmutablecomposition 对象
avmutablecomposition *composition = [avmutablecomposition composition];
// 2. 添加视频轨道和音频轨道
avmutablecompositiontrack *videotrack = [composition addmutabletrackwithmediatype:avmediatypevideo preferredtrackid:kcmpersistenttrackid_invalid];
avmutablecompositiontrack *audiotrack = [composition addmutabletrackwithmediatype:avmediatypeaudio preferredtrackid:kcmpersistenttrackid_invalid];
// 3. 插入每个视频文件到轨道中
cmtime currenttime = kcmtimezero;
for (nsurl *url in videourls) {
avurlasset *asset = [avurlasset urlassetwithurl:url options:nil];
avassettrack *videoassettrack = [[asset trackswithmediatype:avmediatypevideo] firstobject];
avassettrack *audioassettrack = [[asset trackswithmediatype:avmediatypeaudio] firstobject];
[videotrack inserttimerange:cmtimerangemake(kcmtimezero, asset.duration)
oftrack:videoassettrack
attime:currenttime
error:nil];
[audiotrack inserttimerange:cmtimerangemake(kcmtimezero, asset.duration)
oftrack:audioassettrack
attime:currenttime
error:nil];
currenttime = cmtimeadd(currenttime, asset.duration);
}
// 4. 导出合并后的视频
avassetexportsession *exportsession = [[avassetexportsession alloc] initwithasset:composition presetname:avassetexportpresethighestquality];
nsstring *outputpath = [nstemporarydirectory() stringbyappendingpathcomponent:@"mergedvideo.mp4"];
exportsession.outputurl = [nsurl fileurlwithpath:outputpath];
exportsession.outputfiletype = avfiletypempeg4;
[exportsession exportasynchronouslywithcompletionhandler:^{
if (exportsession.status == avassetexportsessionstatuscompleted) {
nslog(@"视频合并成功: %@", outputpath);
if (completion) completion([nsurl fileurlwithpath:outputpath], nil);
} else {
nserror *error = exportsession.error;
nslog(@"视频合并失败: %@", error.localizeddescription);
if (completion) completion(nil, error);
}
}];
}
// 示例:合并两个视频文件
nsarray<nsurl *> *videourls = @[
[nsurl fileurlwithpath:[[nsbundle mainbundle] pathforresource:@"video1" oftype:@"mp4"]],
[nsurl fileurlwithpath:[[nsbundle mainbundle] pathforresource:@"video2" oftype:@"mp4"]]
];
[self mergevideofiles:videourls completion:^(nsurl *outputurl, nserror *error) {
if (outputurl) {
nslog(@"合并后的视频路径: %@", outputurl.path);
}
}];
将独立的音频文件和视频文件合并为一个包含音视频的媒体文件。
// 合并音频与视频
- (void)mergeaudio:(nsurl *)audiourl withvideo:(nsurl *)videourl completion:(void (^)(nsurl *outputurl, nserror *error))completion {
// 1. 创建 avmutablecomposition 对象
avmutablecomposition *composition = [avmutablecomposition composition];
// 2. 添加视频轨道
avmutablecompositiontrack *videotrack = [composition addmutabletrackwithmediatype:avmediatypevideo preferredtrackid:kcmpersistenttrackid_invalid];
avurlasset *videoasset = [avurlasset urlassetwithurl:videourl options:nil];
avassettrack *videoassettrack = [[videoasset trackswithmediatype:avmediatypevideo] firstobject];
[videotrack inserttimerange:cmtimerangemake(kcmtimezero, videoasset.duration)
oftrack:videoassettrack
attime:kcmtimezero
error:nil];
// 3. 添加音频轨道
avmutablecompositiontrack *audiotrack = [composition addmutabletrackwithmediatype:avmediatypeaudio preferredtrackid:kcmpersistenttrackid_invalid];
avurlasset *audioasset = [avurlasset urlassetwithurl:audiourl options:nil];
avassettrack *audioassettrack = [[audioasset trackswithmediatype:avmediatypeaudio] firstobject];
[audiotrack inserttimerange:cmtimerangemake(kcmtimezero, audioasset.duration)
oftrack:audioassettrack
attime:kcmtimezero
error:nil];
// 4. 导出合并后的音视频
avassetexportsession *exportsession = [[avassetexportsession alloc] initwithasset:composition presetname:avassetexportpresethighestquality];
nsstring *outputpath = [nstemporarydirectory() stringbyappendingpathcomponent:@"mergedmedia.mp4"];
exportsession.outputurl = [nsurl fileurlwithpath:outputpath];
exportsession.outputfiletype = avfiletypempeg4;
[exportsession exportasynchronouslywithcompletionhandler:^{
if (exportsession.status == avassetexportsessionstatuscompleted) {
nslog(@"音视频合并成功: %@", outputpath);
if (completion) completion([nsurl fileurlwithpath:outputpath], nil);
} else {
nserror *error = exportsession.error;
nslog(@"音视频合并失败: %@", error.localizeddescription);
if (completion) completion(nil, error);
}
}];
}
// 示例:合并一个音频和一个视频文件
nsurl *audiourl = [nsurl fileurlwithpath:[[nsbundle mainbundle] pathforresource:@"backgroundmusic" oftype:@"mp3"]];
nsurl *videourl = [nsurl fileurlwithpath:[[nsbundle mainbundle] pathforresource:@"video" oftype:@"mp4"]];
[self mergeaudio:audiourl withvideo:videourl completion:^(nsurl *outputurl, nserror *error) {
if (outputurl) {
nslog(@"合并后的音视频路径: %@", outputurl.path);
}
}];
采样率与编码格式
性能优化
avassetexportsession 的 avassetexportpresetlowquality 或 avassetexportpresetmediumquality 降低导出质量以加快处理速度。错误处理
avassetexportsession.status 和 error 信息,确保合并过程稳定。资源释放
如果需要更复杂的音视频处理(如裁剪、滤镜、转码),可以结合以下工具:
ffmpeg-ios 实现强大的音视频处理功能。通过以上方案,你可以高效地实现 ios 平台上的音视频合并功能,适用于短视频拼接、音乐创作、播客制作等场景。
到此这篇关于ios中实现音视频合并的完整代码的文章就介绍到这了,更多相关ios合并音视频内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论