ios - 在AVURLAsset中找到最近的零交叉

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

最佳答案

不知道为什么我在使用上述方法时会出现故障,但认为它可能与使用块有关。无论如何,我使用下面的代码,现在它可以平滑地用于淡入和淡出-希望这对其他人有帮助。

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

关于ios - 在AVURLAsset中找到最近的零交叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14200794/

相关文章:

ios - iOS AVPlayer没有声音

ios - 子类化 UIImagePickerController 以添加功能

audio - Interpolate Hermite 方法的解释

java - 无法从Java中的JComboBox播放声音

events - IMFMediaSource::GetEvent 永远不会收到事件

objective-c - 使用 AVPlayer 无法在 ios8 中播放视频

ios - AVAudioSession 类别变为 nil 并且 mediaServicesWereReset,avplayer 播放一直失败

ios - 性能缓慢 Json 图像分辨率

选择显示键盘的单元格时,iOS TableView 的 indexPath 错误

android - 使用 Parse 从 Ruby On Rails 向 Android 和 IOS 用户推送通知