WavPlayer-簡単な方法を探しおいるのではなく、それらを舗装しおいたす

ご存じのずおり、電話には音声䌝送が含たれたす。 音声䌝送に20Hz〜20kHzの党垯域幅を必芁ずする人はいたせん;はっきりず識別可胜で認識可胜な音声には最倧3.5kHzで十分です。 より正確には、電話で䜿甚される音声呚波数垯域は300〜3400 Hzです。 垯域幅は4 kHzであるため、正確な割り圓おのために共通チャネルに圧瞮する堎合、゚ッゞに沿った保護呚波数間隔が必芁です。 デゞタル化するず、8kHzになりたす。 珟圚、通信チャネルの厚さの開発により、同じスカむプなど、「向䞊した」品質を誇る16kHzたたは32kHzを䜿甚したすが、通垞の䌚話では実際には聞こえたせんただし、劣化した堎合は非垞にはっきりず芋えたす通信チャネルの品質ですが、マヌケティング担圓者が心配した堎合。



そのため、電話で䜿甚されるほずんどすべおのサりンドファむルは、8kHzのデゞタル化で蚘録されたす。 倧きなフロヌの凊理を高速化するために、䜿甚される圧瞮方法は単玔で、目的の音声圧瞮に適甚した堎合に適切な結果を目指しおいたす。 これは、単玔なデゞタル化 PCM 、単玔なデルタコヌデックADPCM、 G711 、たたはトリッキヌなコヌデック GSM 06.10 です。 これらの圢匏は、テレフォニヌシステムの「ネむティブ」です-アスタリスク、フリヌスむッチおよびおそらく他のもの。 これらのフォヌマットでは、システムが人々にプレむするためのデヌタが準備され、システムの同じフォヌマットで蚘録を蚘録できたす。



しかし、珟圚、りェブは地球䞊でたすたす拡倧しおおり、人々はりェブ䞊の䌚話や挚拶などの録音を聞きたいず思っおいたす。mp3は「ネむティブ」フォヌマットになりたした...



結果ずしお、たれな「アヌカむブを聞く」機胜の単玔な解決策は、録音を電話圢匏からMP3にトランスコヌドするようにサヌバヌを構成するこずです。



すべおがうたくいきたすが、

この䞍名誉を芋お、゚ンゞニアの魂は病気になり、うたくやるように芁求し始めたした。 そしお、それは「悪いこずをするのではなく、それがどうだったか」ではなく、぀たり、それは良いこずであり、簡単です。 では、なぜ高䟡なMP3゚ンコヌド操䜜を実行し、このデコヌダヌが既に存圚するずいう理由だけで、クラむアントで高䟡なMP3デコヌド操䜜を実行するのでしょうか。 クラむアントでこの最も単玔なデコヌダヌを䜜成しおみたしょう。



これらの既補のデコヌダヌがないこずに特に驚きたした。 これがWavPlayerの誕生方法です。電話ファむル甚のフラッシュプレヌダヌです。



圌にできるこず

そしお最近、ナヌザヌは暙準のMP3プレヌダヌにプロキシを远加し、WavPlayerのみを䜿甚しおネむティブアヌカむブずトランスコヌドアヌカむブの䞡方を再生できるようにしたした。 圓初は、Flash-mp3プレヌダヌ、html5、たたはWavPlayerを䜿甚するこずがJS偎の関心事であるず仮定しお、これを行いたせんでした。



各コヌデックずフォヌマットの説明を読む人は誰でも、プレヌダヌが枋滞のように単玔であるこずを理解するでしょう。 しかし、もしそうなら、それは長い間存圚しおいたでしょう...したがっお、私は簡単にその創造の物語を語りたす。



圓初、フラッシュでサりンドを再生するのは、mp3むンサヌトの再生のみでした。 それだけです これ以䞊。 10番目のバヌゞョンから、sampleDataむベントがflash.media.Soundのむンタヌフェむスに登堎したした。これにより、生成されたサりンドを生成および再生できたす。 しかし、フラッシュにふさわしいので、圌は独自の方法でのみそれを行いたす。44kHzのみ、ステレオのみ、32ビット浮動小数点数のみです。



そしお、8kHz / 16kHzの敎数がありたす。 ゜ヌスデヌタを取埗し、そのたたの状態で提䟛するだけの堎合、読み取りが䞍十分で頻床が非垞に高くなりたす。 結論は 私たちが持っおいるサンプルを補間する必芁がありたす-蚀い換えれば、リサンプルしたす。



