2013-01-07 23 views
1

我試圖找到一種淡入淡出本地沒有音頻故障的音頻軌道的方法。我使用AVPlayer並使用AVURLAsset從iPodLibrary引用mp3。以下方法大部分時間都適用,但並非所有時間都適用,所以我想我需要掃描音頻數據以尋找最近的音量過零點,然後從那裏進行淡入淡出。任何指針將不勝感激。在AVURL資源集中找到最近的零交叉

float duration = 0.5; 
AVAsset *asset = [self.av_Player.currentItem asset]; 
NSArray *keys = [NSArray arrayWithObject:@"tracks"]; 

[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^(void) { 
    NSError *error = nil; 

    NSTimeInterval now = [self currentPlaybackTime]; 
    CMTime mainFadeIn = CMTimeMakeWithSeconds(now, 6000); 
    CMTime mainFadeDuration = CMTimeMakeWithSeconds(duration, 6000); 
    CMTimeRange timerange = CMTimeRangeMake(mainFadeIn, mainFadeDuration); 

    AVKeyValueStatus trackStatus = [asset statusOfValueForKey:@"tracks" error:&error]; 

    switch (trackStatus) { 
     case AVKeyValueStatusLoaded: 
      if(self.av_Player) { 
       NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 

       AVMutableAudioMixInputParameters *volumeMixInput = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
       [volumeMixInput setVolumeRampFromStartVolume:0.0 toEndVolume:tovolume timeRange:timerange]; 
       [volumeMixInput setTrackID:[[tracks objectAtIndex:0] trackID]]; 

       AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
       [audioMix setInputParameters:[NSArray arrayWithObject:volumeMixInput]]; 
       [self.av_Player.currentItem setAudioMix:audioMix]; 

      } 
      break; 
     default: 
      break; 
    } 
}]; 
+2

你能描述你所得到的毛刺類型嗎?爲什麼你認爲從零幅度交叉點爬坡會有所幫助? – warrenm

回答

0

不知道爲什麼我得到的毛刺用上面的方法,但認爲它可能有一些做用塊。無論如何,我使用下面的代碼,它現在工作順利淡入和淡出 - 希望這可以幫助其他人。

NSTimeInterval now = [self currentPlaybackTime]; 

AVPlayerItem *playerItem = self.av_Player.currentItem; 

AVAsset *asset = playerItem.asset; 
NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 

NSMutableArray *allAudioParams = [NSMutableArray array]; 
for (AVAssetTrack *track in audioTracks) { 
    AVMutableAudioMixInputParameters *audioInputParams = [AVMutableAudioMixInputParameters audioMixInputParameters]; 
    [audioInputParams setVolume:fromvolume atTime:CMTimeMakeWithSeconds(now-0.1, 6000)]; 
    [audioInputParams setVolume:fromvolume atTime:CMTimeMakeWithSeconds(now, 6000)]; 
    [audioInputParams setVolume:tovolume atTime:CMTimeMakeWithSeconds(now+duration, 6000)]; 
    [audioInputParams setTrackID:[track trackID]]; 
    [allAudioParams addObject:audioInputParams]; 
} 

AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
[audioMix setInputParameters:allAudioParams]; 

[playerItem setAudioMix:audioMix];