web-dev-qa-db-ja.com

Androidの異なるビューで、1つのレイアウトで複数のビデオファイルを同時に再生する方法

Androidで、3つのサーフェスビューを並べてレイアウトを作成しました。1つのビデオファイルを異なるメディアプレーヤーで同時に再生したいと思います。しかし、私が直面した1つの問題は、3人の誰もがそのビデオを同時に再生できないということでした。それらの1つまたは2つが表示を停止します。 Media Playerクラスの代わりにビデオビューを直接使用した場合、問題は同じままです。誰でも助けてください。何が問題なのですか?エラーサーフェスの作成に失敗したネイティブエラーが発生しています。 3つの異なるビューで1つのファイル、3つの異なるビューで3つのファイルなど、さまざまな組み合わせを試しましたが、問題はまだ修正されていません。他のWebサイトの一部の返信では、カーネルのバージョンに依存すると述べています。カーネルのバージョンに依存する場合は、カーネルのバージョンに依存するAndroid Androidサイトのドキュメントリンクを教えてください。または、プレイすることもできます。 、コードの手順を教えてください。これはエラーログです-

04-10 19:23:37.995: E/Android_DRM_TEST(2573): Client::notify In
04-10 19:23:37.995: V/AudioPolicyManager(2573): startOutput() output 1, stream 3,  session 131
04-10 19:23:37.995: V/AudioPolicyManager(2573): getDeviceForStrategy() from cache strategy 0, device 2
04-10 19:23:37.995: V/AudioPolicyManager(2573): getNewDevice() selected device 2
04-10 19:23:37.995: V/AudioPolicyManager(2573): setOutputDevice() output 1 device 2 delayMs 0
04-10 19:23:37.995: V/AudioPolicyManager(2573): setOutputDevice() setting same device 2 or null device for output 1
04-10 19:23:37.995: I/AudioFlinger(2573): start output streamType (0, 3) for 1
04-10 19:23:37.995: D/AudioHardwareYamaha(2573): AudioStreamOut::setParameters(keyValuePairs="start_output_streamtype=3")
04-10 19:23:38.010: W/SEC_Overlay(2689): overlay_setPosition(0) 0,0,200,397 => 0,0,200,397
04-10 19:23:38.010: I/SEC_Overlay(2689): overlay_setParameter param[4]=4
04-10 19:23:38.010: D/SEC_Overlay(2689): dst width, height have changed [w= 200, h= 397] -> [w=200, h= 397]
04-10 19:23:38.010: I/SEC_Overlay(2689): Nothing to do!
04-10 19:23:38.090: E/VideoMIO(2573): AndroidSurfaceOutput::setParametersSync()  VIDEO ROTATION 0
04-10 19:23:38.090: E/VideoMIO(2573): AndroidSurfaceOutput::setParametersSync()  VIDEO RENDERER 1
04-10 19:23:38.090: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.090: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.090: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.195: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.195: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.195: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.230: E/VideoMIO(2573): AndroidSurfaceOutput::setParametersSync()  VIDEO ROTATION 0
04-10 19:23:38.230: E/VideoMIO(2573): AndroidSurfaceOutput::setParametersSync()  VIDEO RENDERER 1
04-10 19:23:38.230: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.230: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.230: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.295: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.295: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.295: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.330: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.330: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.330: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.395: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.395: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.395: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.435: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.435: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.435: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.495: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
04-10 19:23:38.495: E/SEC_Overlay(2689): Error - overlays already in use
04-10 19:23:38.495: D/VideoMIO(2573): Overlay create failed - retrying
04-10 19:23:38.535: D/SEC_Overlay(2689): overlay_createOverlay:IN w=128 h=96 format=48
14
Suvam Roy

私は1つの解決策を見つけました。 /system/build.propを次のbuild.propに置き換えるだけです-

build.prop

