在AVURLAsset中查找最近的过零点

时间:2013-01-07 17:17:15

标签: ios audio avplayer

我正试图找到一种淡入本地音频轨道的方法,而不会出现音频故障。我正在使用AVPlayer并使用AVURLAsset从iPodLibrary引用mp3。以下方法大部分时间都可以工作,但不是所有时间,所以我认为我需要扫描音频数据,寻找最近的音量过零点并从那里进行淡入淡出。任何指针都会非常感激。

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;
    }
}];

1 个答案:

答案 0 :(得分: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];