2014-02-28 7 views
19

Ich würde wissen, ob es möglich ist, zwei Oberflächen im selben Layout zu verwenden und jeden zur gleichen Zeit zu sehen. In Zukunft würde ich eine Rasteransicht von Video-View, aber jedes Video-View mit Vlc.android libvlc mehrere Oberflächenprobleme

Ich modifiziere dieses Beispiel (android-vlc-sample) mit Fragment.

Das Ergebnis ist, dass ich nur ein Video sehe ... Wie kann ich lösen?

Von log-Katze sehe ich nicht wichtig, Fehler, aber ich denke, dass es Rendering-Probleme für Android UIThread

Java Coding

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

} 

XML Kodierung

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

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

Einzel Fragment-Layout

<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> 
+0

Ich habe ein gleiches Problem in einem Hintergrund-Service, habe versucht, mehrere Instanzen von LibVLC, aber das funktioniert nicht, nur das letzte Streaming gespielt. Sie haben Ihr Problem mit mehreren Fragmenten gelöst? – Hpsaturn

+1

nein, VLC für Android hat nicht mehrere Instanzen unterstützt, aber ich weiß, dass VLC-Mitarbeiter daran gearbeitet haben. Überprüfen Sie das offizielle vlc-Entwicklerforum. – tulkas85

+0

Hallo @ tulkas85: -Ich habe das gleiche Problem.Ich versuche mit diesem Link - [Android VLC-Player mit mehreren Instanzen] (https://github.com/dariobanfi/multiplevlc) funktioniert es gut mit Android 5.0 aber für 6.0 dort Rendering Issue.Meas Stream nicht richtig bekommen.einiges flackern dort drüben. –

Antwort

0

Bitte versuchen Sie dieses:

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

P. S. Welche Version von LibVLC-android verwenden Sie?

P.P.S. example