0

タイマーが無効になるまで、毎秒クリック音を鳴らすダウンカウンターを実装しました。同時に、カウンター値を表示しています。

  -(IBAction)start{
    myTicker =[NSTimerscheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showactivity) userInfo:nil repeats:YES];
        }

        -(void)showactivity;{

        int CurrentTime =[time.textintValue];

        NSString *soundFilePath=[[NSBundlemainBundle] pathForResource:@"Click03" ofType:@"wav"];
        NSURL *soundFileURL =[NSURLfileURLWithPath:soundFilePath];
        AVAudioPlayer *player=[[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
        player.numberOfLoops =1;
        [player play];

        int newTime = CurrentTime-1;
        time.text = [NSString stringWithFormat:@"%d",newTime];
        if(newTime ==0){
                [myTicker invalidate];
        time.text = @"0";

            }

        }

カウンターは完全に機能しますが、初期遅延がわずかです。しかし、それはサウンドを再生しません。最小限の遅延などで、このコンセプトを効率的に実装するのを手伝ってくれる人はいますか...

4

3 に答える 3

0

クリックの後に 1 秒間 (クリックの持続時間を差し引いたもの) の無音サンプルが続く 1 秒間のサウンドを作成することができます。player.numberOfLoopsカウントダウンする必要がある秒数に設定し、1 回だけ再生します。

于 2012-09-08T20:03:47.890 に答える
0

AVAudioPlayer を使用してサウンドを再生するには

1) 追加

@property (nonatomic, strong) AVAudioPlayer *player;

ヘッダーファイルに

.m ファイルで合成することを忘れないでください

2) プレーヤーを初期化し、次のコードでサウンドを再生します。

        NSString *soundFilePath=[[NSBundle mainBundle]pathForResource:@"yourSoundFile" ofType:@"caf"];

    NSURL *soundFileURL =[NSURL fileURLWithPath:soundFilePath];

    NSError *err = nil;

    self.player=[[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:&err];

    self.player.numberOfLoops = 0;

    if ([self.player play]) {
        NSLog(@"playing sound");
    }else {
        NSLog(@"COULD NOT play sound");
    };

self.player.numberOfLoops を 0 に設定すると、サウンドが 1 回再生されることに注意してください。1 に設定すると、1 回ループし、サウンドが 2 回続けて再生されます。

于 2012-09-09T18:29:14.507 に答える
0

ARC の割り当て解除の問題を解決するためにできることの 1 つは、すべてのプレーヤーを配列に追加することです。次に、プレーヤーのデリゲートとして自分自身を設定し、オーディオの再生が終了したときにリッスンしてから、配列から削除します。そうすれば、プレーヤーは再生が完了する前に割り当てが解除されることはありません。このようなもの:

@property (nonatomic, strong) NSMutableArray *playersArray

-(void)showactivity
{
    int CurrentTime =[time.textintValue];

    NSString *soundFilePath=[[NSBundlemainBundle] pathForResource:@"Click03" ofType:@"wav"];
    NSURL *soundFileURL =[NSURLfileURLWithPath:soundFilePath];
    AVAudioPlayer *player=[[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
    player.numberOfLoops =1;
    player.delegate = self;
    [player play];
    [self.playersArray addObject:player];

    int newTime = CurrentTime-1;
    time.text = [NSString stringWithFormat:@"%d",newTime];
    if (newTime == 0) {
        [myTicker invalidate];
        time.text = @"0";
    }
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [playersArray removeObject:player];
}

配列を初期化することを忘れないでください。

于 2014-11-19T12:47:46.070 に答える