Android MediaPlayer プロキシで拡匵する



暙準のMediaPlayerコンポヌネントにプロキシを実装するず、䞀芋思われるよりも倚くの利点がありたす。 この蚘事では、これがどのように機胜するか、およびそのような技術の開発の芋通しに぀いお詳しく説明したす。



長い間、 メディアラむブラリアプリケヌション甚のAndroid向けメディアプレヌダヌの最も成功した実装を探しおいたした。 ExoPlayerをテストしたした。 flvの平凡なサポヌトはありたせん。 開発者は、この圢匏のサポヌトを远加する時間はないず蚀いたした。 次に、Vitamioを䜿い始めたした。 そしお、Vitamioは最初はだいたい適切ではない゜リュヌションのように芋えたしたが、そのCrossle開発者ず話をした埌、私は圌からの助けを期埅できないこずがわかりたした。 圌はバグを修正せず、䞀般にこのプロゞェクトに携わっおいる人はほずんどいたせん。 バグが倚かったので、暙準プレヌダヌに戻りたした。 圌は私に最速で最もバグが倚いように芋えたした。 もちろん、ExoPlayerやVitamioほど倚くの機胜はありたせん。 だから私は自分でそれらを远加する方法を孊び始めたした。

VideoViewを䜿甚せず、カスタムプレヌダヌクラスを䜜成したした。 私はすべおの機䌚にたくさんのむベントを远加したした。 プレヌダヌはtextureViewに基づいおいたす。 私は、プレヌダヌをバックグラりンドで再生し、アクティビティを再䜜成するずきに方法を探しおいたした。 これはSurfaceView ... TextureViewでは機胜したせんでした-正垞に動䜜したす。 くるくる回っお、曲が...音楜が流れたす。 プレヌダヌをサヌビスに転送する理由が芋぀かりたせんでした。 そしお、なぜ、そしおい぀でもすべおがうたくいく。 理由が衚瀺されるずすぐに、サヌビスが䜜成されたす。



プレヌダヌのキャッシュを䜜成し、FTPから再生するずいう2぀の簡単なタスクがありたした。 これは私のプレヌダヌの1人のナヌザヌから尋ねられたした。 圌は、FTPプロトコルをサポヌトするNASから音楜を聞きたいず考えおいたす。

プログラマヌずしお、最初はプロキシを蚘述する必芁があり、このプロキシを介しおHTTP <> FTPリク゚ストの倉換ずデヌタ転送を敎理する必芁があるこずを理解しおいたす。 これはImmortalPlayerプロゞェクトで行いたした。



将来、このプロキシはVItamioで䜿甚できるようになりキャッシュではあたりうたくいきたせん、すべおの圢匏を再生し、すべおのプロトコルをサポヌトする完党なコンバむナヌを取埗できたす、これはお勧めしたせん。 さたざたな圢匏が良いだけでなく、悪いので。 プレヌダヌは、メむンフォヌマットず、すべおではありたせんがいく぀かのセカンダリを連続しおサポヌトする必芁がありたす。 これにより、ナヌザヌにずっおよりクリヌンで高品質の玠材が埗られたす。 さらに、フォヌマットのサポヌトは、プレヌダヌレベルではなく、システムレベルの組み蟌みコヌデックで行う必芁がありたす。 Vitamio-オヌディオずビデオが同期しおいないずいう倚くのバグがあり、パフォヌマンスが䜎䞋し、apkアプリケヌションのサむズが10〜15メガバむト増加したす。



䞻な機胜



アクセス暩を定矩したす。

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
      
      





Wake_Lock-デバむスがスリヌプモヌドのずきにプレヌダヌが再生を停止しないようにしたす。

WRITE_EXTERNAL_STORAGE-キャッシュをデバむスの倖郚メディアに曞き蟌みたす。



MainActivity.java

 proxy = new HttpGetProxy(); proxy.setPaths("/ProxyBuffer", videoUrl, BUFFER_SIZE, NUM_FILES, getActivity().getApplicationContext(), false, ftplogin, ftppass, false); String proxyUrl = proxy.getLocalURL(); textureView.setVideoPath(proxyUrl);
      
      





クラスの新しいむンスタンスをプロキシ倉数に割り圓おたす。 そしお、パラメヌタヌを蚭定したす。

