4

stackoverflow ユーザーのおかげで、1 つの AVPlayerTrack をフェードインまたはフェードアウトすることができました。しかし、1 つのトラックで両方を行う方法が見つかりません。

これは私が使用しようとしているものです:

-(void)fadeOutVolume
{
    AVPlayerItem *myAVPlayerItem = self.songPlayer.currentItem;

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

    NSMutableArray *allAudioParams = [NSMutableArray array];
    for (AVAssetTrack *track in audioTracks) {

       AVMutableAudioMixInputParameters *audioInputParams = 
        [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];

       CMTime fadeDuration = CMTimeMakeWithSeconds(5, 600);
       CMTime fadeOutStartTime = 
         CMTimeMakeWithSeconds(CMTimeGetSeconds(myAVPlayerItem.duration)-5, 600);
       CMTime fadeInStartTime = CMTimeMakeWithSeconds(0, 600);


       [audioInputParams setVolumeRampFromStartVolume:1.0 
                                           toEndVolume:0 
                      timeRange:CMTimeRangeMake(fadeOutStartTime, fadeDuration)];

       AVMutableAudioMixInputParameters *audioInputParams2 = 
        [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];

       [audioInputParams2 setVolumeRampFromStartVolume:0.0 
                                           toEndVolume:1.0  
                        timeRange:CMTimeRangeMake(fadeInStartTime, fadeDuration)];


        [allAudioParams addObject:audioInputParams];
        [allAudioParams addObject:audioInputParams2];

    }

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

    [audioMix setInputParameters:allAudioParams];
    [myAVPlayerItem setAudioMix:audioMix];

}

これは、コメント[allAudioParams addObject:audioInputParams];または他の行の場合に機能します。しかし、2 つの入力パラメーターを同時に持つことはできません。

4

2 に答える 2

3

問題が見つかりました。2 つの audioInputParams は必要ありません。実際、何らかの形でオーバーライドしているようです。

新しい audioInputParam を削除して 2 つの設定ランプを実行すると、すべてうまく機能します。実はこれは誤解を招きやすい。SetRamp がオーバーライドされるようで、「addObject」がオーバーライドされます。for部分でこのコードになりました:

AVMutableAudioMixInputParameters *audioInputParams = 
        [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];


CMTime fadeDuration = CMTimeMakeWithSeconds(5, 600);
CMTime fadeOutStartTime = CMTimeMakeWithSeconds(CMTimeGetSeconds(myAVPlayerItem.duration)-5, 600);
CMTime fadeInStartTime = CMTimeMakeWithSeconds(0, 600);

[audioInputParams setVolumeRampFromStartVolume:1.0 toEndVolume:0 timeRange:CMTimeRangeMake(fadeOutStartTime, fadeDuration)];

[audioInputParams setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:CMTimeRangeMake(fadeInStartTime, fadeDuration)];

[allAudioParams addObject:audioInputParams];

私を助けてくれた@Mundiに感謝します。

于 2013-07-29T15:51:45.107 に答える
1

開始ボリューム ランプを設定できるのは 1 回だけです。これは一種の論理ですよね?

後で再度音量を変更したい場合は、

setVolume:atTime:

このメソッドは、時間から開始するボリューム ランプを追加します。この音量設定は、別の音量レベルを後で開始するように設定しない限り、トラックの最後まで有効です。

編集:

たぶん、この答えは完全に正しいとは限りません。この制限を示すドキュメントには何もありません。

fadeOutStratTimeしかし、トラックを反復処理してベースを設定していることに気付きましたmyAVPlayerItem-おそらく、エラーにつながる論理ミスがあります。

于 2013-07-29T14:43:37.260 に答える