Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android:MediaPlayer视频宽高比问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到了一个我无解决的问题.我正在使用MediaPlayer类来播放视频;但是,我总是失去原有的宽高比.这里提到了媒体播放器代码和xml代码.我尝试了很多东西,但仍然无法解决问题.我需要保持原始的宽高比.我已经在 Android Manifest文件中将此活动声明为全屏.我还在媒体播放器代码之后附加了xml代码.请建议我.
private class ErrorListener implements OnErrorListener {
    // FIXME: @Override
    public Boolean onError(MediaPlayer mp,int what,int extra) {
        String message = "UnkNown error";
        switch (what) {
        case MediaPlayer.MEDIA_ERROR_UNKNowN:
            message = "Unable to play media";
            showError(messagE);
            break;
        case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
            message = "Server Failed";
            showError(messagE);
            break;
        case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
            message = "Invalid media";
            showError(messagE);
            break;
        }
        return false;
    }
}

public void onCreate(Bundle savedInstanceStatE) {
    super.onCreate(savedInstanceStatE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    setContentView(R.layout.videoview);
    Intent intent = geTintent();
    uri = intent.getData();
    new loadMovie().execute();
    mPreview = (SurfaceView) findViewById(R.id.videoview);
    mPreview.bringToFront();
    holder = mPreview.getHolder();
    holder.addCallBACk(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mediaPlayer = new MediaPlayer();

}// onCreate Method Ends

private void playVideo() {
    doCleanUp();
    try {
        mediaPlayer.setDatasource(this,uri);
    } catch (IllegalArgumentexception E) {
        e.printStackTrace();
    } catch (SecurityException E) {
        e.printStackTrace();
    } catch (IllegalStateException E) {
        e.printStackTrace();
    } catch (IOException E) {
        e.printStackTrace();
    }
    mediaPlayer.setDisplay(holder);
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException E) {
        e.printStackTrace();
    } catch (IOException E) {
        e.printStackTrace();
    }
    mediaPlayer.setOnErrorListener(new ErrorListener());
    mediaPlayer.setOnBufferingupdateListener(this);
    mediaPlayer.setOnCompletionListener(this);
    mediaPlayer.setOnPreparedListener(this);
    mediaPlayer.setOnVideoSizeChangedListener(this);
    mediaPlayer.setAudioStreamType(Au@L_569_13@manager.STREAM_MUSIC);
    mediaController = new MediaController(this);
}

@Override
public Boolean onTouchEvent(MotionEvent event) {
    mediaController.show();
    return false;
}

// --MediaPlayerControl
// methods----------------------------------------------------
public void start() {
    mediaPlayer.start();
}

public void pause() {
    mediaPlayer.pause();
}

public int getDuration() {
    return mediaPlayer.getDuration();
}

public int getCurrentPosition() {
    return mediaPlayer.getCurrentPosition();
}

public void seekTo(int i) {
    mediaPlayer.seekTo(i);
}

public Boolean isPlaying() {
    return mediaPlayer.isPlaying();
}

public int getBufferPercentage() {
    return 0;
}

public Boolean canPause() {
    return true;
}

public Boolean canSeekBACkWARD() {
    return true;
}

public Boolean canSeekForWARD() {
    return true;
}

// End of MediaPlayer
// Controls--------------------------------------------------------
// ------------------------

public void onPrepared(MediaPlayer mediaPlayer) {
    mediaController.setMediaPlayer(this);
    mediaController.setAnchorView(findViewById(R.id.videoview));
    mIsVideoReadyToBePlayed = true;

    if (mIsVideoReadyToBePlayed && mIsVideoSizeKNown) {
        startVideoPlayBACk();
    }

    handler.post(new Runnable() {
        public void run() {
            mediaController.setEnabled(true);
            mediaController.show();
        }
    });
}

public void surfaceChanged(SurfaceHolder arg0,int arg1,int arg2,int arg3) {
    // TODO Auto-generated method stub

}

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    playVideo();
}

public void surfaceDestroyed(SurfaceHolder arg0) {

}

private void startVideoPlayBACk() {
    holder.setFixedSize(mVideoWidth,mVideoHeight);
    mediaPlayer.start();
}

public void onVideoSizeChanged(MediaPlayer mp,int width,int height) {
    if (width == 0 || height == 0) {
        return;
    }
    mIsVideoSizeKNown = true;
    mVideoWidth = width;
    mVideoHeight = height;
    if (mIsVideoReadyToBePlayed && mIsVideoSizeKNown) {
        startVideoPlayBACk();
    }

}

public void onCompletion(MediaPlayer arg0) {

}

public void onBufferingupdate(MediaPlayer mp,int percent) {

}

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

private void doCleanUp() {
    mVideoWidth = 0;
    mVideoHeight = 0;
    mIsVideoReadyToBePlayed = false;
    mIsVideoSizeKNown = false;
}

这是XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://scheR_516_11845@as.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
>
<SurfaceView android:id="@+id/videoview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
 </LinearLayout>

任何人都可以告诉我如何保持视频的宽高比?

@L_489_19@

首先使用Gravity.CENTER创建相对布局,然后将Surface视图附加到其中.这将确保视频在屏幕内居中.

此外,如果您正在使用活动,请使用“黑色”主题来避免渐变

在SurfaceView中,创建一个监听器:

@H_514_2@mMediaPlayer = new MediaPlayer(); @H_542_4@mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);

@H_514_2@mediaPlayer.onVideoSizeChangedListener mOnVideoSizeChangedListener = new MediaPlayer.onVideoSizeChangedListener() { @Override public void onVideoSizeChanged(MediaPlayer mp,int height) { setFitToFillAspectRatio(mp,width,height); } };

最后适合SurfaceView中的填充方法.这将适用于风景和肖像

private void setFitToFillAspectRatio(MediaPlayer mp,int videoWidth,int videoHeight)
{
    if(mp != null)
    {       
        Integer screenWidth = ((Activity) mContext).getWindowManager().getDefaultDisplay().getWidth();
        Integer screenHeight = ((Activity) mContext).getWindowManager().getDefaultDisplay().getHeight();
        android.view.ViewGroup.LayoutParams videoParams = getLayoutParams();


        if (videoWidth > videoHeight)
        {
            videoParams.width = screenWidth;
            videoParams.height = screenWidth * videoHeight / videoWidth;
        }
        else
        {
            videoParams.width = screenHeight * videoWidth / videoHeight;
            videoParams.height = screenHeight;
        }


        setLayoutParams(videoParams);
    }
}

大佬总结

以上是大佬教程为你收集整理的Android:MediaPlayer视频宽高比问题全部内容,希望文章能够帮你解决Android:MediaPlayer视频宽高比问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。