2012-04-02 9 views
2

iPhone用の波形ビジュアライザーを作成しようとしていますが、ExtAudioFileReadで興味深い問題が発生しています。ExtAudioFileSeekに続いてExtAudioFileReadが多くのシーケンシャル0サンプルを返す(不可能)

私はVBR MP3ファイルから読んでいます。クライアントフォーマットは44.1kHzのLPCM、モノラルです。

私は、私が視覚化したい位置に移動し、1024フレームで読み込みます。私が見ているのは、時間の70%または80%で、最初の512フレームほどはゼロに戻ります。読み取りは、要求されたすべてのフレームを正常に読み取ったことを報告しています。

さらに、私は正しい位置を求めていることを確認しました。読み込み結果をオーディオキューに入れると、ファイル内の正しい位置にあることが明らかです。

だから何ですか?なぜこれが当てはまるのだろうか?私はこの問題に関連する文書で何も見つけることができません。

答えて

3

私は、要求されたフレームの位置の1024フレーム前に、1024 + requestedLengthフレームを読み込み、最後にrequestedLengthフレームをバッファから取り出すことによって、この問題を解決することができました。

私は、このソリューションが動作する理由を確かに知りませんが、私は圧縮形式で理論(場合には誰もがこれを読んでいる)

を持って、オーディオファイルをパケットに分割されます。フレームミッドパケットは、(同じパケットからの)任意の以前のフレームが理解されるためにデコードされることを必要とする。あなたはExtAudioFileSeekと半ばパケットを求める際

をフォローする

憶測はたぶんこのデコードが行われていない、とあなたは次のパケット境界をヒットするまでゼロが返されます。

私のソリューション私は、同じパケットから欲しいものよりも前にすべてのフレームを読み込むために十分にバックトラックしているので、デコードが行われます。

+1

私はこのようなバグについて、他のどこかで非常によく似た問題の説明を読みました。問題は、返されたフレームが次のパケットの先頭からであって、シークが進むべき位置からではないということでした。その解決方法は、パケットの先頭を見つけてその途中を探し、その先頭に移動し、所望の位置に到達するのに十分なデータをスキップすることでした。 –

+1

mp3ファイルの望ましいシーク時間(秒)が与えられたら、求めるフレーム番号をどのように計算して求めるのですか? – kevlar

関連する問題