1

我正在尝试使用AVAudioPlayer滑块来寻找轨道(没什么复杂的)。

但我有一个奇怪的行为......对于currentTime(0和trackDuration之间)的某个值,播放器停止播放曲目,并audioPlayerDidFinishPlaying:successfully: 成功进入NO。它没有进入audioPlayerDecodeErrorDidOccur:error:

就好像它无法读取我给它的时间。

例如,曲目的持续时间是:295.784424 秒,我将其设置currentTime为 55.0s(即:54.963878 或 54.963900 或 54.987755 等......当打印为 %f 时)。“崩溃”总是在currentTime54.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

出于某种原因,当我收到此错误时,标志仍设置为 YES。我设法通过检查 currentTime 与持续时间并在 currentTime 不是 0.0(声音结束)时立即重新启动播放器来找到解决方法。我所有的测试都是在模拟器上完成的,因为我还没有在我的手机上测试的许可证。希望这可以帮助。查看几个怪癖的编辑。

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

编辑:不幸的是,我在寻找声音的开头或结尾时仍然发现错误(或两者的一个非常小的增量)。我发现如果您创建处理这两个实例的特殊情况,您通常会被覆盖。您应该停止播放器,将 currentTime 设置为 0.0,然后在寻找开始时重新启动播放器,或者在寻找结束时手动调用完成委托(如果您实现了它)。

如果我找到更好的解决方案或在实际设备上运行它获得更多反馈,我会更新。

于 2011-07-07T00:03:52.600 回答
1

我已经尝试过使用设备,这是仅在模拟器中出现的问题。我所有的文件都可以在设备上很好地播放,我可以轻松地在其中查找。

我试过 mp3、aac 和 wav。

于 2009-05-25T14:52:24.863 回答