iOS 多条音频拼接为一条音频进行播放

简介: 把多条mp3音频合并为一条保存并进行播放

场景

把多条mp3音频合并为一条保存并进行播放

解决方案

  1. 首先把全部音频路径生成为一个数组:
NSMutableArray * fileUrlArr = @[].mutableCopy;
    [mp3NameArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSString *mp3Name = [NSString stringWithFormat:@"%@",obj];
        // mp3路径
        NSString *audioFileURL = [[NSBundle mainBundle] pathForResource:mp3Name ofType:@"mp3"];
        [fileUrlArr addObject:audioFileURL];
    }];
  1. 通过以下方法合并音频,保存在一个随机文件中,因为文件如果已存在或者文件目录写入失败,会出现【AVAssetExportSessionStatusFailed】错误码
///合并音频
- (void) mergeAVAssetWithSourceURLs:(NSArray *)sourceURLsArr completed:(void (^)(NSString * outputFileUrlStr)) completed{
    //创建音频轨道,并获取多个音频素材的轨道
    AVMutableComposition *composition = [AVMutableComposition composition];
    //音频插入的开始时间,用于记录每次添加音频文件的开始时间
    __block CMTime beginTime = kCMTimeZero;
    [sourceURLsArr enumerateObjectsUsingBlock:^(id  _Nonnull audioFileURL, NSUInteger idx, BOOL * _Nonnull stop) {
        //获取音频素材
        AVURLAsset *audioAsset1 = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:audioFileURL]];
        //音频轨道
        AVMutableCompositionTrack *audioTrack1 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
        //获取音频素材轨道
        AVAssetTrack *audioAssetTrack1 = [[audioAsset1 tracksWithMediaType:AVMediaTypeAudio] firstObject];
        //音频合并- 插入音轨文件
        [audioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset1.duration) ofTrack:audioAssetTrack1 atTime:beginTime error:nil];
        // 记录尾部时间
        beginTime = CMTimeAdd(beginTime, audioAsset1.duration);
    }];
    //导出合并后的音频文件
    //音频文件目前只找到支持m4a 类型的
    AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:composition presetName:AVAssetExportPresetAppleM4A];
    NSDateFormatter *formater = [[NSDateFormatter alloc] init];
    [formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss-SSS"];
    NSString * timeFromDateStr = [formater stringFromDate:[NSDate date]];
    NSString *outPutFilePath = [NSHomeDirectory() stringByAppendingFormat:@"/tmp/sound-%@.mp4", timeFromDateStr];
    // 音频文件输出
    session.outputURL = [NSURL fileURLWithPath:outPutFilePath];
    session.outputFileType = AVFileTypeAppleM4A; //与上述的`present`相对应
    session.shouldOptimizeForNetworkUse = YES;   //优化网络
    [session exportAsynchronouslyWithCompletionHandler:^{
        if (session.status == AVAssetExportSessionStatusCompleted) {
            NSLog(@"合并成功----%@", outPutFilePath);
            if (completed) {
                completed(outPutFilePath);
            }
        } else {
            // 其他情况, 具体请看这里`AVAssetExportSessionStatus`.
            NSLog(@"合并失败----%ld", (long)session.status);
            if (completed) {
                completed(nil);
            }
        }
    }];
}
  1. 输出合并音频
// 合并音频文件生成新的音频
    [self mergeAVAssetWithSourceURLs:musicArr completed:^(NSString *outputFileUrlStr) {
        if (!outputFileUrlStr) {
            NSLog(@"声音生成失败!");
            return;
        }
            self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:outputFileUrlStr] error:nil];
            [self.audioPlayer play];
    }];


目录
相关文章
|
8月前
|
编解码 开发工具 Android开发
安卓端/iOS端如何播放4K分辨率的RTMP/RTSP流
4K分辨率即4096×2160的像素分辨率,它是2K投影机和高清电视分辨率的4倍,属于超高清分辨率。在此分辨率下,观众将可以看清画面中的每一个细节,每一个特写。影院如果采用惊人的4096×2160像素,无论在影院的哪个位置,观众都可以清楚的看到画面的每一个细节,影片色彩鲜艳、文字清晰锐丽,再配合超真实音效,这种感觉真的是一种难以言传的享受。
260 0
安卓端/iOS端如何播放4K分辨率的RTMP/RTSP流
|
8月前
|
开发工具 图形学 Android开发
Windows/Android/IOS平台如何在Unity3d播放RTSP/RTMP流
如果基于Unity3d完全重新开发一个播放器,代价大,周期长,不适合快速出产品,最好的方式就是集成现有Native平台上成熟稳定播放器.
115 1
|
开发工具 iOS开发 内存技术
iOS开发之多媒体播放
iOS开发之多媒体播放
125 0
|
iOS开发
ios 音乐后台播放
ios 音乐后台播放
56 0
|
iOS开发
iOS后台播放背景音乐文件
iOS后台播放背景音乐文件
116 0
|
编解码 iOS开发 内存技术
iOS 录音、音频的拼接剪切以及边录边压缩转码
iOS 录音、音频的拼接剪切以及边录边压缩转码
746 0
iOS 录音、音频的拼接剪切以及边录边压缩转码
|
XML JSON JavaScript
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
363 0
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
|
数据可视化 API iOS开发
EZAudio:一个 iOS 和 OSX 上的音频可视化框架
EZAudio 是一个 iOS 和 OSX 上简单易用的音频框架。 它的官方的页面在 The Official EZAudio
890 0
EZAudio:一个 iOS 和 OSX 上的音频可视化框架
|
开发工具 iOS开发 git
iOS音频播放器锁屏歌词显示与性能优化
iOS音频播放器锁屏歌词显示与性能优化
229 0
|
Android开发 iOS开发 开发者
iOS中播放gif动态图的方式探讨
iOS中播放gif动态图的方式探讨
207 0