AVFoundation 教你如何處理混音踩麦,拼接枚赡,消音,快進(jìn)倒放等功能谓谦!

第一 對(duì)于AVFoundation的理解

我們現(xiàn)在原生上對(duì)于視頻的處理都是在于avfoundation的框架下完成的.那我們對(duì)視頻的剪接贫橙、混音、倒放反粥、快進(jìn)等大部分功能卢肃。

一、混音

AVMutableComposition

混音主要我們會(huì)使用大avfoundation的一個(gè)API才顿,AVMutableComposition(音視頻組合軌道)相當(dāng)于一個(gè)容器.

    //創(chuàng)建一個(gè)音視頻組合軌道
    AVMutableComposition *mainComposition = [[AVMutableComposition alloc]init];

AVMutableCompositionTrack

創(chuàng)建對(duì)應(yīng)的音視頻軌道 ==> AVMutableCompositionTrack

    //可變音視頻軌道添加一個(gè) 視頻通道
    AVMutableCompositionTrack *compositionVideoTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    
    //可變音視頻軌道添加一個(gè) 音頻通道
    AVMutableCompositionTrack *compositionAudioTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

這個(gè)相當(dāng)于一個(gè)容器里又兩個(gè)對(duì)應(yīng)不同屬性的杯子.

AVAssetTrack

AVAssetTrack是一個(gè)軌道.一個(gè)AVAsset對(duì)象里有兩個(gè)數(shù)組.該數(shù)組分別裝著兩個(gè)不同屬性的軌道.既是音視軌軌道.

    //視頻通道數(shù)組
    NSArray<AVAssetTrack *> *videoTrackers = [asset tracksWithMediaType:AVMediaTypeVideo];
    if (0 >= videoTrackers.count) {
        NSLog(@"數(shù)據(jù)獲取失敗");
        return ;
    }
    
    //獲取第一個(gè)視頻通道
    AVAssetTrack *video_track = [videoTrackers objectAtIndex:0];
********************************************************
//獲取音頻軌道數(shù)組
    NSArray<AVAssetTrack *> *audioTrackers = [asset tracksWithMediaType:AVMediaTypeAudio];
    if (0 >= audioTrackers.count) {
        NSLog(@"獲取音頻數(shù)據(jù)失敗");
        return;
    }

    //獲取第一個(gè)音頻軌道
    AVAssetTrack *audio_track = [audioTrackers objectAtIndex:0];

將獲取的視軌倒入杯子

 //視頻時(shí)間
    float video_times = (float)asset.duration.value / (float)asset.duration.timescale;
    
    compositionVideoTrack.preferredTransform = video_track.preferredTransform;
    NSError *error = nil;
    
    //把采集軌道數(shù)據(jù)加入到可變軌道之中
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration)
                                   ofTrack:video_track
                                    atTime:kCMTimeZero
                                     error:&error];
    if (error) {
        NSLog(@"error;%@",error);
        return;
    }
*****************************************************
//獲取第一個(gè)音頻軌道
    AVAssetTrack *audio_track = [audioTrackers objectAtIndex:0];
    int audio_time_scale = audio_track.naturalTimeScale;
    
    
    //獲取音頻的時(shí)間
    CMTime audio_duration = CMTimeMake(video_times * audio_time_scale, audio_time_scale);
    
    //將音頻軌道加入到可變軌道中
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audio_duration)
                                   ofTrack:audio_track
                                    atTime:kCMTimeZero
                                     error:&error];
    if (error) {
        NSLog(@"音軌error:%@",error);
        return;
    }

對(duì)于- (BOOL)insertTimeRange:(CMTimeRange)timeRange ofTrack:(AVAssetTrack *)track atTime:(CMTime)startTime error:(NSError * _Nullable * _Nullable)outError方法.timeRange表示的該視頻的時(shí)間范圍,track表示 你插入的軌道.StartTime 表示 你要在哪個(gè)時(shí)間點(diǎn)去開始插入這個(gè)軌道. outError 返回的錯(cuò)誤信息.

再加入一個(gè)音軌

這個(gè)音軌可以從別的視頻里獲取,也可以從MP3中獲取

    //增加音軌
    //采集資源
    AVURLAsset *mixAsset = [[AVURLAsset alloc]initWithURL:mixAssetUrl options:nil];
    NSArray<AVAssetTrack *> *audioTrackers_mix = [mixAsset tracksWithMediaType:AVMediaTypeAudio];
    if (0 >= audioTrackers_mix.count) {
        NSLog(@"獲取第二音軌資源失敗");
        return;
    }
    
    //可變音視軌道再添加一個(gè) 音軌
    AVMutableCompositionTrack *mixAudioTrack = [mainComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];//第二音軌
    
    //將采集到數(shù)據(jù)加入到第二音軌
    [mixAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audio_duration)
                           ofTrack:[audioTrackers_mix objectAtIndex:0]
                            atTime:kCMTimeZero
                             error:&error];

