同一活动中有多个媒体播放器的Android应用 - 如何高效使用

时间:2017-03-15 02:37:32

标签: android android-mediaplayer

我正在创建一个内部有很多媒体播放器的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帮助吗? 或者,如果我改变媒体类型会使它更有效率?视频没有声音只有视觉才有帮助。

0 个答案:

没有答案