2011-12-21 9 views
12

घुमाए मेरा एप्लिकेशन केवल पोर्ट्रेट मोड प्रदान करता है। एक पोर्ट्रेट गतिविधि में मेरे पास एक पूर्णस्क्रीन वीडियो व्यू है। मैं क्या करना चाहता हूं लैंडस्केप मोड में वीडियो व्यू (वास्तविक वीडियो, वीडियोबफर) 90 डिग्री घुमाएं। लांसस्केप मोड पर गतिविधि को सक्षम करना एक विकल्प नहीं है। वीडियो व्यू और कैनवास घुमाने का विस्तार काम नहीं करेगा क्योंकि यह एक SurfaceView वास्तविक दृश्य नहीं है। क्या वीडियो व्यू के साथ इसे प्राप्त करने का कोई तरीका है?एक एंड्रॉइड वीडियोव्यू

+2

क्यों लैंडस्केप मोड जब आप यही चाहते है एक विकल्प नहीं है,? – TouchBoarder

उत्तर

0

आप oriantation तो आपके वीडियो परिदृश्य (और चित्र) में प्रदर्शित किया जा सकता है, जबकि अपने आवेदन के बाकी चित्र में है, प्रकट में एक गतिविधि की अलग-अलग सेट कर सकते हैं। इस पर समाधान के लिए मेरा उत्तर here देखें।

+0

यह एक अच्छा विचार है, लेकिन अगर आप पूर्ण स्क्रीन की बजाय वीडियो को एक टुकड़े में प्रदर्शित करना चाहते हैं तो काम नहीं करेगा। –

21

VideoView वीडियो के रोटेशन संरचना मैट्रिक्स ठीक से सेट है और रोटेशन विशेषता प्रयोग किया जाता है, भले ही समर्थन नहीं करता।

आप TextureView का उपयोग करने और इसकी विशेषता रोटेशन = "9 0" (उदाहरण के लिए) सेट करने के लिए क्या कर सकते हैं। फिर यह फ्रेम को घुमाएगा लेकिन पहलू अनुपात ऐसा कुछ है जिसे आपको अपने आप को संभालने की आवश्यकता है। आदेश

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextureView 
     android:id="@+id/playback_video" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerInParent="true" 
     android:rotation="90" /> 
</RelativeLayout> 

करने के लिए ताकि आप textureView.setScaleX ((screenHeight * 1.0f)/screenWidth) का उपयोग कर सकते में यह स्ट्रीम वीडियो भी संभाल चाहिए। लेकिन कृपया इसे तैयार कोड जारी करने के बजाय उदाहरण के रूप में सोचें। मैंने कुछ चीजों का नाम बदल दिया और दूसरों को हटा दिया, उनके पास इस संबंध का संबंध नहीं है और यह कुछ तोड़ सकता है लेकिन आम तौर पर यह व्यावहारिक उदाहरण है।