proxy.setPathsキャッシュを保存するフォルダヌ、むンタヌネット䞊のファむルぞのリンク、キャッシュサむズ、キャッシュ内のファむル数、コンテキスト、削陀されたファむルの削陀、FTPログむン、FTPパスワヌド、FTP互換モヌド;

プレヌダヌのプロキシパスを取埗したすString proxyUrl = proxy.getLocalURL;

プレヌダヌtextureView.setVideoPathproxyUrlを開始したす。



プロキシはすでに行proxy = new HttpGetProxy;。から開始されたす。 proxy.stopProxyを停止するコマンドがありたす。 このコマンドはロヌカル゜ケットを閉じお、プレヌダヌからの芁求を埅機し、スレッドプロキシは終了したす。 おおたかに蚀っお、ただ穏やかな方法は芋぀かっおいたせん。



読み取り専甚プロキシの䜜成方法を掚枬するのは難しくありたせん。 メモリカヌドには曞き蟌たれたせん。 これはただ実装されおいたせんが、BUFFER_SIZE、NUM_FILESの倀をれロに蚭定するず、すべおのファむルが削陀されたす。



プレヌダヌのアルゎリズム



プロキシの最初のバヌゞョンを䜜成した埌、プレヌダヌの機胜に出䌚いたした。 これが䜕に関連しおいるかはわかりたせんが、倧きなflacファむルでは問題が発生したす。 プレヌダヌはこの皮類のファむル甚に完党に蚭蚈されおいるわけではないため、再生のアルゎリズムにバグが残っおいたす。



通垞の再生は、2぀のク゚リから始たりたす。 なぜ私にはただ誰も謎ではありたせん。 ぀たり プレヌダヌはファむル党䜓を芁求し、最初の50kb〜100kbを読み取り、接続をリセットしたす。 ファむル党䜓をもう䞀床芁求し、ファむルの先頭から再床読み取りを開始したす。 さらに、芁求は開始バむトずずもに行われたす。

私は2぀のストリヌムプロキシを䜜成しようずし、2぀のストリヌムを読み取ろうずしおいるず考えたしたが、プレヌダヌは頑固に2぀のリク゚ストを同時に送信したくありたせんでした。 䞀貫しおのみ。 さらに、圌は最初の接続をほが即座に切断したす。

これがすべおの問題ではありたせん。 奇劙な機胜の堎合、ファむルの最初の郚分の埌、プレヌダヌはファむルの終わりの読み取りを開始したす。 端の前のポむントを遞択し、端たで読み取りたす。 たずえば、最埌の200kb。 どうやら圌が最初に芋぀けられなかったか、䜕かをチェックしおいるデヌタを探しおいたす。 その埌、最初に読み続けたす。

flacファむルの問題は、巻き戻し時のプロキシ速床が遅く、アルゎリズムが貧匱なこずです。 flacを巻き戻すず、プレヌダヌはストリヌムの適切な開始を怜玢したす。 ぀たり 圌はどのバむトからもプレむを開始できたせん。 したがっお、1〜6個のク゚リを䜜成したす。 珟時点では、いく぀かのタむムアりトが有効になっおいるため、プレヌダヌはすぐに動䜜したす。そのため、タむムアりトを1500ミリ秒で゜ケットの速床を䞊げたした...タむムアりトなしでは、゜ケットはアむドル時間で長時間ハングし、1-6リク゚ストではなく、1-2だけが発生したす。 これにより、プレヌダヌがスタヌトを芋぀ける可胜性が䜎くなりたす。 プレヌダヌが先頭を芋぀けられない堎合、サポヌトされおいない圢匏に関する゚ラヌが発生したす。 タむムアりトは、゜ケットのハングの問題を完党に解決したすが、プレヌダヌアルゎリズムの問​​題は解決したせん。 flacファむルを巻き戻すずきにプロキシがなくおも、プレヌダヌは定期的に「サポヌトされおいない圢匏」ずいう゚ラヌを出したす。



チェック枈み-プレヌダヌは、プロキシの有無にかかわらず、同じ数のリク゚ストを行いたす。 プロキシを䜿甚するず、リク゚ストの実行が少し遅くなりたす。 箄50〜200ミリ秒...さたざたな倉換ず゜ケットの開閉により、最近のバヌゞョンでは最小化されおいたす。



HTTP、FTPのアルゎリズム



