1

トラックをシークするために、スライダーでを使用しようとしてAVAudioPlayerいます (何も複雑ではありません)。

しかし、私は奇妙な動作をしています... currentTime(0 と trackDuration の間の) 値の場合、プレーヤーはトラックの再生を停止し、audioPlayerDidFinishPlaying:successfully: 正常に NO になります。そして入らなかったaudioPlayerDecodeErrorDidOccur:error:

私が与えている時間を読めないようなものです。

たとえば、トラックの長さは次のとおりです。295.784424 秒 55.0 秒に設定currentTimeします (つまり、54.963878 または 54.963900 または 54.987755 など、%f として出力される場合)。「クラッシュ」は、currentTimeが 54.987755 のときに常に発生します...そして、その理由が本当にわかりません...

ですので、もしよろしければ・・・^^

4

3 に答える 3

5

また、「AVAudioPlayer setCurrentTime:」でオーディオ スキップを適切に機能させるのにも苦労しました。

多くの実験の後、シミュレーターとデバイスで確実に動作するシーケンスを見つけました: (OS3.1+でテスト済み)

// Skips to an audio position (in seconds) of the current file on the [AVAudioPlayer* audioPlayer] class instance
// This works correctly for a playing and paused audioPlayer
//
- (void) skipToSeconds:(float)position
{
    @synchronized(self) 
    {
        // Negative values skip to start of file
        if ( position<0.0f )
            position = 0.0f;

        // Rounds down to remove sub-second precision
        position = (int)position;

        // Prevent skipping past end of file
        if ( position>=(int)audioPlayer.duration )
        {
            NSLog( @"Audio: IGNORING skip to <%.02f> (past EOF) of <%.02f> seconds", position, audioPlayer.duration );
            return;
        }

        // See if playback is active prior to skipping
        BOOL skipWhilePlaying = audioPlayer.playing;

        // Perform skip
        NSLog( @"Audio: skip to <%.02f> of <%.02f> seconds", position, audioPlayer.duration );

        // NOTE: This stop,set,prepare,(play) sequence produces reliable results on the simulator and device.
        [audioPlayer stop];
        [audioPlayer setCurrentTime:position];
        [audioPlayer prepareToPlay];

        // Resume playback if it was active prior to skipping
        if ( skipWhilePlaying )
            [audioPlayer play];
    }
}  
于 2010-05-26T20:06:22.477 に答える
1

デバイスで試しましたが、これはシミュレータでのみ発生する問題です。すべてのファイルはデバイスで適切に再生され、ファイル内を簡単に検索できます。

私はmp3、aac、wavを試しました。

于 2009-05-25T14:52:24.863 に答える
1

何らかの理由で、このエラーが発生したとき、フラグがまだ YES に設定されています。currentTime と持続時間をチェックし、currentTime が 0.0 (サウンドの終わり) でない場合はすぐにプレーヤーを再起動することで、回避策を見つけることができました。私はまだ電話でテストするライセンスを持っていないので、すべてのテストはシミュレーターで行われます。お役に立てれば。いくつかの癖については編集を参照してください。

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    if ([_player currentTime] != [_player duration] && [_player currentTime] != 0.0f) {
        [_player play];
        return;
    }
...

編集: 残念ながら、サウンドの最初または最後 (またはいずれかのごくわずかな増分) をシークすると、まだエラーが見つかりました。これら 2 つのインスタンスを処理する特別なケースを作成すれば、一般的にカバーされることがわかりました。プレーヤーを停止し、 currentTime を 0.0 に設定してから、最初にシークする場合はプレーヤーを再度開始するか、最後までシークする場合は手動で終了デリゲートを呼び出す必要があります (実装している場合)。

より良い解決策が見つかった場合、または実際のデバイスでこれを実行してフィードバックがさらに得られた場合は、更新します。

于 2011-07-07T00:03:52.600 に答える