你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS 音頻拼接

iOS 音頻拼接

編輯:IOS開發基礎

工作中或許會遇到這樣的需求,將兩段不同的音頻合成一個音頻(暫且稱之為音頻拼接),實現起來相對來說不是很難,再介紹如何拼接之前,先了解下AVFoundation下的幾個基本知識點。

基本知識
  • AVAsset

    正如官網文檔所說——"AVAsset is an abstract class to represent timed audiovisual media such as videos and sounds. Each asset contains a collection of tracks that are intended to be presented or processed together, each of a uniform media type, including but not limited to audio, video, text, closed captions, and subtitles".大致意思就是說AVAsset是AVFoundation中的一個抽象類,用來代表多媒體資源,比如,音頻,視頻等。

  • AVURLAsset

    AVURLAsset是AVAsset的子類,是一個具體類,用URL來進行初始化。

  • AVMutableComposition

    AVMutableComposition結合了媒體數據,可以看成是track(音頻軌道)的集合,用來合成音視頻。

  • AVMutableCompositionTrack

    AVMutableCompositionTrack用來表示一個track,包含了媒體類型、音軌標識符等信息,可以插入、刪除、縮放track片段。

  • AVAssetTrack

    AVAssetTrack表示素材軌道。

  • AVAssetExportSession

    AVAssetExportSession用來對一個AVAsset源對象進行轉碼,並導出為事先設置好的格式。

    音頻拼接

    介紹完基本知識,接下來就介紹下如何實現音頻拼接。
    1、首先,獲取本地的兩個音頻素材(一首五環之歌和iPhone的默認通知提示音):

        NSString *auidoPath1 = [[NSBundle mainBundle] pathForResource:@"三全音" ofType:@"mp3"];    NSString *audioPath2 = [[NSBundle mainBundle] pathForResource:@"五環之歌" ofType:@"mp3"];    AVURLAsset *audioAsset1 = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:auidoPath1]];    AVURLAsset *audioAsset2 = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:audioPath2]];

    2、接下來就是創建兩個音頻軌道,並獲取工程中兩個音頻素材的軌道:

        AVMutableComposition *composition = [AVMutableComposition composition];    // 音頻軌道
        AVMutableCompositionTrack *audioTrack1 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];    AVMutableCompositionTrack *audioTrack2 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];    // 音頻素材軌道
        AVAssetTrack *audioAssetTrack1 = [[audioAsset1 tracksWithMediaType:AVMediaTypeAudio] firstObject];    AVAssetTrack *audioAssetTrack2 = [[audioAsset2 tracksWithMediaType:AVMediaTypeAudio] firstObject];

    3、將兩段音頻插入音軌文件進行合並:

        // 音頻合並 - 插入音軌文件
        [audioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset1.duration) ofTrack:audioAssetTrack1 atTime:kCMTimeZero error:nil];
        [audioTrack2 insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset2.duration) ofTrack:audioAssetTrack2 atTime:kCMTimeZero error:nil];

    4、最後就是用AVAssetExportSession導出合並後音頻文件:

        // 合並後的文件導出 - 音頻文件目前只找到合成m4a類型的
        AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetAppleM4A];    NSString *outPutFilePath = [[self.filePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"xindong.m4a"];
        session.outputURL = [NSURL fileURLWithPath:outPutFilePath];
        session.outputFileType = AVFileTypeAppleM4A;
        [session exportAsynchronouslyWithCompletionHandler:^{        NSLog(@"合並完成----%@", outPutFilePath);
            _player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:outPutFilePath] error:nil];
            [_player play];
        }];

    對於音頻文件的合成導出類型,目前只找到支持.m4a格式的(不知道是否支持其他類型)。對於導出文件所支持的類型可以通過[session supportedFileTypes]進行查看。demo鏈接...



文章轉自 心董兒的簡書

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved