Android使用SurfaceView播放視頻時橫豎屏的調整

來源:互聯網
上載者:User

我個人看視頻的時候喜歡橫屏看,這樣視頻映像顯得還大,所以在做自己的播放器的時候預設就是橫屏顯示。這樣在播放橫屏錄製的視頻時沒有問題,但是一旦播放豎屏錄製的視頻問題就大了,映像都是偏轉90度的。這可怎麼辦呢?我的解決思路:

1.將SurfaceView偏轉90度,結果黑呼呼一片啥都不顯示。

2.將包含SurfaceView的layout偏轉90度,結果還是一片黑呼呼。

3.上網搜尋類似的問題,發現有人提問但是都沒有解決方案。

4.觀察一下系統內建的播放器吧,發現其橫豎屏的切換很流暢,而且在橫屏播放手機豎屏錄製的視頻時也會出現偏轉90度的情況。但是系統播放器播放這種視頻時預設是豎屏顯示的,所以我們可以學習一下,不用那麼死板必須橫屏,而是根據視頻的屬性動態調整。

5.解決方案:對於橫屏錄製的視頻就橫屏播放,對於豎屏錄製的視頻就豎屏播放,這樣只要調整布局的橫豎屏就可以了。

6.鑒於應用在橫豎屏切換的時候會將Activity重新建立,所以視頻會重新從頭開始播放,所以我們要做一下準備:

在mainifest檔案裡對負責播放的Activity添加以下屬性

  1. android:configChanges="orientation|keyboardHidden|screenSize"

重寫Acitivity的onConfigurationChanged方法:

  1. @Override
  2. public void onConfigurationChanged(Configuration newConfig) {
  3. super.onConfigurationChanged(newConfig);

  4. }

接下來重點來了,在上文對視頻比例的調整中,我只考慮了橫屏錄製視頻的情況,這下我們要根據視頻的屬性來區分對待了:


  1. @Override
  2. public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
  3. if (width == 0 || height == 0) {
  4. Log.e(TAG, "invalid video width(" + width + ") or height(" + height
  5. + ")");
  6. return;
  7. }
  8. Logger.d(TAG, "onVideoSizeChanged width:" + width + " height:" + height);
  9. mIsVideoSizeKnown = true;
  10. mVideoHeight = height;
  11. mVideoWidth = width;
  12. int wid = mMediaPlayer.getVideoWidth();
  13. int hig = mMediaPlayer.getVideoHeight();
  14. // 根據視頻的屬性調整其顯示的模式

  15. if (wid > hig) {
  16. if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
  17. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  18. }
  19. } else {
  20. if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
  21. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  22. }
  23. }
  24. DisplayMetrics dm = new DisplayMetrics();
  25. getWindowManager().getDefaultDisplay().getMetrics(dm);
  26. mSurfaceViewWidth = dm.widthPixels;
  27. mSurfaceViewHeight = dm.heightPixels;
  28. if (width > height) {
  29. // 豎屏錄製的視頻,調節其上下的空餘

  30. int w = mSurfaceViewHeight * width / height;
  31. int margin = (mSurfaceViewWidth - w) / 2;
  32. Logger.d(TAG, "margin:" + margin);
  33. RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
  34. RelativeLayout.LayoutParams.MATCH_PARENT,
  35. RelativeLayout.LayoutParams.MATCH_PARENT);
  36. lp.setMargins(margin, 0, margin, 0);
  37. mSurfaceView.setLayoutParams(lp);
  38. } else {
  39. // 橫屏錄製的視頻,調節其左右的空餘

  40. int h = mSurfaceViewWidth * height / width;
  41. int margin = (mSurfaceViewHeight - h) / 2;
  42. Logger.d(TAG, "margin:" + margin);
  43. RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
  44. RelativeLayout.LayoutParams.MATCH_PARENT,
  45. RelativeLayout.LayoutParams.MATCH_PARENT);
  46. lp.setMargins(0, margin, 0, margin);
  47. mSurfaceView.setLayoutParams(lp);
  48. }
  49. }

這樣不管橫屏還是豎屏錄製的視頻都可以正常的顯示了。當然我預設的都是橫屏觀看,如果在播放的時候要做橫豎屏的切換也可以按照這個方法來。
















聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.