我個人看視頻的時候喜歡橫屏看,這樣視頻映像顯得還大,所以在做自己的播放器的時候預設就是橫屏顯示。這樣在播放橫屏錄製的視頻時沒有問題,但是一旦播放豎屏錄製的視頻問題就大了,映像都是偏轉90度的。這可怎麼辦呢?我的解決思路:
1.將SurfaceView偏轉90度,結果黑呼呼一片啥都不顯示。
2.將包含SurfaceView的layout偏轉90度,結果還是一片黑呼呼。
3.上網搜尋類似的問題,發現有人提問但是都沒有解決方案。
4.觀察一下系統內建的播放器吧,發現其橫豎屏的切換很流暢,而且在橫屏播放手機豎屏錄製的視頻時也會出現偏轉90度的情況。但是系統播放器播放這種視頻時預設是豎屏顯示的,所以我們可以學習一下,不用那麼死板必須橫屏,而是根據視頻的屬性動態調整。
5.解決方案:對於橫屏錄製的視頻就橫屏播放,對於豎屏錄製的視頻就豎屏播放,這樣只要調整布局的橫豎屏就可以了。
6.鑒於應用在橫豎屏切換的時候會將Activity重新建立,所以視頻會重新從頭開始播放,所以我們要做一下準備:
在mainifest檔案裡對負責播放的Activity添加以下屬性
- android:configChanges="orientation|keyboardHidden|screenSize"
重寫Acitivity的onConfigurationChanged方法:
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- }
接下來重點來了,在上文對視頻比例的調整中,我只考慮了橫屏錄製視頻的情況,這下我們要根據視頻的屬性來區分對待了:
- @Override
- public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
- if (width == 0 || height == 0) {
- Log.e(TAG, "invalid video width(" + width + ") or height(" + height
- + ")");
- return;
- }
- Logger.d(TAG, "onVideoSizeChanged width:" + width + " height:" + height);
- mIsVideoSizeKnown = true;
- mVideoHeight = height;
- mVideoWidth = width;
- int wid = mMediaPlayer.getVideoWidth();
- int hig = mMediaPlayer.getVideoHeight();
- // 根據視頻的屬性調整其顯示的模式
- if (wid > hig) {
- if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- }
- } else {
- if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- }
- }
- DisplayMetrics dm = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(dm);
- mSurfaceViewWidth = dm.widthPixels;
- mSurfaceViewHeight = dm.heightPixels;
- if (width > height) {
- // 豎屏錄製的視頻,調節其上下的空餘
- int w = mSurfaceViewHeight * width / height;
- int margin = (mSurfaceViewWidth - w) / 2;
- Logger.d(TAG, "margin:" + margin);
- RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
- RelativeLayout.LayoutParams.MATCH_PARENT,
- RelativeLayout.LayoutParams.MATCH_PARENT);
- lp.setMargins(margin, 0, margin, 0);
- mSurfaceView.setLayoutParams(lp);
- } else {
- // 橫屏錄製的視頻,調節其左右的空餘
- int h = mSurfaceViewWidth * height / width;
- int margin = (mSurfaceViewHeight - h) / 2;
- Logger.d(TAG, "margin:" + margin);
- RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
- RelativeLayout.LayoutParams.MATCH_PARENT,
- RelativeLayout.LayoutParams.MATCH_PARENT);
- lp.setMargins(0, margin, 0, margin);
- mSurfaceView.setLayoutParams(lp);
- }
- }
這樣不管橫屏還是豎屏錄製的視頻都可以正常的顯示了。當然我預設的都是橫屏觀看,如果在播放的時候要做橫豎屏的切換也可以按照這個方法來。