10

で使用する独自のカスタム コントロールを作成しましたMPMoviePlayerController。これまでのところ、ミュート ボタン コントロール以外はすべて機能します。

AVAudioSessionのインスタンスを作成する前に、次のコードを使用してを構成しましたMPMoviePlayerController

    NSError *modeError = nil;
    [self.audioSession setMode:AVAudioSessionModeMoviePlayback error:&modeError];
    if (modeError != nil) {
        NSLog(@"Error setting mode for AVAudioSession: %@", modeError);
    }

    NSError *categoryError = nil;
    [self.audioSession setCategory:AVAudioSessionCategoryPlayback error:&categoryError];
    if (categoryError != nil) {
        NSLog(@"Error setting category for AVAudioSession: %@", categoryError);
    }

次に、ミュート ボタンのコールバック メソッドに次のコードを記述します。

    NSError *activeError = nil;
    [self.audioSession setActive:NO error:&activeError];
    if (activeError != nil) {
        NSLog(@"Error setting inactive state for AVAudioSession: %@", activeError);
    }

[ミュート] ボタンをクリックすると、次の役に立たないエラーが表示されます。

Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn’t be completed. (OSStatus error 560030580.)"

フレームワークにリンクしていAVFoundationます。

私の人生では、アプリケーションの再生オーディオを減らしたりミュートしたりする方法を見つけることができないので、これは本当に私を悩ませ始めています。

システムのグローバル ボリュームを変更したくありませんAVAudioSession AVAudioSessionCategoryPlayback。カテゴリで定義されているアプリケーション レベルのボリュームだけを変更します。

の音量は設定できるようですが、 の音量は設定できAVAudioPlayerないようMPMoviePlayerControllerです。のインスタンスを作成してボリュームを設定するだけというSOに関する他の投稿を見てきましたAVAudioPlayerが、これによりアプリがクラッシュするだけであり、initWithContentsOfURL:error:orinitWithData:error:を使用せず、代わりに `初期化'。

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

4

2 に答える 2

4

これが古い投稿であることはわかっていますが、MPVolumeView を使用して、iOS6 および iOS7 で MPMoviePlayerController コントロールの音量を正常に制御する方法を見つけることができました。1 つの落とし穴は、シミュレーターでは機能せず、物理デバイスでのみ機能することです。ボリュームを制御するだけの場合は、非表示の MPVolumeView を追加すると問題なく動作します。ただし、非表示のものを使用すると、物理デバイスの音量ボタンを使用して音量を変更したときに表示されるネイティブ OS の音量表示が画面中央に表示されます。これを防ぎたい場合は、MPVolumeView が非表示になっていないことを確認してください。代わりに、アルファ透明度を非常に低くして、他のビューの背後に配置することで、ユーザーには見えないようにすることができます。

私が使用したコードは次のとおりです。

MPVolumeView *volumeView = [[MPVolumeView alloc]initWithFrame:CGRectZero];
[volumeView setShowsVolumeSlider:YES];
[volumeView setShowsRouteButton:NO];

// control must be VISIBLE if you want to prevent default OS volume display
// from appearing when you change the volume level
[volumeView setHidden:NO];
volumeView.alpha = 0.1f;
volumeView.userInteractionEnabled = NO;

// to hide from view just insert behind all other views
[self.view insertSubview:volumeView atIndex:0];

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0.0]; を呼び出して音量を制御できます。

しかし、最初にボリュームを変更しようとしたときにネイティブOSのボリューム表示が表示されていました.2回目以降のロードでは、この表示は表示されませんでした。私のviewDidLoadメソッドからviewDidAppearメソッドへ - それは機能しました - 音量がミュートされ、ネイティブの音量表示は表示されませんでしたが、ビデオの再生が始まる前に一瞬オーディオを聞くことができました. そこで、再生状態にフックして、MPMoviePlayerController のデリゲートを変更しました。viewDidload で追加しました:

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(videoPlaybackStateDidChange:) 
    name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil];

そしてデリゲート コールバック メソッド:

-(void)videoPlaybackStateDidChange:(NSNotification *)aNotification
{
    // Note, this doesn't work in simulator (even in iOS7), only on actual device!
    if ([moviePlayerController playbackState] == MPMoviePlaybackStatePlaying)
    {
        [[MPMusicPlayerController applicationMusicPlayer] setVolume:0.0];
    }
}

これにより、再生が開始される前にビデオのオーディオがミュートされましたが、ライフ サイクルの viewDidLoad の後にミュートされたため、ネイティブ OS のボリューム ミュート表示はありませんでした。

私のアプリでは、ミュートする前に現在の音量レベルを取得して保存し ([MPMusicPlayerController applicationMusicPlayer].volume プロパティを使用)、View Controller を閉じたときに音量をこのレベルに戻しました。つまり、ユーザーは自分のデバイスの音量に気付かないということです。レベルが変更され、元に戻されました。

また、MPMoviePlayerController が iOS7 で非標準のオーディオ ルートを使用している場合、[[MPMusicPlayerController applicationMusicPlayer] setVolume:0.0] を呼び出してもうまくいかない場合があります。この場合、ビューが見つかるまで MPVolumeView コントロールのサブビューをループできます。 UISlider をサブクラス化します。その後、 [sliderView setValue:0 animation:NO] を呼び出すことができます。これはうまくいくはずです。このメソッドは、プライベートな Apple API を使用していないため、アプリが拒否されることはありません。結局のところ、この機能を提供する正当な理由は非常に多くありますが、iOS6 では、これらの長さに行く必要なく可能でした! 実際、Apple がそもそも iOS7 の MPMoviePlayerController でボリュームを設定する機能を削除したことを発見して、私は困惑しました.. AVPlayer への強制的な移行?

更新:私の iPad アプリは現在、この方法を使用して承認され、アプリ ストアで公開されています。

于 2014-08-05T17:58:18.263 に答える