Android では、メディア コーデックに関連するものはすべて、一貫した独自の API を使用する必要がある開発者から隠されているという考え方ですMediaPlayer
。
メディアを再生するとき、それはストリームであるか、外部デバイスにあるものであるかに関係なく、アプリケーションが助けを必要とするたびに、低レベルのコーデック/パーサーがインスタンス化されます。
ただし、ハードウェアのデコードに関連する特定の理由により、一部のコーデックは複数回インスタンス化できない場合があります。実際のところ、すべてのアプリケーションは、リソース (コーデック インスタンスなど) が不要になったときに、有効な状態で呼び出してリソースを解放する必要があります。MediaPlayer.release()
実際、私が言っていることは、Android Developers Web サイトのドキュメントに示されています。release
この MediaPlayer オブジェクトに関連付けられたリソースを解放します。MediaPlayer を使い終わったら、このメソッドを呼び出すことをお勧めします。特に、アプリケーションのアクティビティが一時停止された (その onPause() メソッドが呼び出された) か、停止された (その onStop() メソッドが呼び出された) 場合は常に、このメソッドを呼び出して MediaPlayer オブジェクトを解放する必要があります。オブジェクトを維持する必要があります。不要なリソース (メモリやコーデックのインスタンスなど) が保持されることに加えて、MediaPlayer オブジェクトが不要になった場合にこのメソッドをすぐに呼び出さないと、モバイル デバイスの継続的なバッテリー消費につながる可能性があり、そうでない場合は他のアプリケーションの再生に失敗する可能性があります。デバイスでは、同じコーデックの複数のインスタンスがサポートされています。
release
したがって、再生が完了したときに呼び出していないか、別のアプリがこの種のリソースへの参照を保持しています。
編集 :
同じ で複数のビデオをレンダリングする必要がある場合Activity
は、2 つの選択肢があります。私の回答で言ったように、あなたが最初に望んでいたことは、低レベルの問題のために不可能であり、ちなみに iOS でもありません。
ただし、できることは次のとおりです。
再生しているメディアがリアルタイム ストリーミング コンテンツでない場合は、広く利用されている無料のビデオ エディターのいずれかを使用して、4 つのビデオを 1 つのビデオにまとめることができます。次に、アクティビティでビデオをフルスクリーンでレンダリングします。 4 があるように見えますViews
。
リアルタイム/非録画コンテンツの場合は、最初のビデオをそのままにしておきます。すべてのビデオが同じコーデック/コンテナを使用してエンコードされていると想定しています。あなたが試みているのは、他の 3 つのビデオをトランスコードして、別のコーデックと別の形式を使用することです。Android でサポートされているコーデック/コンテナにトランスコードしていることを確認してください。これにより、Android が同時に異なるデコーダーを使用する可能性があります。これは、あなたが期待している結果と比較してやり過ぎだと思います。
MediaPlayer
最後に、 +FFMPEG
や単になどのデコードに別のバックエンドを使用できますFFMPEG
。しかし、繰り返しになりますが、うまくいったとしても、これは非常にやり過ぎだと思います。
これを要約すると、これが機能するためには妥協が必要です。