4

私は、1つの画面で複数の動画を同時に再生できる簡単なAndroidメディアプレーヤーを持っています。したがって、基本的に1つのメディアプレーヤー画面が4つの部分に分割され、4 mediaPlayerインスタンスが一緒に接着され、各部分が特定のビデオを再生します。私のAndroid MediaPlayerの同期に関する問題

私のビデオファイルがデバイスにローカルに保存されているときはほとんど問題なく動作します。同期の問題がありますが、マイナーです。しかし、HTTPストリーミングのURLを入力すると、重要な同期の問題があります。何が問題ですか?一般に、どのように同期の問題を取り除くことができますか?

最初にmediaplayersとprepare()をインスタンス化してから、start()を1つずつ順番に呼び出して、少なくとも開始時刻はお互いに近くなるようにしてください。しかし、それほど効果はありません。

MediaPlayer mediaPreparation(String filename, boolean setMute) { 
    String url = "myURL"; // your URL here 
    // create mediaplayer instance 
    MediaPlayer mediaPlayer = new MediaPlayer(); 
    if (setMute) { 
     mediaPlayer.setVolume(0, 0); 
    } 
    try { 

     mediaPlayer.setDataSource(url); 
     mediaPlayer.prepare(); 

    } catch (IOException e) { 
    } 

    mediaPlayer.setLooping(true); 
    // mediaPlayer.start(); 
    return mediaPlayer; 
} 

をそして、私はそれらを一つずつ起動します:ここで

私はmediaplayerの各インスタンスを返すメソッドを持って

mp[0].start(); 
mp[1].start(); 
mp[2].start(); 
mp[3].start(); 

enter image description here

+0

Tina J、この問題に対処できましたか?私は同じ問題を抱えており、これに対する解決策があるかどうかは疑問だ。 – Mohru

答えて

1

私はわかりませんいずれかのAndroidメディアプレーヤーがこの機能を提供している場合。

さまざまなデバイスがHWで複数のビデオをデコードして再生する能力が異なる可能性があります。また、ビデオの一部でSWデコードなどを使用する必要がある場合、処理速度が大幅に低下します。

これはユーザーのニーズを満たしていない可能性がありますが、エンドデバイスでこのようなビデオグリッドを提供する一般的な方法は、ビデオをサーバー側でまとめて単一のビデオストリームとしてデバイスに配信することです。

更新

MediaCodecを使用し、HWのコーデックを活用する場合の注意すべきもう一つの事 - ビデオは、これはまた別の、復号化の待ち時間が発生する可能性があります異なるビデオプロファイルを持っている場合。

これは、ビデオがどのようにエンコードされているかに関係します。特定のフレームが後に続くフレームの情報を参照する場合(一般的な圧縮手法)、デコーダがフレームをバッファリングしてまた、フレームにrefereed。ベースラインプロファイルを使用するためのより簡単な圧縮手法では、この手法を使用しないため、バッファする必要がなく、したがって待ち時間が短くなる可能性があります。これはまた、異なるHWベンダーごとに異なるように見える - 特に、インテルからの終わりに、低レイテンシーのセクションこのノートを参照してください。

を、私は、この特定の側面への最良のアプローチがある疑いがあります最低の共通の支配者を目指す - ベースラインのプロファイルを使用するか、個々のビデオから期待できる最大の待ち時間よりも何らかの要因ですべてのビデオ表示を遅らせようとする。

+0

既に実装されています。質問は、同期を改善するための方法です。 –

+0

役に立つアップデートをありがとう。実際、私のビデオはすべて同じプロファイルを使用していて、実際は同じサイズで同じ解像度です。 –

1

ストリーミングのケースでは、データが継続的に利用できない可能性が常にあるため、プレーヤは再生を開始する前にかなりのフレームをバッファします。この場合、複数のストリームが十分な量のためにバッファされるまでに異なる時間がかかることがあります。私はあなたが試みることができる1つの方法、mediacodecを見ます。これは、https://developer.android.com/reference/android/media/MediaCodec.htmlを参照してください。

特に、releaseOutputBuffer()およびその変形を参照してください。あなたはレンダリングをもっとコントロールできます(必要に応じてタイムスタンプを変更しますが、再生はスムーズではないので助言はしません)。 4つのインスタンスすべてに、特定のタイムスタンプされたフレームがデコードされているかどうかを追跡し、それらを一度にレンダリングすることができます。

+0

興味深い洞察力! URLベースのストリーミングはどのように機能しますか? 'prepare()'を呼び出すと、全体ではなく、最初の数秒しかダウンロードされません。私は今それについての別の質問をするでしょう... –

+0

どのように4つのインスタンスすべてが特定のタイムスタンプされたフレームをデコードしたかどうかを追跡することができますか?例や何か? –

+1

これはデコード専用です。デコードされたフレームを取得すると、対応するタイムスタンプが取得されます。すべての4のタイムスタンプを追跡し、すべてが特定のタイムスタンプをデコードして、すべてをレンダリングします。基本的なデコードとレンダリングは、Androidのドキュメントにあり、ロジックを追跡するために、書く必要があります。 –

関連する問題