1

Airplayで再生しているときにAVPlayerトラックの音量を調整する方法を知っている人はいますか?AVAudioMixとMPVolumeViewを試しましたが、どちらも機能しません。iOS5とiOS6を試してみましたが、最新のxcode4.5.1を使用しています。これが機能しない簡単な例は、setVolumeRampFromStartVolumeを使用して単純なフェードアウトを行うAppleのAVPlayerTestAppです。これはデバイスでは正常に機能しますが、Airplay経由で接続されている場合は機能しません。

ViewDidLoadで、トラックをロードして再生を開始します(これはすべてAVPlayerTestAppから取得されます)

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:TRUE error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];

self.mediaItems = [[[MPMediaQuery songsQuery] items] mutableCopy];

NSURL *anUrl = [[mediaItems objectAtIndex: 0] valueForProperty:MPMediaItemPropertyAssetURL];
AVAsset *asset = [AVURLAsset URLAssetWithURL:anUrl options:nil];
AVPlayerItem *myPlayerItem = [AVPlayerItem playerItemWithAsset:asset];


self.myPlayer1 = [[[AVPlayer alloc] initWithPlayerItem:myPlayerItem] retain];

[myPlayer1 play];

次に、アラートビューを開くボタンがあり、ユーザーが音量を設定してAirplayをオンにすることができます

MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame: CGRectMake(10, 37, 260, 20)] autorelease];
UIAlertView *volumeAlert = [[UIAlertView alloc] initWithTitle:@"Volume" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[volumeView sizeToFit];
[volumeAlert addSubview:volumeView];
[volumeAlert show];
[volumeAlert release];

次に、現在再生中のトラックをフェードアウトする別のボタン

AVAsset *asset = [myPlayer1.currentItem asset];
NSArray *keys = [NSArray arrayWithObject:@"tracks"];
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^(void) {
    NSError *error = nil;
    AVKeyValueStatus trackStatus = [asset statusOfValueForKey:@"tracks" error:&error];
    CMTime currentTime;
    switch (trackStatus) {
        case AVKeyValueStatusLoaded:
            if(myPlayer1)
            {
                NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeAudio];
                NSMutableArray * allAudioParams = [NSMutableArray array];
                for (AVAssetTrack *t in tracks) {
                    AVMutableAudioMixInputParameters *params =[AVMutableAudioMixInputParameters audioMixInputParameters];

                    float fadeOutSeconds = 5;

                    currentTime = [myPlayer1 currentTime];

                    [params setVolumeRampFromStartVolume: 1.0 toEndVolume: 0.0 timeRange: CMTimeRangeMake(currentTime, CMTimeMakeWithSeconds(fadeOutSeconds, 1))];

                    [params setTrackID:[t trackID]];
                    [allAudioParams addObject:params];
                }
                AVMutableAudioMix * zeromix = [AVMutableAudioMix audioMix];
                [zeromix setInputParameters:allAudioParams];

                [myPlayer1.currentItem setAudioMix:zeromix];
            }

            break;
        case AVKeyValueStatusFailed:
            // error occured loading AVAsset
            NSLog(@"error occured loading AVAsset");
            break;
        case AVKeyValueStatusCancelled:
            // loading of the AVAsset was cancelled
            NSLog(@"loading of the AVAsset was cancelled");
            break;
        default:
            break;
    }
}];

これはデバイスで期待どおりに機能し、ボタンをタップすると音量が下がります。ただし、Airplayがオンになっている場合、音量の変更は行われません。MPMoviePlayControllerを使用すると、Airplayで動作するフェードを自分で行うことができますが、AVPlayerはAirplayでのレイテンシが少ないので、むしろそれを使用したいと思います。

どんな助けでも大歓迎です。

4

1 に答える 1

1

Sam_899 が回答を投稿しなかったので、私はそれをしなければなりません。私の知る限り、ミラーリングをオンにして接続しない限り、エアプレイで avplayer の音量を制御することは不可能です。ミラーリングをオンにする唯一の方法は、アプリの外部から行うことであるため、唯一のオプションは、ユーザーに自分でオンにする方法を知らせ、ユーザーがそれに満足することを願うことです! エアプレイでミラーリングをオンにする方法がわからない人向け。ホームボタンをダブルクリックし、左にスワイプして音量コントロールを表示し、airplay アイコンをタップし、接続する Airplay デバイスを選択して、ミラーリングをオンにします。

于 2013-02-18T18:05:27.853 に答える