iOS8 の新しいオーディオ エンジンに重大な問題があります。AVAudioPlayer で構築されたアプリケーションがあり、新しいアーキテクチャに移行する方法を見つけようとしていますが、次の問題にぶつかりました (これは深刻で基本的な障害であることに同意していただけると思います)。 :
私のヘッダーファイル:
AVAudioEngine *engine;
AVAudioMixerNode *mainMixer;
AVAudioPlayerNode *player;
私のmファイル(viewDidLoad内):
engine = [[AVAudioEngine alloc] init];
player = [[AVAudioPlayerNode alloc] init];
[engine attachNode:player];
NSURL *fileUrl = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp3"]];
AVAudioFile *file = [[AVAudioFile alloc] initForReading:fileUrl error:nil];
NSLog(@"duration: %.2f", file.length / file.fileFormat.sampleRate);
[player scheduleFile:file atTime:nil completionHandler:^{
AVAudioTime *nodeTime = player.lastRenderTime;
AVAudioTime *playerTime = [player playerTimeForNodeTime:nodeTime];
float secs = (float)playerTime.sampleTime / file.fileFormat.sampleRate;
NSLog(@"finished at: %.2f", secs);
}];
mainMixer = [engine mainMixerNode];
[engine connect:player to:mainMixer format:file.processingFormat];
[engine startAndReturnError:nil];
[player play];
上記のコードは、エンジンとノードを初期化し、使用しているファイルの再生を開始します。最初に音楽ファイルの長さを出力し、次に再生終了後、コールバック関数でプレーヤーの現在の時間を出力します。これらの 2 つの値は同じか、最悪の場合、互いに非常に近いはずですが、そうではありません。これら 2 つの値の差は非常に大きくなります。たとえば、
duration: 148.51
finished at: 147.61
私は何か間違ったことをしていますか?これはかなり簡単なはずです。さまざまなファイル形式、ファイル長、数十の音楽ファイルを試してみましたが、違いは常に約 1 秒未満です。