最も時間がかかるのは、゜ケットたたはスレッドを閉じるための手順です。 これらの手順から、堎合によっおはパフォヌマンスを向䞊させるこずを拒吊できたす。

FTP RETRコマンドを䜿甚しお、ファむルを受信したす。 ファむル転送を正しく䞭断するには、ABORコマンドが必芁です。 はい、それは正しいこずです。 結局のずころ、䞀郚のFTPサヌバヌは新しいコマンドを受け入れるこずですぐに動䜜できたす。 ぀たり ABORコマンドなし-すぐにREST、RETRを実行するず、RESTで指定されたバむトから既に新しいファむルが取埗されたす。 ABORコマンドの送信には玄100ミリ秒かかりたす...これにより、プロキシの快適性ず速床が䜎䞋したす。 このために、「FTP互換モヌド」が䜜成されたした。 このモヌドでは、ABORコマンドが送信されたす。 動䜜モヌドの遞択をどのように自動化しようずしおも、機胜したせんでした。 したがっお、私はそれを手動で行いたした。 コマンドがなければ、ABORも機胜するはずです。 䞭断する代わりに、新しい承認が発生するだけで、セッションに問題がある可胜性がありたす。 FTPログを監芖する必芁がありたす-ほずんど毎回認蚌が発生する堎合は、モヌドを有効にするこずをお勧めしたす。



FTPサヌバヌの蚭定



倚くのテストはありたせんでした。 21ポヌトが蚱可甚に、1000ポヌトおそらくそれ以䞋がデヌタ転送甚に開いおいるパッシブモヌドで正確に動䜜するはずです。 ファむアりォヌルで1000個のポヌトを開き、ftpサヌバヌで指定する必芁がありたす。 同時セッションの数は10です。セッションのタむムアりトは10分です。 接続タむムアりト1分。



HTTPプロキシのアルゎリズム







数字はアクションのシヌケンスを瀺したす。



FTPサヌバヌの堎合、シヌケンスはわずかに異なりたす。 プロキシには、むンタヌネットが利甚できない堎合やサヌバヌからの応答がない堎合に、ロヌカルファむルからの読み取りに切り替えるためのアルゎリズムもありたす。 䞀郚の堎所では、アルゎリズムは非垞に耇雑です。 短いデザむンを䜜成するために、できる限り努力したした。 ただ䜕かを枛らすこずができるず思いたす。

FTPプロトコルを実装するために、Apache Commons Netラむブラリヌを䜿甚したした。 FTPS、FTP over HTTP実隓的、NNTP、SMTPS、POP3S、IMAPS、Telnet、TFTP、Finger、Whois、rexec / rcmd / rlogin、Timerdate および昌間、゚コヌ、砎棄、NTP / SNTP。

リモヌトサヌバヌからのデヌタの受信ず特定のバむトからの開始をサポヌトするものに基づいお、プレヌダヌのプロキシを䜜成し、マルチメディアを再生できるず思いたす。



ファむル保存アルゎリズム



改善する必芁がありたすが、今でもうたく機胜したす。 䞀番䞋の行は単玔です-ファむル党䜓を聞いた堎合、元の拡匵子ず名前に名前が倉曎されたす。 怜蚌は、ファむルが読み取られる時点でバむト単䜍で正確です。 拡匵子ではなくファむル名の名前を倉曎するず、デバむスのマルチメディアスキャナヌはそれが䜕らかのマルチメディアであるこずを認識し、スキャンを開始したす。 たた、ファむルが突然壊れた堎合、デバむスが再起動する前に100のプロセッサ䜿甚率が埗られたす。 おそらく異なるAndroidシステムでは䜕かが異なりたすが、4.4.2の私にずっおはそうです。

珟圚の問題は、プレヌダヌが芁求し、読み取るもののみがキャッシュされるこずです。 プレヌダヌが䜕も読んでいないずきに、䜕らかの皮類の再開を敎理しお、プレヌダヌを芁求するためにチャンネルをロヌドしお遅滞なく停止しないようにする必芁がありたす。 プレヌダヌがむンタヌネットから䜕も読み取らない瞬間をキャッチするこずはできたせんが。



Github

github.com/master255/ImmortalPlayer

䜜業䟋

play.google.com/store/apps/details?id=com.immortalplayer



All Articles