Comment lire plusieurs fichiers vidéo simultanément dans une mise en page côte à côte dans une vue différente dans Android

Dans Android, j'ai créé une mise en page avec trois vues de surface côte à côte et je souhaite jouer simultanément un fichier vidéo avec différents lecteurs multimédias. Mais un problème auquel j'ai été confronté, qu'aucun des trois ne peut jouer cette vidéo simultanément. Un ou deux d'entre eux ont été arrêtés. Si j'ai utilisé la vue vidéo au lieu de la classe Media Player directement, mais le problème reste le même. S'il vous plait, quelqu'un peut vous aider. Quel est le problème? Il provoque une mauvaise erreur native de création de surface d'erreur. J'ai essayé une combinaison différente, comme un fichier en 3 vues différentes, trois fichiers en trois vues différentes, mais le problème n'est pas encore résolu. Certaines réponses dans un autre site Web indiquent que cela dépend de la version du noyau. Si cela dépend de la version de Kernel, pouvez-vous me donner un lien sur la documentation Android sur le site Android, qu'il dépend de la version du noyau. Ou il est possible de jouer, donnez-moi les étapes du code. Ceci est le journal des erreurs –

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 

  • Impossible de remplacer onCreateOptionsMenu dans ListFragment
  • Installation d'apk à partir de la page Web
  • Obtenez la chaîne de format de date préférée du système Android
  • Supprimez l'espace blanc indésirable dans WebView Android
  • Code pour lancer explicitement l'application externe
  • Comment donner de l'animation au ViewSwitcher
  • Icône de navigation disparu après avoir passé de ICS ActionBar à la barre d'outils Lollipop
  • Création de fichiers temporaires dans Android
  • Spell Check Studio Android / IntelliJ Idea
  • Comment tachez-vous un bitmap dans Android?
  • Android Studio 0.5.2 SVN CheckOut ne fonctionne pas
  • Jouer de la vidéo à l'aide de la texture dans la vue de recyclage
  • 5 Solutions collect form web for “Comment lire plusieurs fichiers vidéo simultanément dans une mise en page côte à côte dans une vue différente dans Android”

    Vous ne donnez pas beaucoup de détails sur ce que vous avez exactement essayé et quels sont les domaines problématiques, alors j'ai fait un petit test pour voir si je pourrais reproduire tout ce que vous décrivez.

    Je n'ai pas de résultats concluants, mais je peux au moins confirmer que mon Galaxy Nexus (Android 4.0.2) est capable de lire trois vidéos simultanément sans aucun problème. D'autre part, un ancien Samsung Galaxy Spica (Android 2.1-update1), je n'avais eu qu'un seul fichier à la fois – il semble toujours être le premier SurfaceView .

    J'ai ensuite étudié différents niveaux d'API en configurant des émulateurs pour Android 3.0, 2.3.3 et 2.2. Toutes ces plates-formes semblent être en mesure de gérer la lecture de plusieurs fichiers vidéo sur différentes vues de surface. J'ai fait un dernier test avec un émulateur exécutant 2.1-update1 aussi, ce qui intéressant a également joué le cas de test sans problèmes, contrairement au téléphone actuel. J'ai remarqué quelques légères différences dans la façon dont la mise en page a été rendue cependant.

    Ce comportement m'amène à soupçonner qu'il n'y a vraiment aucune limitation de logiciel à ce que vous recherchez, mais cela semble dépendre du matériel, même si la lecture simultanée de plusieurs fichiers vidéo est prise en charge. Par conséquent, le support de ce scénario diffère selon les périphériques. D'un point de vue emporical, je pense définitivement qu'il serait intéressant de tester cette hypothèse sur d'autres dispositifs physiques.

    Juste pour référence quelques détails en ce qui concerne la mise en œuvre:

    1. J'ai configuré deux implémentations légèrement différentes: l'une basée sur trois instances de MediaPlayer dans une seule Activity , et celle dans laquelle elles ont été prises en compte dans trois fragments distincts avec chacun leur propre objet MediaPlayer . (En fait, je n'ai trouvé aucune différence de lecture pour ces deux implémentations)
    2. Un seul fichier 3gp (merci pour cela, Apple), situé dans le dossier des assets , a été utilisé pour la lecture avec tous les joueurs.
    3. Le code pour les deux implémentations est joint ci-dessous et largement basé sur l'implémentation d'exemple Googles MediaPlayerDemo_Video – J'ai éliminé un code non requis pour le test réel. Le résultat n'est en aucun cas complet ou approprié pour l'utilisation dans des applications en direct.

    Mise en œuvre basée sur l'activité:

     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> 

    Mise en œuvre basée sur les fragments:

     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" /> 

    Mise à jour: Bien qu'il existe depuis un certain temps maintenant, je pensais juste qu'il valait la peine de souligner que le projet Grafika de Google présente une fonctionnalité «double décodage» , qui «Décode deux flux vidéo simultanément à deux TextureViews». Je ne sais pas à quel point il passe à plus de deux fichiers vidéo, mais néanmoins pertinent pour la question initiale.

    Chk ce code, ça marche …

     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(); } }); 

    Mais il dépend de votre périphérique h / w, il prend en charge la multi video-view ou non. Si cela ne supporte pas, cela vous donnera une erreur car This video can not be played Error (1, -110)

    J'ai trouvé une solution. Remplacez simplement /system/build.prop avec ceci build.prop suivant –

    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 

    Connectez d'abord votre Samsung Galaxy s-II avec usb et tapez l'invite de commande pour monter votre système –

     cmd:> adb remount 

    Puis remplacez le fichier et redémarrez votre appareil –

     cmd:> adb shell #reboot 

    J'ai remarqué que par défaut ce périphérique utilise opencore framework au lieu de libstagefright. Et opencore a un problème, c'est pourquoi l'erreur de la nef est en train de lancer. Mais libstagefright est déjà implémenté dans Android version 2.3. Jetez un oeil au fichier build.prop, le stagefright est désactivé. C'est la meilleure solution pour permettre à libstagefright framework et prendre en charge libstagefright framework. Vous pouvez également lire le fichier MPEG-2TS et il prend en charge la lecture de plusieurs fichiers vidéo simultanément sans problème. Essayez-le et profitez-en.

    Vous ne donnez aucun exemple de code.

    De mon expérience, j'ai constaté que vous pouvez le faire avec des Fragments (au moins sur les appareils que j'ai utilisés). Rappelez-vous qu'il existe une bibliothèque de support Fragment pour les périphériques plus anciens.

    Donc, fondamentalement, mettez LinearLayout ou quelque chose à la place des VideoViews, puis utilisez les transactions Fragment pour remplacer les LinearLayouts par un Fragment qui a une VideoView.

    Essaye ça

     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(); } 

    }

    Et xml devrait être comme ça

     <?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> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.