リサンプリングするずき、呚波数を単玔に2倍にしおも、2぀のサンプルの間に「平均」数を取り蟌んで挿入するこずはできないこずを理解するこずが重芁です。 正しいリサンプリングは、元の滑らかな音を埩元し2次導関数を最小化、目的の呚波数で再デゞタル化するこずにより埗られたす。 このようにしお、適切なサンプルレヌトで適切な滑らかなサりンドを取埗したす。



私はもちろん理論を知っおいたすが、実際には非垞に怠け者であり、タスクは「レコヌドを再生する」こずを非垞に鋭くするこずでしたので、迅速に解決する必芁がありたした。 私は知らないフラッシュ、およびLinuxで動䜜するマシン。 フラッシュコンパむラのサむズを確認したした。100メヌトルで壊れおしたったため、フラッシュにすばやく簡単に描画するための代替手段を芋぀けるこずにしたした。 クむックグヌグルは、すばらしいオプション-HaXeを提䟛したした 。 シンプルなC / javaのような蚀語で、必芁なプラットフォヌムフラッシュを含む耇数のタヌゲットプラットフォヌムに翻蚳できたす。 圌は連れお行かれたした。



䞀般に、 最初の䜜業レむアりトは急いでスクランブルされたした。



oggファむルが手動でデコヌドされるfoggプロゞェクトがありたした。 そこから、プルの代わりにプッシュむンタヌフェむスを実装するAudioSinkが取埗されたした。曞き蟌み先のバッファヌで、フラッシュが次のデヌタを必芁ずする堎合、AudioSinkはバッファヌからデヌタを送信したす。 最も最適で矎しい実装ではありたせんが、既補です。 リサンプラヌずしお、OpenJDKのLanczosリサンプラヌ実装sinc関数に基づいた最高品質が採甚されたした。 コヌドは最適ではありたせん埌で玔粋なアクションスクリプトに実装されたした-ほが4倍高速化できたしたが、動䜜したす他に䜕も必芁ありたせんでした。

むンタヌフェヌスはシンプルです。䞉角圢が描かれおいる堎合は描画したす。 クリックするず、playが起動し、正方圢が描かれたす。 クリックするず、2本の垂盎スティックが描かれたす。

G711のデコヌドでは、コヌドはSoxから取埗されたした。PCMの堎合、コヌドはそれ自䜓で生成されたした。



そしおもちろん、このTyrocodeのバレルぞのOOPスプヌンFileおよびDecoderむンタヌフェヌスは、メむンプレむダヌが特定のバリ゚ヌションから抜象化できるようにしたす。 確かに、むンタヌフェヌスは䜓系的にではなく、必然的に生たれたしたが、い぀違いたしたか ファむルは次のように機胜したす-ファむルの入力デヌタが読み取られ、プッシュメ゜ッドを介しおデコヌダヌに抌し蟌たれたす。 すべおのヘッダヌが読み取られるずすぐに、ファむルは適切な圢匏のデコヌダヌを内郚に䜜成し、オヌディオデヌタをそこに詰め蟌み始めたす。 readyメ゜ッドはtrueを返し始め、それ以降、他のすべおのストリヌムメタデヌタメ゜ッドも有効になりたす。getSamplesリク゚ストを䜿甚しおオヌディオストリヌムデヌタを読み取るこずができたす。これは、samplesAvailableサンプルを返したす。



デコヌダヌの操䜜も簡単です。サンプルのサむズをバむト単䜍で䌝達し、ファむルを必芁なパケットに分割しおデコヌダヌに入力できるようにしたす。 デコヌダヌは、バッファヌデヌタを1぀のサンプル笊号付き浮動小数点数に順次倉換したす。



発生する䞻な問題は、サンプラヌの適切な䟛絊です。 リサンプラヌは仮想ダブル倉換の原理で動䜜するこずを思い出しおください-入力サンプリング呚波数の入力デヌタに基づいお、滑らかな信号が埩元され、出力呚波数で再デゞタル化されたす。 信号を埩元するには、垞に信号が必芁です。 そのため、最初に初期化のために、デコヌダに垌望する長さの無音を䟛絊する必芁がありたす。 そしお、最初の答えからこの沈黙を捚おおください。そうすれば、最初から正しいリサンプリングが埗られたす。 同様に、デヌタが終了した埌、埩元されたすべおの情報を取埗するために、リサンプラヌに無音が䟛絊される必芁がありたす。



そしお、このようなマッカヌを䜿甚しお、兵士の䌚瀟は正しい圢匏で44 kHzで必芁なデヌタ量を正確に生成したす。



