iOS 音频拼接
工作中或許會遇到這樣的需求,將兩段不同的音頻合成一個音頻(暫且稱之為音頻拼接),實現(xiàn)起來相對來說不是很難,再介紹如何拼接之前,先了解下AVFoundation下的幾個基本知識點。
基本知識
-
AVAsset
正如官網(wǎng)文檔所說——"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來進(jìn)行初始化。
-
AVMutableComposition
AVMutableComposition結(jié)合了媒體數(shù)據(jù),可以看成是track(音頻軌道)的集合,用來合成音視頻。
-
AVMutableCompositionTrack
AVMutableCompositionTrack用來表示一個track,包含了媒體類型、音軌標(biāo)識符等信息,可以插入、刪除、縮放track片段。
-
AVAssetTrack
AVAssetTrack表示素材軌道。
-
AVAssetExportSession
AVAssetExportSession用來對一個AVAsset源對象進(jìn)行轉(zhuǎn)碼,并導(dǎo)出為事先設(shè)置好的格式。
音頻拼接
介紹完基本知識,接下來就介紹下如何實現(xiàn)音頻拼接。
????NSString?*auidoPath1?=?[[NSBundle?mainBundle]?pathForResource:@"三全音"?ofType:@"mp3"];????NSString?*audioPath2?=?[[NSBundle?mainBundle]?pathForResource:@"五環(huán)之歌"?ofType:@"mp3"];????AVURLAsset?*audioAsset1?=?[AVURLAsset?assetWithURL:[NSURL?fileURLWithPath:auidoPath1]];????AVURLAsset?*audioAsset2?=?[AVURLAsset?assetWithURL:[NSURL?fileURLWithPath:audioPath2]];
1、首先,獲取本地的兩個音頻素材(一首五環(huán)之歌和iPhone的默認(rèn)通知提示音):2、接下來就是創(chuàng)建兩個音頻軌道,并獲取工程中兩個音頻素材的軌道:
????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、將兩段音頻插入音軌文件進(jìn)行合并:
????//?音頻合并?-?插入音軌文件[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導(dǎo)出合并后音頻文件:
????//?合并后的文件導(dǎo)出?-?音頻文件目前只找到合成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];}];對于音頻文件的合成導(dǎo)出類型,目前只找到支持.m4a格式的(不知道是否支持其他類型)。對于導(dǎo)出文件所支持的類型可以通過[session supportedFileTypes]進(jìn)行查看。demo鏈接...
總結(jié)
- 上一篇: Python标准异常总结
- 下一篇: 计算机无法正常更新,无法完成更新正在撤销