2017-12-19 51 views
1

私はAndroid mediaplayersでmp3ファイルを再生しています。 しかし、私はseekTo(msec)関数でいくつかのランダムな時間を探しているとき、各アンドロイドデバイスの各プレーヤーはわずかな違いを示しています。時間差は約1秒です。mp3コーデックにはI/Pフレームもありますか?

Mp3 MPEG1オーディオコーデックにもIフレーム/ Pフレームのものがありますか?私はそれがビデオコーデックのプロパティであることを知っていますが、オーディオコーデックにも同様の属性があるかどうかを知りたいので、オーディオをデコードするためにIフレームを取得するためには、ある位置にジャンプする必要があります。もしそうなら、そのような属性は、各プレイヤーがまったく同じ時期に始まったわけではないので、シーク時間の差を生むことができるのは妥当である。

答えて

1

3つの別の問題があります。

最初はMP3フレームサイズです。 (これはビデオ "フレーム"とは異なります...この場合、フレームはMP3にエンコードされたサンプルの塊と考えるのです)。 そのフレームサイズは、通常、1,152サンプルになります。あなたはそのレベルを下回ることができますが、そのレベルの下で最初に前向きにデコードする必要があり、すべてのプレイヤーがそうするつもりはありません。

第2の問題はビットリザーバです。フレームは常にスペース全体を必要とするわけではなく、エンコーダは他のフレームのデータで埋め戻すことができ、一定のビットレートの範囲内で必要なときに、より多くの帯域幅を効果的に使用できます。素朴なプレーヤーは、次のMP3同期ワード(11111111 111xxxxx)を探してそこからコーデックにデータを送信します。コーデックは、ビットリザーバ情報がないため、その瞬間にデコードする必要がある情報を常に有するとは限らない。十分な情報が得られるまで、少しのグリッチ音を鳴らすことも、静かにすることもできます。どちらの行動も野生に存在する。

最後に、3番目の問題は、通常のMP3ファイル/ストリームにタイムスタンプデータがないことです。希望のシークポイントまでデコードせずにファイルにシークするのはちょっと推測です。効率を上げるために、代わりに何をするかは、開始位置を推測してストリームに「針落とし」することです。もしあなたが320kbit/sのCBRストリームを持っていて、ファイルサイズの大きさを知っていれば、ファイルの時間の長さを推測し、均等に分割して目的のシーク時間のバイトオフセットを得るだけです。あなたが想像することができるように、これはCBRでさえ、不正確です。 VBRの場合、これまでに見たビットレートの平均値を使用するプレーヤーもあります。他の人はまったく探すことを許さないでしょう。他の人は最初のフレームを見て、CBRを仮定し、最初のフレームと同じビットレートのようにファイル全体を扱います。 (いつかVBRファイルを再生し、ファイルの最初の数秒間にタイムスタンプの変更が終わるのを見ます。これは、プレーヤーが長さを推測しているからです)

関連する問題