# begin build properties
# autogenerated by buildinfo.sh
ro.build.id=Gingerbread
ro.build.display.id=Gingerbread.EG14
ro.build.version.incremental=EG14
ro.build.version.sdk=10
ro.build.version.codename=REL
ro.build.version.release=2.3.4
ro.build.date=Thu Jul 14 12:16:01 KST 2011
ro.build.date.utc=1310613361
ro.build.type=user
ro.build.user=se.infra
ro.build.Host=SEI-28
ro.build.tags=release-keys
ro.product.model=SHW-M250S
ro.product.brand=samsung
ro.product.name=SHW-M250S
ro.product.device=SHW-M250S
ro.product.board=SHW-M250S
ro.product.cpu.abi=armeabi-v7a
# Samsung Specific Properties
ro.build.PDA=M250S.EG14.1208
ro.build.hidden_ver=M250S.EG14.1208
ro.b uild.changelist=380592
ro.product.cpu.abi2=armeabi
ro.product.manufacturer=samsung
ro.product.locale.language=ko
ro.product.locale.region=KR
ro.wifi.channels=
ro.board.platform=s5pc210
# ro.build.product is obsolete; use ro.product.device
ro.build.product=SHW-M250S
# Do not try to parse ro.build.description or .fingerprint
ro.build.description=SHW-M250S-user 2.3.4 Gingerbread EG14 release-keys
ro.build.fingerprint=samsung/SHW-M250S/SHW-M250S:2.3.4/Gingerbread/EG14:user/release-keys
# Samsung Specific Properties
ro.build.PDA=M250S.EG14.1208
ro.build.hidden_ver=M250S.EG14.1208
ro.build.changelist=380592
ro.build.fota_ver=SSNT11GINGEREG14
ro.tether.denied=false
ro.flash.resolution=1080
# end build properties
#
# system.prop for asop5000
#

rild.libpath=/system/lib/libsec-ril.so
rild.libargs=-d /dev/ttyS0
ro.sf.lcd_density=240
dalvik.vm.heapsize=64m

# Samsung USB default mode
persist.service.usb.setting=2

#
# ADDITIONAL_BUILD_PROPERTIES
#
ro.setupwizard.mode=OPTIONAL
ro.com.google.gmsversion=2.3_r4
media.stagefright.enable-player=true
media.stagefright.enable-meta=true
media.stagefright.enable-scan=true
media.stagefright.enable-http=true
media.stagefright.enable-rtsp=true
ro.com.google.clientidbase=Android-samsung
ro.com.google.clientidbase.ms=Android-skt-kr
ro.com.google.clientidbase.am=Android-skt-kr
ro.com.google.clientidbase.gmm=Android-samsung
ro.com.google.clientidbase.yt=Android-samsung
ro.url.legal=http://www.google.com/intl/%s/mobile/Android/basic/phone-legal.html
ro.url.legal.Android_privacy=http://www.google.com/intl/%s/mobile/Android/basic/privacy.html
ro.com.google.locationfeatures=1
keyguard.no_require_sim=true
ro.config.ringtone=Over_the_horizon.ogg
ro.config.notification_sound=Sherbet.ogg
ro.config.alarm_alert=Good_Morning.ogg
ro.config.media_sound=Over_the_horizon.ogg
ro.opengles.version=131072
ro.csc.sales_code=MSK
ro.secdevenc=true
ro.wtldatapassword=true
net.bt.name=Android
dalvik.vm.stack-trace-file=/data/anr/traces.txt

まず、Samsung Galaxy s-IIをusbに接続し、コマンドプロンプトを入力してシス​​テムをマウントします-

cmd:> adb remount

次に、ファイルを置き換えてデバイスを再起動します-

cmd:> adb Shell
#reboot

デフォルトでは、このデバイスはlibstagefrightの代わりにopencoreフレームワークを使用していることに気づきました。そして、opencoreにはいくつかの問題があります。そのため、naveエラーがスローされます。ただし、libstagefrightはすでにAndroidバージョン2.3に実装されています。build.propファイルを見てください。stagefrightは無効になっています。libstagefrightフレームワークを有効にし、libstagefrightフレームワークをサポートするのに最適なソリューションです。 MPEG-2TSファイルも再生でき、複数のビデオファイルを問題なく同時に再生できます。ぜひお試しください。

0
Suvam Roy

あなたは、あなたが何を試したか、そして問題のある領域が何であるかについて、それほど多くの詳細を与えていないので、私はあなたが説明していることのいずれかを再現できるかどうかを確認するために小さなテストを行いました。

決定的な発見はありませんが、少なくとも私のGalaxy Nexus(Android 4.0.2)が問題なく3つのビデオを同時に再生できることを確認できます。一方、私が横になっていた古いSamsung Galaxy Spica(Android 2.1-update1)は、一度に1つのファイルしか再生しません。これは常に最初のSurfaceViewのようです。

Android 3.0、2.3.3、および2.2のエミュレーターを設定して、さまざまなAPIレベルをさらに調査しました。これらのプラットフォームはすべて、さまざまなサーフェスビューでの複数のビデオファイルの再生を問題なく処理できるようです。 。2.1-update1を実行しているエミュレーターで最後のテストを1回行いましたが、実際の電話とは異なり、テストケースも問題なく再生されました。ただし、レイアウトのレンダリング方法に若干の違いがありました。

