5

AVAudioPlayer を使用して iPhone アプリで MP3 を再生します。特定の時間 (30 秒、1 分など) にいくつかの操作を実行する必要があります。mp3 の再生時間に基づいてコールバック関数を呼び出す方法はありますか?

4

6 に答える 6

8

最善の解決策は、プレイNSTimerを開始するときに開始することだと思います。AVAudioPlayer0.5 秒ごとに起動するようにタイマーを設定できます。次に、タイマーが起動するたびcurrentTimeに、オーディオ プレーヤーのプロパティを確認します。

特定の間隔で何かを行うために、タイマー コールバックが最後に呼び出されたときからの再生時間のインスタンス変数を保持することをお勧めします。次に、最後のコールバックとこれの間の臨界点を通過した場合は、アクションを実行します。

したがって、疑似コードでは、タイマー コールバックは次のようになります。

  1. AVAudioPlayercurrentTimeの取得
  2. currentTimeより大きいかどうかを確認しますcriticalPoint
  3. lastCurrentTimeはいの場合は、より小さいかどうかを確認しますcriticalPoint
  4. それにも当てはまる場合は、アクションを実行してください。
  5. lastCurrentTimeに設定currentTime
于 2012-05-14T09:49:39.237 に答える
5

AVAudioPlayerの代わりにAVPlayerを使用できる場合は、境界または定期的な時間オブザーバーを設定できます。

// File URL or URL of a media library item
AVPlayer *player = [[AVPlayer alloc] initWithURL:url];        

CMTime time = CMTimeMakeWithSeconds(30.0, 600);
NSArray *times = [NSArray arrayWithObject:[NSValue valueWithCMTime:time]];

id playerObserver = [player addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
    NSLog(@"Playback time is 30 seconds");            
}];

[player play];

// remove the observer when you're done with the player:
[player removeTimeObserver:playerObserver];

AVPlayerのドキュメント: http ://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/Reference.html

于 2012-05-21T09:53:36.327 に答える
1

はい、もちろんできます...トリッキーです。うまくいくことを願っていますが、私にはうまくいきます..

1- you play your mp3 file.

2-[self performSelector:@selector(Operation:) withObject:Object afterDelay:30]; 次に関数

-(void)Operation:(id)sender;

と呼ばれる; したがって、mp3 ファイルの 30 秒後に関数を起動しました。必要な時間に基づいて多くの関数を作成できます。

3-タイマーを使用した他の解決策があります

[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(CheckTime:) userInfo:nil repeats:YES];

Check Timeという関数が起動します

-(void)CheckTime:(id)sender{
   if (avAudioPlayerObject.currentTime == 30.0)
   {
       //Do Something
       //Fire and function call such
       [self performSelector:@selector(Operation:) withObject:Object]
   }
}

次に、必要な時間間隔を変更できます。繰り返しは、このアクションを5秒ごとに繰り返すかどうかを制御するためのものです..それが役立つことを願っています..

ありがとう

于 2012-05-14T09:49:41.150 に答える
1

マルチスレッドを使用すると、目標は簡単です。次のようにしてください。

1 :  in your main thread create a variable for storing time passed 
2 :  create new thread like "checkthread" that check each 30-20 sec(as you need)
3 :  if the time passed is what you want do the callback  
于 2012-05-14T09:51:48.970 に答える
1

現在の再生時間を取得できることを示していると思われるプロパティ プロパティを説明するこのリンクを見つけました。

サウンドが再生中の場合、currentTime は現在の再生位置のオフセットであり、サウンドの開始からの秒数で測定されます。サウンドが再生されていない場合、currentTime は play メソッドの呼び出し時に再生が開始される位置のオフセットであり、サウンドの開始からの秒数で測定されます。

このプロパティを設定すると、サウンド ファイル内の特定のポイントをシークしたり、オーディオの早送りおよび巻き戻し機能を実装したりできます。

時間を確認してアクションを実行するには、単純にクエリを実行できます。

if (avAudioPlayerObject.currentTime == 30.0) //You may need a more broad check. Double may not be able to exactly represent 30.0s
{
    //Do Something
}
于 2012-05-14T09:47:18.480 に答える
1

30 秒後に別のサウンド ファイルを再生したい場合は、次のコードを使用します。

1) すべてのサウンド ファイルを配列に入れ、ドキュメント ディレクトリから取得する

2)次にこれを試してください:

-(IBAction)play_sound
{

    BackgroundPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:[Arr_tone_selected objectAtIndex:j]ofType:@"mp3"]]error:NULL];
    BackgroundPlayer.delegate=self;

    [BackgroundPlayer play];


}   


- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [BackgroundPlayer stop];
    j++;
    [self performSelector:@selector(play_sound) withObject:Object afterDelay:30];   
}
于 2012-05-14T10:02:20.683 に答える