對(duì)音視軌操作

該階段是對(duì)音視軌的處理.比如混音的時(shí)候如何處理哪個(gè)音軌音量的大小,設(shè)置視頻的大小.

  //視頻操作指令集合
    AVMutableVideoComposition *select_videoComposition = [AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:mainComposition];
    
    AVMutableVideoComposition *first_vcn = [AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:asset];
    
    select_videoComposition.renderSize = first_vcn.renderSize;
    
    AVMutableAudioMix *videoAudioMixTools = [AVMutableAudioMix audioMix];
    
    //獲取第一個(gè)音頻軌道
    AVMutableAudioMixInputParameters *firstAudioParam = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:compositionAudioTrack];
    
    //設(shè)置第一個(gè)音軌音量
    [firstAudioParam setVolumeRampFromStartVolume:firstStartVolume toEndVolume:firstEndVolume timeRange:CMTimeRangeMake(kCMTimeZero, asset.duration)];
    
    //第二個(gè)音頻軌道
    AVMutableAudioMixInputParameters *secondAudioParam = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:mixAudioTrack];
    [secondAudioParam setVolumeRampFromStartVolume:secondStartVolume toEndVolume:secondEndVolume timeRange:CMTimeRangeMake(kCMTimeZero, asset.duration)];
    videoAudioMixTools.inputParameters = @[firstAudioParam,secondAudioParam];

到這里你就可以獲得三個(gè)參數(shù)分別為mainComposition(既是音視頻組合軌道)莫湘、select_videoComposition(視頻操作指令集合)videoAudioMixTools(音頻操作).

預(yù)覽

預(yù)覽主要用到三個(gè)參數(shù) mainComposition select_videoComposition videoAudioMixTools

    AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:sourceVideo_.mainComposition];   
    [item setAudioMix:sourceVideo_.videoAudioMixTools];
    AVPlayer *tmpPlayer = [AVPlayer playerWithPlayerItem:item];
    self.player = tmpPlayer;
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    playerLayer.frame = self.videoContainView.bounds;
    playerLayer.videoGravity = AVLayerVideoGravityResize;
    [self.view.layer addSublayer:playerLayer];

到這里你就能感受到混音的功能了娜膘。下一個(gè)文章我將給大家講解如何去實(shí)現(xiàn)吧處理后的音視頻如何壓縮寫出來成一個(gè)文件。

原創(chuàng)文章轉(zhuǎn)載需獲授權(quán)并注明出處
請(qǐng)?jiān)诤笈_(tái)留言聯(lián)系轉(zhuǎn)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末优质,一起剝皮案震驚了整個(gè)濱河市竣贪,隨后出現(xiàn)的幾起案子军洼,更是在濱河造成了極大的恐慌,老刑警劉巖演怎,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匕争,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爷耀,警方通過查閱死者的電腦和手機(jī)甘桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歹叮,“玉大人跑杭,你說我怎么就攤上這事∨毓ⅲ” “怎么了德谅?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萨螺。 經(jīng)常有香客問我窄做,道長(zhǎng),這世上最難降的妖魔是什么慰技? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任椭盏,我火速辦了婚禮,結(jié)果婚禮上吻商,老公的妹妹穿的比我還像新娘掏颊。我一直安慰自己,他們只是感情好手报,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布蚯舱。 她就那樣靜靜地躺著,像睡著了一般掩蛤。 火紅的嫁衣襯著肌膚如雪枉昏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天揍鸟,我揣著相機(jī)與錄音兄裂,去河邊找鬼。 笑死阳藻,一個(gè)胖子當(dāng)著我的面吹牛晰奖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腥泥,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼匾南,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛔外?” 一聲冷哼從身側(cè)響起蛆楞,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤溯乒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后豹爹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裆悄,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年臂聋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了光稼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孩等,死狀恐怖艾君,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞎访,我是刑警寧澤腻贰,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站扒秸,受9級(jí)特大地震影響播演,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伴奥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一写烤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拾徙,春花似錦洲炊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至崖瞭,卻和暖如春狂巢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背书聚。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工唧领, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雌续。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓斩个,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驯杜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子受啥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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