この振る舞いは、あなたが求めているものに実際にはソフトウェアの制限はないのではないかと私に思わせますが、複数のビデオファイルの同時再生がサポートされているかどうかはハードウェアに依存しているようです。したがって、このシナリオのサポートはデバイスごとに異なります。経験的な観点から、私は間違いなく、この仮説をいくつかのより物理的なデバイスでテストすることは興味深いと思います。

実装に関するいくつかの詳細を参照するためだけに:

  1. 私は2つのわずかに異なる実装を設定しました。1つは単一のMediaPlayer内の3つのActivityインスタンスに基づいており、もう1つはそれぞれが独自のMediaPlayerオブジェクトを持つ3つの別々のフラグメントに分解されています。 (ちなみに、これら2つの実装の再生の違いは見つかりませんでした)
  2. assetsフォルダーにある単一の gpファイル (ありがとう、Apple)は、すべてのプレーヤーでの再生に使用されました。
  3. 両方の実装のコードは以下に添付されており、主にGoogleに基づいています MediaPlayerDemo_Video サンプル実装-実際のテストに必要のないコードをいくつか削除しました。結果は決して完全ではなく、ライブアプリでの使用に適していません。

アクティビティベースの実装:

public class MultipleVideoPlayActivity extends Activity implements
    OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {

    private static final String TAG = "MediaPlayer";
    private static final int[] SURFACE_RES_IDS = { R.id.video_1_surfaceview, R.id.video_2_surfaceview, R.id.video_3_surfaceview };

    private MediaPlayer[] mMediaPlayers = new MediaPlayer[SURFACE_RES_IDS.length];
    private SurfaceView[] mSurfaceViews = new SurfaceView[SURFACE_RES_IDS.length];
    private SurfaceHolder[] mSurfaceHolders = new SurfaceHolder[SURFACE_RES_IDS.length];
    private boolean[] mSizeKnown = new boolean[SURFACE_RES_IDS.length];
    private boolean[] mVideoReady = new boolean[SURFACE_RES_IDS.length];

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.multi_videos_layout);

        // create surface holders
        for (int i=0; i<mSurfaceViews.length; i++) {
            mSurfaceViews[i] = (SurfaceView) findViewById(SURFACE_RES_IDS[i]);
            mSurfaceHolders[i] = mSurfaceViews[i].getHolder();
            mSurfaceHolders[i].addCallback(this);
            mSurfaceHolders[i].setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);
        }
    }

    public void onBufferingUpdate(MediaPlayer player, int percent) {
        Log.d(TAG, "MediaPlayer(" + indexOf(player) + "): onBufferingUpdate percent: " + percent);
    }

    public void onCompletion(MediaPlayer player) {
        Log.d(TAG, "MediaPlayer(" + indexOf(player) + "): onCompletion called");
    }

    public void onVideoSizeChanged(MediaPlayer player, int width, int height) {
        Log.v(TAG, "MediaPlayer(" + indexOf(player) + "): onVideoSizeChanged called");
        if (width == 0 || height == 0) {
            Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
            return;
        }

        int index = indexOf(player);
        if (index == -1) return; // sanity check; should never happen
        mSizeKnown[index] = true;
        if (mVideoReady[index] && mSizeKnown[index]) {
            startVideoPlayback(player);
        }
    }

    public void onPrepared(MediaPlayer player) {
        Log.d(TAG, "MediaPlayer(" + indexOf(player) + "): onPrepared called");

        int index = indexOf(player);
        if (index == -1) return; // sanity check; should never happen
        mVideoReady[index] = true;
        if (mVideoReady[index] && mSizeKnown[index]) {
            startVideoPlayback(player);
        }
    }

    public void surfaceChanged(SurfaceHolder holder, int i, int j, int k) {
        Log.d(TAG, "SurfaceHolder(" + indexOf(holder) + "): surfaceChanged called");
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d(TAG, "SurfaceHolder(" + indexOf(holder) + "): surfaceDestroyed called");
    }


    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(TAG, "SurfaceHolder(" + indexOf(holder) + "): surfaceCreated called");

        int index = indexOf(holder);
        if (index == -1) return; // sanity check; should never happen
        try { 
            mMediaPlayers[index] = new MediaPlayer();
            AssetFileDescriptor afd = getAssets().openFd("sample.3gp");
            mMediaPlayers[index].setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
            mMediaPlayers[index].setDisplay(mSurfaceHolders[index]);
            mMediaPlayers[index].prepare();
            mMediaPlayers[index].setOnBufferingUpdateListener(this);
            mMediaPlayers[index].setOnCompletionListener(this);
            mMediaPlayers[index].setOnPreparedListener(this);
            mMediaPlayers[index].setOnVideoSizeChangedListener(this);
            mMediaPlayers[index].setAudioStreamType(AudioManager.STREAM_MUSIC);
        }
        catch (Exception e) { e.printStackTrace(); }
    }

    @Override protected void onPause() {
        super.onPause();
        releaseMediaPlayers();
    }

    @Override protected void onDestroy() {
        super.onDestroy();
        releaseMediaPlayers();
    }

    private void releaseMediaPlayers() {
        for (int i=0; i<mMediaPlayers.length; i++) {
            if (mMediaPlayers[i] != null) {
                mMediaPlayers[i].release();
                mMediaPlayers[i] = null;
            }
        }
    }


    private void startVideoPlayback(MediaPlayer player) {
        Log.v(TAG, "MediaPlayer(" + indexOf(player) + "): startVideoPlayback");
        player.start();
    }

    private int indexOf(MediaPlayer player) {
        for (int i=0; i<mMediaPlayers.length; i++) if (mMediaPlayers[i] == player) return i;
        return -1;  
    }

    private int indexOf(SurfaceHolder holder) {
        for (int i=0; i<mSurfaceHolders.length; i++) if (mSurfaceHolders[i] == holder) return i;
        return -1;  
    }
}

