2012-05-06 5 views
10

私はdecodeAudioDataを使用して、より大きいmp3ファイルの最初の部分を、javascriptでデコードして再生しようとしています。私の最初の、粗い、アプローチは、mp3の始めから数バイトをスライスし、decodeAudioDataにそれらを与えることでした。驚くことではないが、これは失敗する。decodeAudioData(WebAudio API)の '有効なmp3チャンク'を定義します。

掘り出した後、decodeAudioDataはFair Dinkum Thinkumhereと記載されている「有効なmp3チャンク」でしか動作しないようです。

しかし、有効なmp3チャンクの構造についての説明はありません(上記の著者はこれに含まれません)。私はそこに存在する様々なMP3スプリッタを認識していますが、私はこれをプログラム的にアプローチしたいと思います。 (私は、サーバー側でnodejを使用して「貧乏人のストリーミング」を実装しようとしています)。

だから、mp3フレームヘッダーを分割するだけで十分ですか、それとももっと処理する必要がありますか? (おそらく、最後にデータを追加することで、すべてのチャンクを「閉じる」のだろうか?)「バイトリザーバ」はどうですか?これは問題を引き起こすでしょうか?記録のために、私は現在128kbpsのcbr mp3で作業しています。これはどんな方法でもプロセスを簡素化しますか?

decodeAudioDataがvaildデータとして期待していることに関するすべての情報が評価されます。

ありがとうございます。

PS:これは恐らくFair Dinkum Thinkumのpostについての明確化の要求であることを認識していますが、私の評判が低いためコメントが投稿されません。だから私はそれを他の方法ではなく、新しい質問で見ることができません。再度、感謝します。

+2

mp3チャンクは1フレームで、0.028秒の音声を表します。そのフレームのサイズは、エンコードされたオーディオのビットレートに応じて可変です。 CBR mp3は、フレームサイズがファイル全体で一定であり、オーディオの特定の「タイムスタンプ」のオフセットを簡単に計算できるため、作業が楽になります。 –

+0

たとえば、128kbpsのmp3ファイルには、417バイトのフレームと418バイトのフレームが含まれているため、これは当てはまりません。 (いくつかのフレームにはパディングとして余分なバイトが含まれています) – biril

答えて

5

は(クローム上)decodeAudioDataと、より実験の後、これは私が見つけたものです:

  • どれ初期 mp3チャンクが正常に限り、それはmp3のフレーム境界で分割されたとしてデコードされます。一定のビットレートのmp3には必ずしも一定のサイズのフレームが含まれているとは限らないため、その境界が必ずしも些細なものではない(例えば、mp3ヘッダを解析することを含む)場合もあります。たとえば、128kbpsのmp3ファイルには、417バイトのフレームと418バイトのフレームが含まれています。 (一部のフレームにはパディングとして余分なバイトが含まれています)。
  • 任意のmp3チャンクはではありません。は、「両側」の正確なフレーム境界で分割してもデコード可能であることが保証されています。この種のチャンクの一部はデコードできますが、他のデコードではdecodeAudioDataにエラーが発生します。私はこれがmp3 bit reservoirと関係していると推測しています。これはmp3フレーム間の依存関係を作成します。
4

ファイルを有効なMP3ヘッダー(バイト境界に配置された '1'の12ビット:FF Fx)で始まる部分に分割すると、おそらく大丈夫でしょう。

+0

これも私が思ったことですが、これまでのところ私の結果はそうではありません:現時点ではmp3の最初の部分を再生するという単純なケースに取り掛かります。この最初のセグメントで見つかったフレームは、明らかに有効なヘッダーで始まりますが、まだdecodeAudioDataは失敗します... – biril

+2

チャンクの終わりは、次のFFFxヘッダーが始まる直前に終了しますか?余分なデータを残すか短くカットすると、再生に影響する可能性があります。 – lenik

+0

はい、そのトリックを行うようです。ありがとうございます、私は新しい発見を投稿します。 – biril

関連する問題