1

ローカルに保持されているオーディオ トラックを、オーディオの不具合なしでフェードインする方法を見つけようとしています。私は 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;
    }
}];
4

1 に答える 1

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];
于 2013-01-24T12:06:53.900 に答える