R.layout.multi_videos_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent" Android:layout_height="match_parent"
    Android:orientation="vertical">

    <SurfaceView Android:id="@+id/video_1_surfaceview"
        Android:layout_width="fill_parent" Android:layout_height="0dp"
        Android:layout_weight="1" />

    <SurfaceView Android:id="@+id/video_2_surfaceview"
        Android:layout_width="fill_parent" Android:layout_height="0dp"
        Android:layout_weight="1" />

    <SurfaceView Android:id="@+id/video_3_surfaceview"
        Android:layout_width="fill_parent" Android:layout_height="0dp"
        Android:layout_weight="1" />

</LinearLayout>

フラグメントベースの実装:

public class MultipleVideoPlayFragmentActivity extends FragmentActivity {

    private static final String TAG = "MediaPlayer";

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.multi_videos_activity_layout);
    }

    public static class VideoFragment extends Fragment implements
        OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {

        private MediaPlayer mMediaPlayer;
        private SurfaceView mSurfaceView;
        private SurfaceHolder mSurfaceHolder;
        private boolean mSizeKnown;
        private boolean mVideoReady;

        @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.multi_videos_fragment_layout, container, false);
        }

        @Override public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            mSurfaceView = (SurfaceView) getView().findViewById(R.id.video_surfaceview);
            mSurfaceHolder = mSurfaceView.getHolder();
            mSurfaceHolder.addCallback(this);
            mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);
        }

        public void onBufferingUpdate(MediaPlayer player, int percent) {
            Log.d(TAG, "onBufferingUpdate percent: " + percent);
        }

        public void onCompletion(MediaPlayer player) {
            Log.d(TAG, "onCompletion called");
        }

        public void onVideoSizeChanged(MediaPlayer player, int width, int height) {
            Log.v(TAG, "onVideoSizeChanged called");
            if (width == 0 || height == 0) {
                Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
                return;
            }

            mSizeKnown = true;
            if (mVideoReady && mSizeKnown) {
                startVideoPlayback();
            }
        }

        public void onPrepared(MediaPlayer player) {
            Log.d(TAG, "onPrepared called");

            mVideoReady = true;
            if (mVideoReady && mSizeKnown) {
                startVideoPlayback();
            }
        }

        public void surfaceChanged(SurfaceHolder holder, int i, int j, int k) {
            Log.d(TAG, "surfaceChanged called");
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            Log.d(TAG, "surfaceDestroyed called");
        }

        public void surfaceCreated(SurfaceHolder holder) {
            Log.d(TAG, "surfaceCreated called");

            try { 
                mMediaPlayer = new MediaPlayer();
                AssetFileDescriptor afd = getActivity().getAssets().openFd("sample.3gp");
                mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
                mMediaPlayer.setDisplay(mSurfaceHolder);
                mMediaPlayer.prepare();
                mMediaPlayer.setOnBufferingUpdateListener(this);
                mMediaPlayer.setOnCompletionListener(this);
                mMediaPlayer.setOnPreparedListener(this);
                mMediaPlayer.setOnVideoSizeChangedListener(this);
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            }
            catch (Exception e) { e.printStackTrace(); }
        }

        @Override public void onPause() {
            super.onPause();
            releaseMediaPlayer();
        }

        @Override public void onDestroy() {
            super.onDestroy();
            releaseMediaPlayer();
        }

        private void releaseMediaPlayer() {
            if (mMediaPlayer != null) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
        }

        private void startVideoPlayback() {
            Log.v(TAG, "startVideoPlayback");
            mMediaPlayer.start();
        }
    }
}