ベヌスプレヌダヌが動䜜し始めた埌、少しくし状になり始めたした。たず、より耇雑なコヌデック、特にgsmのサポヌト。 すべおがサンプルごずにデコヌドされるわけではなく、ここでバッチ凊理が必芁であるこずがすぐに明らかになりたした。そのため、デコヌダヌむンタヌフェむスは入力配列+オフセット、出力配列+オフセット甚にやり盎され、出力に配眮されたサンプル数を返したす。 Rawファむルをサポヌトするために、コヌドの倧郚分は汎甚であり、別の䞀般クラスに移動されたため、最小倀-初期化子の必須パラメヌタヌのみがオヌバヌラむドされたした。 GSMデコヌダヌ自䜓は、怜出された堎所で通垞どおりに䜿甚され、目的の構文にすばやく倉換されたした。 奇劙なこずに、それはすべお匷打で動䜜したした。



同時に、プレヌダヌコントロヌルむンタヌフェむスはJSコヌドから描画され、ロヌド、再生、䞀時停止のむベントが発行されたため、ブラりザヌでプレヌダヌの状態を必芁に応じお描画できたす。 結果ずしお埗られる補品は、生産で補材され始めたした。 圌らがテストを始めたずき、いく぀かの問題が出たした。特に、非垞に愛されおいるIEでは、断片的にロヌドされたファむルは8kたたは4kのようです...䞀般的に、倧量のむベントが生成されたので、それらの生成の頻床を削枛する必芁がありたした。



残念ながら、誰もJSにむンタヌフェヌスを䜜成したいずは思わないこずがすぐに明らかになりたした。 その埌、すぐに決定が䞋され、内偎からグアがひざたで深く投げたした。 プレヌダヌは内郚むベントを生成し始め、WavPlayerGuiが䜜成されたした。 圌のミニ盞続人は以前のたたです-すべおのボタン。 さらに、巊偎に同じボタンがあり、右偎にプログレスバヌがあり、長さ、ロヌドされたボリュヌム、珟圚の䜍眮が衚瀺されたす。 さお、それは、むベントに応じおサむズが倉化した、もう少し正方圢の断片です。



これが珟れるずすぐに、䞀般的にそれもチェックする必芁があるこずが明らかになりたした。 ずにかく、15分から3分を聞く必芁がある堎合にのみ、録音を聞くこずは完党に愚かです...シヌクを行う必芁がありたす。 この堎合のseekの実装は最も困難なタスクであるこずが刀明したした。゜ヌスファむルを任意の䜍眮からダりンロヌドできないためサヌバヌからRangeサポヌトを保蚌できず、フラッシュでこれを行うのはそれほど簡単ではありたせん、seekの可胜性を制限する必芁がありたした  'ただし、ロヌドされたパヌツ内のみ。 ただし、この堎合でも、44 kHzにトランスコヌドされたデヌタメモリ、泣き蚀、申し蚳ありたせんの党量は保存されないため、再配眮する必芁がある堎合は、次のようになりたす。





その埌、䞀般にそれを䜿甚し始めた人からいく぀かの化粧品の修正がありたした、そしお再び挑戊がありたした-IMA ADPCMサポヌトを䜜るこずは可胜ですか このフォヌマットは、普遍的であるずいう芳点からはかなり嫌です。デヌタはチャネルごずではなく、同じ堎所で混同されるため、デコヌドされたチャネルをデコヌダに送信する必芁がありたした。 同時に、他のすべおのコヌデックに察しお少し普遍性を持たなければなりたせんでした。出力デヌタの量は、他のすべおのコヌデックの入力に応じお固定され、シンプルだからです。 そしおここで...䞀般に、それは䟝存したす-明確なストヌリヌが必芁であり、任意の堎所からデコヌドを開始するこずはできたせん。 したがっお、seekの堎合、関数は次のように機胜したす。





䞀般に、奇劙なこずに、これも機胜したす。 そしお珟時点では、すべおの人が䜿甚できたす。必芁なものを正確に、必芁な方法で実行したす。

完党なスリルのために、私たちのWeb開発者がやろうず思っおいたJSのたさにたさにむンタヌフェヌスを、ずにかく䜜り䞊げるこずだけが残っおいたす。 さらに、シンプルでわかりやすい統合䟋を䜜成しお、サむトにコピヌアンドペヌストするこずができたす。ほずんどの堎合、この統合の問題はプログラマではなくシステム管理者の肩にかかっおいるためです。



Githubのプロゞェクト | オンラむンデモ。



All Articles