it编程 > App开发 > 苹果IOS

iOS中实现音视频合并的完整代码

8人参与 2025-05-19 苹果IOS

1. 音频合并(多段音频拼接)

将多个音频文件(如 .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);
    }
}];

2. 视频合并(多段视频拼接)

将多个视频文件(如 .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);
    }
}];

3. 音视频合并(将音频与视频组合)

将独立的音频文件和视频文件合并为一个包含音视频的媒体文件。

代码示例

// 合并音频与视频
- (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);
    }
}];

4. 注意事项

5. 第三方工具推荐

如果需要更复杂的音视频处理(如裁剪、滤镜、转码),可以结合以下工具:

通过以上方案,你可以高效地实现 ios 平台上的音视频合并功能,适用于短视频拼接、音乐创作、播客制作等场景。

到此这篇关于ios中实现音视频合并的完整代码的文章就介绍到这了,更多相关ios合并音视频内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

iOS18.5.4值得升级吗? 三大核心优化实测出炉

05-19

skynet.dispatch 使用示例详解

04-12

skynet.rawcall使用应用场景分析

04-12

skynet.call使用详细解析

04-12

鸿蒙中Axios数据请求的封装和配置方法

04-12

基带版本降级了! 苹果 iOS 18.5 开发者预览版 Beta 发布

04-03

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论