iOS 多條音頻拼接為一條音頻進(jìn)行播放

場(chǎng)景

把多條mp3音頻合并為一條保存并進(jìn)行播放

解決方案

  1. 首先把全部音頻路徑生成為一個(gè)數(shù)組:
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. 通過(guò)以下方法合并音頻,保存在一個(gè)隨機(jī)文件中,因?yàn)槲募绻汛嬖诨蛘呶募夸泴?xiě)入失敗,會(huì)出現(xiàn)【AVAssetExportSessionStatusFailed】錯(cuò)誤碼
///合并音頻
- (void) mergeAVAssetWithSourceURLs:(NSArray *)sourceURLsArr completed:(void (^)(NSString * outputFileUrlStr)) completed{
    //創(chuàng)建音頻軌道,并獲取多個(gè)音頻素材的軌道
    AVMutableComposition *composition = [AVMutableComposition composition];
    //音頻插入的開(kāi)始時(shí)間,用于記錄每次添加音頻文件的開(kāi)始時(shí)間
    __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];
        // 記錄尾部時(shí)間
        beginTime = CMTimeAdd(beginTime, audioAsset1.duration);
    }];
    //導(dǎo)出合并后的音頻文件
    //音頻文件目前只找到支持m4a 類(lèi)型的
    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`相對(duì)應(yīng)
    session.shouldOptimizeForNetworkUse = YES;   //優(yōu)化網(wǎng)絡(luò)
    [session exportAsynchronouslyWithCompletionHandler:^{
        if (session.status == AVAssetExportSessionStatusCompleted) {
            NSLog(@"合并成功----%@", outPutFilePath);
            if (completed) {
                completed(outPutFilePath);
            }
        } else {
            // 其他情況, 具體請(qǐng)看這里`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];
    }];

參考:
https://www.cxyzjd.com/article/ismilesky/52780349
http://m.itdecent.cn/p/3e357e3129b8
http://www.cocoachina.com/articles/17624

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天青石的票圈出鏡率最高的,莫過(guò)于張藝謀的新片終于定檔了。 一張滿溢著水墨風(fēng)的海報(bào)一次次的出現(xiàn)在票圈里,也就是老謀...
    青石電影閱讀 10,991評(píng)論 1 2
  • 一、jQuery簡(jiǎn)介 JQ是JS的一個(gè)優(yōu)秀的庫(kù),大型開(kāi)發(fā)必備。在此,我想說(shuō)的是,JQ里面很多函數(shù)使用和JS類(lèi)似,所...
    Welkin_qing閱讀 12,926評(píng)論 1 6
  • 字符串 1.什么是字符串 使用單引號(hào)或者雙引號(hào)括起來(lái)的字符集就是字符串。 引號(hào)中單獨(dú)的符號(hào)、數(shù)字、字母等叫字符。 ...
    mango_2e17閱讀 7,835評(píng)論 1 7
  • 一場(chǎng)說(shuō)走就走的旅行。 簡(jiǎn)單地整理幾件必備旅行用品,7.18日早上8.00準(zhǔn)時(shí)出發(fā)了,計(jì)劃一路南下然后繞西南一圈回恩...
    悠游魚(yú)閱讀 3,680評(píng)論 3 6
  • 原來(lái)看過(guò)一段話,第一厲害的人有能力沒(méi)脾氣,第二厲害的人有能力有脾氣,最差的是沒(méi)能力有脾氣的人。 以我最...
    涼風(fēng)豆豆閱讀 1,637評(píng)論 2 0

友情鏈接更多精彩內(nèi)容