我正在创建一个内部有很多媒体播放器的Android活动。该活动将有许多媒体播放器对象,如果我能描述它就像一个 4 X 1媒体播放器网格。我在android中使用了TextureView类创建了4X1网格。
所以活动的xml布局或多或少看起来像这样:
<TextureView
android:id="@+id/surface_one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextureView
android:id="@+id/surface_two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextureView
android:id="@+id/surface_three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextureView
android:id="@+id/surface_four"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
因此每个textureView都将是MediaPlayers将在那里播放视频的表面。 以编程方式我已经设置了SurfaceTextureListener,以便我知道每个表面的可用时间如下:
TextureView tv1 = (TextureView)findViewById(R.id.surface_one);
tv1.setSurfaceTextureListener(new SurfaceListener_1());
同样适用于其他人。这是我将如何进行第二次纹理视图设置:
TextureView tv2 = (TextureView)findViewById(R.id.surface_two);
tv2.setSurfaceTextureListener(new SurfaceListener_2());
然后在代码中,我创建了4个MediaPlayer对象,并为媒体播放器#1设置了这样的表面:
private class SurfaceListener_1 implements TextureView.SurfaceTextureListener {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Surface sfc = new Surface(surface);
try {
m_mp1 = new MediaPlayer();
m_mp1.setSurface(sfc); //critical , here i am adding the surface so the media player can play on it
m_mp1.setDataSource(m_context, m_videoUri_one);
m_mp1.prepareAsync();
m_mp1.setLooping(true);
m_mp1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
video1Prepared = true;
}
});
m_mp1.setOnErrorListener(new MediaPlayer.OnErrorListener(){
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return true;
}
});
} catch (Exception e) {
e.printStackTrace();
}
finally {
//release the surface as its now set in the media player
if(sfc!=null)
sfc.release();
}
}
//...... the rest of the call backs not important...
对于其他媒体播放器我重复相同的事情,以便他们都有表面可以播放。这是我将如何做媒体播放器#2:
private class SurfaceListener_2 implements TextureView.SurfaceTextureListener {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Surface sfc = new Surface(surface);
try {
m_mp2 = new MediaPlayer();
m_mp2.setSurface(sfc); //critical , here i am adding the surface so the media player can play on it
m_mp2.setDataSource(m_context, m_videoUri_two);
m_mp2.prepareAsync();
m_mp2.setLooping(true);
m_mp2.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
video2Prepared = true;
}
});
m_mp2.setOnErrorListener(new MediaPlayer.OnErrorListener(){
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
return true;
}
});
} catch (Exception e) {
e.printStackTrace();
}
finally {
//release the surface as its now set in the media player
if(sfc!=null)
sfc.release();
}
}
//...... the rest of the call backs not important...
所以我最终创造了4个表面,我可以播放视频。所有4个媒体播放器播放不同的视频文件 一旦准备好所有媒体播放器,我就会在所有媒体播放器上调用它们的start()方法,并且它们同时播放。
我面临的问题是这可能是cpu密集型的。在某些设备上,我可以获得ANR或应用程序响应缓慢。 我正在播放的媒体文件是MP4,媒体文件的大小都是9 MB左右。
有什么可以推荐的,这样我可以在这个已经很繁重的任务中提高效率吗?例如,我可以获得GPU帮助吗? 或者,如果我改变媒体类型会使它更有效率?视频没有声音只有视觉才有帮助。