android android-fragments android-view vlc libvlc

Android libvlc mĂșltiples problemas de superficie



android-fragments android-view (1)

Por favor, pruebe este:

--- libvlc = LibVLC.getInstance(); +++ libvlc = new LibVLC();

PS ¿Qué versión de LibVLC-Android está usando?

example PPS

Yo sabría si es posible usar dos superficies en el mismo diseño y ver cada una al mismo tiempo. En el futuro me gustaría tener una vista en cuadrícula de la vista de video, pero cada vista de video usando vlc.

Modifico esta muestra ( android-vlc-sample ) usando el fragmento.

El resultado es que solo veo un video ... ¿Cómo puedo resolverlo?

Desde log-cat no veo un error importante, pero creo que hay problemas de representación para Android UIThread

Codificacion Java

public class MultipleVideoPlayFragmentActivity extends FragmentActivity { public final static String LOCATION = "com.compdigitec.libvlcandroidsample.MultipleVideoPlayFragmentActivity.location"; private static final String TAG = "MediaPlayer"; public String mFilePatha; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.activity_multiple_video_play_fragment); Intent intent = getIntent(); mFilePatha = intent.getExtras().getString(LOCATION); } public static class VideoFragment extends Fragment implements SurfaceHolder.Callback, IVideoPlayer { public final static String TAG = "LibVLCAndroidSample/VideoActivity"; public final static String LOCATION = "com.compdigitec.libvlcandroidsample.VideoFragment.location"; private String mFilePath; // display surface private SurfaceView mSurface; private SurfaceHolder holder; // media player private LibVLC libvlc; private int mVideoWidth; private int mVideoHeight; private final static int VideoSizeChanged = -1; /************* * Activity *************/ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.sample, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Receive path to play from intent Log.d(TAG, "Playing back " + mFilePath); mFilePath = ((MultipleVideoPlayFragmentActivity) getActivity()).mFilePatha; // mFilePath="rtsp://192.168.4.125:554/0"; // mFilePath="android.resource://it.nexera.visiamobile/raw/sample_mpeg4"; mSurface = (SurfaceView) getView().findViewById(R.id.surface); holder = mSurface.getHolder(); holder.addCallback(this); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setSize(mVideoWidth, mVideoHeight); } @Override public void onResume() { super.onResume(); createPlayer(mFilePath); } @Override public void onPause() { super.onPause(); releasePlayer(); } @Override public void onDestroy() { super.onDestroy(); releasePlayer(); } /************* * Surface *************/ public void surfaceCreated(SurfaceHolder holder) { } public void surfaceChanged(SurfaceHolder surfaceholder, int format, int width, int height) { if (libvlc != null) libvlc.attachSurface(holder.getSurface(), this); } public void surfaceDestroyed(SurfaceHolder surfaceholder) { } private void setSize(int width, int height) { mVideoWidth = width; mVideoHeight = height; if (mVideoWidth * mVideoHeight <= 1) return; // get screen size int w = getActivity().getWindow().getDecorView().getWidth(); int h = getActivity().getWindow().getDecorView().getHeight(); // getWindow().getDecorView() doesn''t always take orientation into // account, we have to correct the values boolean isPortrait = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; if (w > h && isPortrait || w < h && !isPortrait) { int i = w; w = h; h = i; } float videoAR = (float) mVideoWidth / (float) mVideoHeight; float screenAR = (float) w / (float) h; if (screenAR < videoAR) h = (int) (w / videoAR); else w = (int) (h * videoAR); // force surface buffer size holder.setFixedSize(mVideoWidth, mVideoHeight); // set display size LayoutParams lp = mSurface.getLayoutParams(); lp.width = w; lp.height = h; mSurface.setLayoutParams(lp); mSurface.invalidate(); } @Override public void setSurfaceSize(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den) { Message msg = Message.obtain(mHandler, VideoSizeChanged, width, height); msg.sendToTarget(); } /************* * Player *************/ private void createPlayer(String media) { releasePlayer(); try { if (media.length() > 0) { Toast toast = Toast.makeText(this.getActivity(), media, Toast.LENGTH_LONG); toast.setGravity( Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); toast.show(); } // Create a new media player libvlc = LibVLC.getInstance(); libvlc.setHardwareAcceleration(LibVLC.HW_ACCELERATION_DISABLED); libvlc.setSubtitlesEncoding(""); libvlc.setAout(LibVLC.AOUT_OPENSLES); libvlc.setTimeStretching(true); libvlc.setChroma("RV32"); libvlc.setVerboseMode(true); // LibVLC.restart(this.getActivity()); EventHandler.getInstance().addHandler(mHandler); holder.setFormat(PixelFormat.RGBX_8888); holder.setKeepScreenOn(true); MediaList list = libvlc.getMediaList(); list.clear(); list.add(new Media(libvlc, LibVLC.PathToURI(media)), false); libvlc.playIndex(0); } catch (Exception e) { Toast.makeText(this.getActivity(), "Error creating player!", Toast.LENGTH_LONG).show(); } } private void releasePlayer() { if (libvlc == null) return; EventHandler.getInstance().removeHandler(mHandler); libvlc.stop(); libvlc.detachSurface(); holder = null; libvlc.closeAout(); libvlc.destroy(); libvlc = null; mVideoWidth = 0; mVideoHeight = 0; } /************* * Events *************/ private Handler mHandler = new MyHandler(this); private static class MyHandler extends Handler { private WeakReference<VideoFragment> mOwner; public MyHandler(VideoFragment owner) { mOwner = new WeakReference<VideoFragment>(owner); } @Override public void handleMessage(Message msg) { VideoFragment player = mOwner.get(); // SamplePlayer events if (msg.what == VideoSizeChanged) { player.setSize(msg.arg1, msg.arg2); return; } // Libvlc events Bundle b = msg.getData(); switch (b.getInt("event")) { case EventHandler.MediaPlayerEndReached: player.releasePlayer(); break; case EventHandler.MediaPlayerPlaying: case EventHandler.MediaPlayerPaused: case EventHandler.MediaPlayerStopped: default: break; } } } } }

Codificacion XML

<?xml version="1.0" encoding="utf-8"?>

<fragment android:id="@+id/video_1_fragment" android:layout_width="100dp" android:layout_height="0dp" android:layout_weight="1" class="com.compdigitec.libvlcandroidsample.MultipleVideoPlayFragmentActivity$VideoFragment" /> <fragment android:id="@+id/video_2_fragment" android:layout_width="100dp" android:layout_height="0dp" android:layout_weight="1" class="com.compdigitec.libvlcandroidsample.MultipleVideoPlayFragmentActivity$VideoFragment" />

Disposición de un solo fragmento

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="false" android:orientation="vertical" tools:context=".SampleActivity" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <SurfaceView android:id="@+id/surface" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" /> </FrameLayout>