iOS音軌合成(音頻與音頻,音頻與視頻)

今天和大家一起分享關(guān)于音軌合成的坑(套路!全TM是套路!走一步套一路)

理論部分:

我們需要用到AVURLAsset來初始化文件,然后用AVMutableCompositionAVMutableCompositionTrack來插入音軌,最后用AVAssetExportSession來輸出文件

先說音頻和音頻的合成

首先創(chuàng)建一個(gè)AVMutableComposition對(duì)象
AVMutableComposition *compostion = [AVMutableComposition composition];
然后通過下面的方法,得到一個(gè)AVMutableCompositionTrack對(duì)象
AVMutableCompositionTrack *video = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0];
這里的mediaType傳入的是文件類型,因?yàn)槲覀兗磳⒉迦氲奈募愋褪且纛l,這里要選擇AVMediaTypeAudio,支持的類型見下圖

可選類型

接下里就是插入了,有insert和inserts兩種插入方式,我們先選擇第一種
[video insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[videoAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];
同樣的步驟,我們?cè)俅尾迦肓硪粭l音軌
AVMutableCompositionTrack *audio = [compostion addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:0]; [audio insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[audioAsset tracksWithMediaType:AVMediaTypeAudio].firstObject atTime:kCMTimeZero error:nil];
這樣我們就把兩條音軌都混合到一起了,接下來就是把它輸出成文件,這時(shí)候我們需要?jiǎng)?chuàng)建一個(gè)Session
AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:compostion presetName:AVAssetExportPresetAppleM4A];
其中presetName這個(gè)參數(shù)非惩叶郏坑人,必須文件的后綴和這里設(shè)定的格式相互呼應(yīng)才行,否則文件無法創(chuàng)建,格式也是五花板門,有興趣的小伙伴可以自己試試~

各種輸出格式

有一些設(shè)置需要給出,否者輸出時(shí)程序會(huì)crash掉
1.首先是輸出路徑,切記切記這里的后綴一定要和上面選擇的呼應(yīng),比如我寫的格式為AVAssetExportPresetAppleM4A那么我的文件后綴就需要為.m4a,如果用.MP3這種的話是無法正確生成出文件的,有可能會(huì)出現(xiàn)空文件的存在.一定要注意!!!
2.則是輸出文件類型,這個(gè)更是個(gè)坑,一不留神就崩了,也是和上面的設(shè)置有關(guān),需要給出一個(gè)輸出類型,根據(jù)所選的不同,支持的類型也不同,可以通過[session supportedFileTypes]查詢,然后根據(jù)需要填寫對(duì)應(yīng)的類型.(這里一定要先查詢,否則很容易因?yàn)椴恢С侄鴆rash掉)
3.是否優(yōu)化,屬于可選,但是一般都選擇YES
session.outputURL = [NSURL fileURLWithPath:outPutFilePath];
session.outputFileType = @"com.apple.m4a-audio";
session.shouldOptimizeForNetworkUse = YES;
設(shè)置完以上之后,我們只需要執(zhí)行

"[session exportAsynchronouslyWithCompletionHandler:^{
if ([[NSFileManager defaultManager] fileExistsAtPath:outPutFilePath])
{
// 調(diào)用播放方法
[self playAudio:[NSURL fileURLWithPath:outPutFilePath]];
}
else
{
NSLog(@"輸出錯(cuò)誤");
}
}];"

就可以輸出了.個(gè)人推薦在里面做個(gè)判斷,因?yàn)闊o論合成失敗或者成功,都會(huì)調(diào)用block內(nèi)的方法,但是如果失敗則不會(huì)生成文件.可以通過這個(gè)來判是否合成成功.

插入多個(gè)

蘋果還提供了一個(gè)inserts的函數(shù),我們來試試是否可以批量插入
CMTimeRange range = CMTimeRangeMake(kCMTimeZero, videoAsset.duration);
[video insertTimeRanges:@[[NSValue valueWithCMTimeRange:range],[NSValue valueWithCMTimeRange:range]] ofTracks:@[[videoAsset tracksWithMediaType:AVMediaTypeAudio].firstObject,[audioAsset tracksWithMediaType:AVMediaTypeAudio].firstObject] atTime:kCMTimeZero error:nil];
運(yùn)行!結(jié)果是依然還是一條音軌,原來這是個(gè)批量添加到尾部音軌的函數(shù),即當(dāng)A音軌播放完后,B音軌接著A后面無縫添加,而不是同時(shí)添加音軌.

音頻和視頻

大體上和上面一樣,我們只需要注意改幾個(gè)參數(shù)就好了
AVMutableCompositionTrack *video = [compostion addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:0];

[video insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[videoAsset tracksWithMediaType:AVMediaTypeVideo].firstObject atTime:kCMTimeZero error:nil];
因?yàn)槭且曨l,所以原來的Audio要全部改成Video
AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:compostion presetName:AVAssetExportPresetMediumQuality];

這里的presetNameoutputFileType都要換成一個(gè)視頻格式,注意不同的presetName會(huì)產(chǎn)生不同的outputFileType一定要填寫相對(duì)應(yīng)的支持類型,否則會(huì)直接crash!

必須是其中的類型

文章參考資料

http://blog.csdn.net/linzhiji/article/details/6736704
http://www.reibang.com/p/9f83af9dbbef

寫在最后

如果有什么遺漏或者錯(cuò)誤歡迎指正,共同進(jìn)步!
附上Demo地址:https://github.com/WeiTChen/multitrackerDemo

原創(chuàng)作品,轉(zhuǎn)載請(qǐng)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庐镐,隨后出現(xiàn)的幾起案子恩商,更是在濱河造成了極大的恐慌,老刑警劉巖焚鹊,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痕届,死亡現(xiàn)場離奇詭異,居然都是意外死亡末患,警方通過查閱死者的電腦和手機(jī)研叫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璧针,“玉大人嚷炉,你說我怎么就攤上這事√匠鳎” “怎么了申屹?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長隧膏。 經(jīng)常有香客問我哗讥,道長,這世上最難降的妖魔是什么胞枕? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任杆煞,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘决乎。我一直安慰自己队询,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布构诚。 她就那樣靜靜地躺著蚌斩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪范嘱。 梳的紋絲不亂的頭發(fā)上送膳,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音彤侍,去河邊找鬼肠缨。 笑死逆趋,一個(gè)胖子當(dāng)著我的面吹牛盏阶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闻书,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼名斟,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了魄眉?” 一聲冷哼從身側(cè)響起砰盐,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坑律,沒想到半個(gè)月后岩梳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晃择,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年冀值,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宫屠。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡列疗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浪蹂,到底是詐尸還是另有隱情抵栈,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布坤次,位于F島的核電站古劲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缰猴。R本人自食惡果不足惜产艾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胰舆,春花似錦骚露、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至倦零,卻和暖如春误续,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扫茅。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工蹋嵌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葫隙。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓栽烂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恋脚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腺办,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容