R.layout.multi_videos_activity_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent" Android:layout_height="match_parent"
    Android:orientation="vertical">

    <fragment class="mh.so.video.MultipleVideoPlayFragmentActivity$VideoFragment"
        Android:id="@+id/video_1_fragment" Android:layout_width="fill_parent"
        Android:layout_height="0dp" Android:layout_weight="1" />

    <fragment class="mh.so.video.MultipleVideoPlayFragmentActivity$VideoFragment"
        Android:id="@+id/video_2_fragment" Android:layout_width="fill_parent"
        Android:layout_height="0dp" Android:layout_weight="1" />

    <fragment class="mh.so.video.MultipleVideoPlayFragmentActivity$VideoFragment"
        Android:id="@+id/video_3_fragment" Android:layout_width="fill_parent"
        Android:layout_height="0dp" Android:layout_weight="1" />

</LinearLayout>

R.layout.multi_videos_fragment_layout:

<?xml version="1.0" encoding="utf-8"?>
<SurfaceView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/video_surfaceview" Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" />

更新:しばらく前からありますが、Googleの Grafikaプロジェクト を指摘する価値があると思いました。 'double decode' 機能を紹介します。これは "2つのビデオストリームを同時に2つのTextureViewにデコードします。"。2つ以上にどれだけ拡張できるかわからないビデオファイルですが、それでも元の質問に関連しています。

34
MH.

このコードをチェックしてください、それは動作します..。

_video1=(VideoView)findViewById(R.id.myvideoview);
    video1.setVideoURI(Uri.parse("Android.resource://" +getPackageName()+ "/"+R.raw.sample));
    video1.setMediaController(new MediaController(this));
    video1.requestFocus();
video2=(VideoView)findViewById(R.id.myvideview);
video2.setVideoURI(Uri.parse("Android.resource://" +getPackageName()+ "/"+R.raw.sample1));
video2.setMediaController(new MediaController(this));
video2.requestFocus();

Thread view1=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        Android.os.Process.setThreadPriority(Android.os.Process.THREAD_PRIORITY_DISPLAY);
        video1.start();
    }
});

Thread view2=new Thread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        Android.os.Process.setThreadPriority(Android.os.Process.THREAD_PRIORITY_DISPLAY);
        video2.start();
    }
});
_

ただし、マルチ_video-view_をサポートするかどうかは、デバイスのh/w天気によって異なります。サポートされていない場合は、This video can not be played Error (1, -110)としてエラーが発生します

5
Rohit

コード例は示していません。

私の経験から、フラグメントを使用してこれを実行できることがわかりました(少なくとも私が使用したデバイスでは)。古いデバイス用のフラグメントサポートライブラリがあることを忘れないでください。

したがって、基本的には、VideoViewの代わりにLinearLayoutなどを配置し、Fragmentトランザクションを使用して、LinearLayoutをVideoViewを持つFragmentに置き換えます。

0
Tyler

これを試して

public class CustomPictureActivity extends Activity {
/** Called when the activity is first created. */
VideoView vd1,vd2;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    vd1=(VideoView) findViewById(R.id.v1);
    vd2=(VideoView) findViewById(R.id.v2);
    vd1.setVideoURI(Uri.parse("/mnt/sdcard/file.mp4"));
    vd1.setMediaController(new MediaController(this));
    vd1.requestFocus();
    vd1.start();

    vd2.setVideoURI(Uri.parse("/mnt/sdcard/Android.mp4"));
    vd2.setMediaController(new MediaController(this));
    vd2.requestFocus();
    vd2.start();
}

}

とxmlは次のようになります

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="horizontal" >

<VideoView
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_weight="0.5" 
    Android:id="@+id/v1"/>

<VideoView
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    Android:layout_weight="0.5" 
    Android:id="@+id/v2"/>

</LinearLayout>
0
Tofeeq Ahmad