0

Xcode で合計 3 か月間プログラミングしてきましたが、次の小さな問題に悩まされています。

現時点では、 AVPlayer を使用してラジオ ストリーミング アプリを作成しています。このアプリでは、 UICollectionView内のさまざまなラジオ局から選択できます。ステーションを選択すると、サブビューが表示され、UICollectionView が暗くなり、ステーションの名前とActivityIndi ​​catorを含む読み込みビューが表示されます。ここまでは順調ですね。

問題は、再生が開始されたビューを削除する方法がわからないことです。現在、ビューをタッチして手動で一時的に閉じていますが、もちろん、アプリが音を検出したときにこれを自動的に終了させたいと考えています。

ラジオの再生開始/読み込み終了時に subView を閉じるには、dismiss-method をどこに配置すればよいですか?

サブビューのスクリーンショット: http://dl.dropbox.com/u/49270819/iOS%20Simulator%20Screen%20shot%2026%20feb%202013%2023.54.04.png

ありがとうございました!

4

1 に答える 1

0

次のコードを試して、サウンド モニタリングを開始します。

#pragma mark - AudioStuff

double lowPassResultAudio;
-(void) initAudioRecorder {
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setDelegate: self];
    NSError *audioSessionError;
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&audioSessionError];
    [[AVAudioSession sharedInstance] setActive: YES error: &audioSessionError];

    NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init];
    // We can use kAudioFormatAppleIMA4 (4:1 compression) or kAudioFormatLinearPCM for nocompression
    [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
    // We can use 44100, 32000, 24000, 16000 or 12000 depending on sound quality
    [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
    // We can use 2(if using additional h/w) or 1 (iPhone only has one microphone)
    [recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];

    //initiate recorder
    inputAudioUrl = [NSURL fileURLWithPath:pathToFile];
    recorder = [[AVAudioRecorder alloc] initWithURL:inputAudioUrl settings:recordSetting error:&error];
    if(recorder){
        //setting to speaker for appropritae recording
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
                                 sizeof (audioRouteOverride),&audioRouteOverride);
        [recorder setDelegate:self];
        [recorder prepareToRecord];
        recorder.meteringEnabled = YES;

        //for monitoring with same recorder
        [recorder record];

        [[NSTimer alloc] initWithFireDate:[NSDate date] interval:0.1 target:self selector:@selector(monitorAudioController:) userInfo:,mil repeats:YES]

    } else
        NSLog(@"%@",[error description]);
}

サウンド値が制限を超えた場合、つまり近くのサウンドが再生されている場合は、ビューを削除します。

//monitor audion with same recorder
-(void) monitorAudioController: (NSTimer *) timer {
    [recorder updateMeters];
    const double ALPHA = 0.05;
    double peakPowerForChannel_ = pow(10, (ALPHA * [recorder peakPowerForChannel:0]));
//    double lowpassMultiplier = (lowPassResultAudio > 0.2f) ? 0.2f : lowPassResultAudio;
    double AUDIOMONITOR_THRESHOLD = 0.7;
    lowPassResultAudio = ALPHA * peakPowerForChannel_ + (1.0 - ALPHA) * AUDIOMONITOR_THRESHOLD;

   // NSLog(@"peakPowerForChannel_=%lf, lowpassMultiplier = %lf, lowPassResultAudio = %lf", peakPowerForChannel_, AUDIOMONITOR_THRESHOLD, lowPassResultAudio);
    if (lowPassResultAudio >= AUDIOMONITOR_THRESHOLD) {
           //remove here
           //invalidate timer
           //stop recorder monitoring
    }
}
于 2013-02-28T09:12:25.417 に答える