public class PlaybackActivity extends Activity implements MediaPlayer.OnErrorListener, OnPreparedListener, 
     OnCompletionListener, OnVideoSizeChangedListener, OnBufferingUpdateListener, OnInfoListener, 
     SurfaceTextureListener 
{ 

    private MediaPlayer mediaPlayer; 
    private TextureView videoView; 
    private boolean startedPlayback = false; 
    private boolean playerReady = false; 
    public static final int MEDIA_INFO_NETWORK_BANDWIDTH = 703; 

    private void createMediaPlayer() { 
     mediaPlayer = new MediaPlayer(); 
    } 

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

    public void onCompletion(MediaPlayer mp) { 
     Log.w(TAG, "Video playback finished"); 
    } 

    @Override 
    public boolean onError(MediaPlayer player, int what, int extra) { 
     if (what == MediaPlayer.MEDIA_ERROR_UNKNOWN) { 
      /* 
      * Restart play back in case we did not start anything yet. This may 
      * be the case when we tried to tune in in very first secs of the 
      * broadcast when there is no data yet. 
      */ 
      if (liveBroadcast && mediaPlayer != null && !mediaPlayer.isPlaying() && !startedPlayback) { 
       if (checkCount-- > 0) { 
        mediaPlayer.reset(); 
        checkBroadcast(); 
       } else { 
        Log.w(TAG, "Broadcast finished"); 
       } 
      } else { 
       Log.w(TAG, "No media in stream"); 
      } 
     } else if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) { 
      Log.w(TAG, "Media service died unexpectedly"); 
     } else { 
      Log.w(TAG, "Unknown media error"); 
     } 
     return true; 
    } 

    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     switch (what) { 
     case MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING: 
      Log.w(TAG, "Media is too complex to decode it fast enough."); 
      startedPlayback = true; 
      break; 
     case MEDIA_INFO_NETWORK_BANDWIDTH: 
      Log.w(TAG, "Bandwith in recent past."); 
      break; 
     case MediaPlayer.MEDIA_INFO_BUFFERING_START: 
      Log.w(TAG, "Start of media bufferring."); 
      startedPlayback = true; 
      break; 
     case MediaPlayer.MEDIA_INFO_BUFFERING_END: 
      Log.w(TAG, "End of media bufferring."); 
      startedPlayback = true; 
      break; 
     case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING: 
      Log.w(TAG, "Media is not properly interleaved."); 
      break; 
     case MediaPlayer.MEDIA_INFO_NOT_SEEKABLE: 
      Log.w(TAG, "Stream is not seekable."); 
      break; 
     case MediaPlayer.MEDIA_INFO_METADATA_UPDATE: 
      Log.w(TAG, "New set of metadata is available."); 
      break; 
     case MediaPlayer.MEDIA_INFO_UNKNOWN: 
     default: 
      Log.w(TAG, "Unknown playback info (" + what + ":" + extra + ")."); 
      break; 
     } 
     return true; 
    } 

    private void startPlayback() { 
     if (mediaPlayer != null) { 
      onLoaded(mediaPlayer); 
      mediaPlayer.start(); 
     } 
    } 

    private void pausePlayback() { 
     if (mediaPlayer != null && mediaPlayer.isPlaying()) 
      mediaPlayer.pause(); 
    } 

    private void resumePlayback() { 
     if (mediaPlayer != null && mediaPlayer.isPlaying()) 
      mediaPlayer.start(); 
    } 

    private void onLoaded(MediaPlayer mp) { 
    } 

    public void onPrepared(MediaPlayer mp) { 
     playerReady = true; 
     startPlayback(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     setContentView(R.layout.playback); 
     videoView = (TextureView) findViewById(R.id.playback_video); 
     videoView.setOnClickListener(videoViewClickHandler); 
     videoView.setSurfaceTextureListener(this); 
     createMediaPlayer(); 
    } 

    @Override 
    protected void onDestroy() { 
     releaseMediaPlayer(); 
     if (surface != null) { 
      surface.release(); 
      surface = null; 
     } 
     super.onDestroy(); 
    } 

    @Override 
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
     this.surface = new Surface(surface); 
     loadMedia(someurl); 
    } 

    @Override 
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
     if (this.surface != null) { 
      releaseMediaPlayer(); 
      this.surface.release(); 
      this.surface = null; 
     } 
     return true; 
    } 

    @Override 
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
    } 

    @Override 
    public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
    } 

    @Override 
    public void onVideoSizeChanged(MediaPlayer mp, int w, int h) { 
     if (w > 0 && h > 0 && !videoSizeSetupDone) { 
      Log.w(TAG, "Video size changed: " + w + "x" + h); 
      changeVideoSize(w, h); 
     } 
    } 

    private boolean videoSizeSetupDone = false; 

    private void changeVideoSize(int width, int height) { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     RelativeLayout.LayoutParams params; 

     Utils.getScreenMetrics(this, metrics); 
     VideoOrientation orientation = someVideoSource.getVideoOrientation(); 
     if (orientation == LANDSCAPE) { 
      params = new RelativeLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels); 
     } else { 
      float rotation = orientation == BroadcastVideoOrientation.BroadcastVideoFrontCamera ? -90.0f : 90.0f; 
      params = new RelativeLayout.LayoutParams(metrics.heightPixels, metrics.widthPixels); 
      float scale = (width * 1.0f)/(height * 1.0f); 
      videoView.setRotation(rotation); 
      videoView.setScaleX(scale); 
     } 
     params.addRule(RelativeLayout.CENTER_IN_PARENT, -1); 
     videoView.setLayoutParams(params); 
     videoSizeSetupDone = true; 
    } 

    private void loadMedia(String url) { 
     if (surface == null) 
      return; 
     Log.d(App.TAG, "Loading url: " + url); 

     startedPlayback = false; 
     try { 
      mediaPlayer.reset(); 
      mediaPlayer.setSurface(surface); 
      mediaPlayer.setDataSource(url); 
      mediaPlayer.setOnPreparedListener(this); 
      mediaPlayer.setOnCompletionListener(this); 
      mediaPlayer.setOnErrorListener(this); 
      mediaPlayer.setOnVideoSizeChangedListener(this); 
      mediaPlayer.setScreenOnWhilePlaying(true); 
      mediaPlayer.setOnBufferingUpdateListener(this); 
      mediaPlayer.setOnInfoListener(this); 
      mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
      mediaPlayer.prepareAsync(); 
     } catch (Exception e) { 
      Log.w(TAG, "Media load failed"); 
      Utils.alert(this, "Playback Error", e.getMessage(), finishHandler); 
     } 
    } 
} 

उम्मीद है कि इससे मदद मिलती है। मैं काफी समय से इस समाधान की तलाश में था। लगभग हर चीज का प्रयास किया और यह एकमात्र तरीका प्रतीत होता है।

+1

आप व्याख्या कर सकते हैं मोर ... दो में – sri

+0

शब्द, इस ओपन बनावट सतह है, तो आप जो कुछ भी आप की तरह, खिंचाव, दर्पण, आदि –

+0

@Umka सकता है आप कृपया मुझे hw हम पूर्वावलोकन पर देख सकते हैं बताओ इसके साथ क्या कर सकते हैं .. किसी भी कोड उदाहरण – Aswathy

संबंधित मुद्दे