SurfaceView高度+宽度被忽略 [英] SurfaceView height + width gets ignored

查看:1156
本文介绍了SurfaceView高度+宽度被忽略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的脚本作品完美无瑕,但改变我surfaceview从纵向到横向后,我的录像机的规模将得到f'd。试了几个选项,如 setFixedSize() setSizeFromLayout()和消除一切涉及我宽+高从我surfaceview。没有人知道什么是错与下面的code? 还是因为别人有同样的问题,在过去?

 包com.list;
进口io.vov.vitamio.MediaPlayer;
进口io.vov.vitamio.MediaPlayer.OnBufferingUpdateListener;
进口io.vov.vitamio.MediaPlayer.OnCompletionListener;
进口io.vov.vitamio.MediaPlayer.On preparedListener;
进口io.vov.vitamio.MediaPlayer.OnVideoSizeChangedListener;
进口android.app.Activity;
进口android.content.Intent;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;

公共类MediaPlayer的扩展活动实现OnBufferingUpdateListener,OnCompletionListener,在preparedListener,OnVideoSizeChangedListener,SurfaceHolder.Callback {

私有静态最后字符串变量=MediaPlayerDemo;
私人诠释mVideoWidth;
私人诠释mVideoHeight;
私人MediaPlayer的mMediaPlayer;
私人SurfaceView米preVIEW;
私人SurfaceHolder持有人;


私人布尔mIsVideoSizeKnown = FALSE;
私人布尔mIsVideoReadyToBePlayed = FALSE;

@覆盖
公共无效的onCreate(包冰柱){
    super.onCreate(冰柱);
    的setContentView(R.layout.mediaplayer);
    米preVIEW =(SurfaceView)findViewById(R.id.surface);
    持有人= M preview.getHolder();
    holder.addCallback(本);
}

私人无效的playVideo(){
    doCleanUp();
    尝试 {
        mMediaPlayer =新的MediaPlayer(本);
        意图myIntent = this.getIntent();
        字符串URL = myIntent.getStringExtra(URL);
        mMediaPlayer.setDataSource(URL);
        mMediaPlayer.setDisplay(保持器);
        。mMediaPlayer prepareAsync();
        mMediaPlayer.setScreenOnWhilePlaying(真正的);
        mMediaPlayer.setOnBufferingUpdateListener(本);
        mMediaPlayer.setOnCompletionListener(本);
        mMediaPlayer.setOn preparedListener(本);
        mMediaPlayer.setOnVideoSizeChangedListener(本);
    }赶上(例外五){
        Log.e(TAG,错误:+ e.getMessage(),E);
    }
}

公共无效onBufferingUpdate(MediaPlayer的为arg0,INT百分比){
    Log.d(TAG,onBufferingUpdate%的:+%的);

}

公共无效onCompletion(MediaPlayer的为arg0){
    Log.d(TAG,onCompletion名为);
    mMediaPlayer.release();
}

公共无效onVideoSizeChanged(MediaPlayer的熔点,诠释的宽度,高度INT){
    Log.v(TAG,onVideoSizeChanged名为);
    如果(宽== 0 ||高度== 0){
        Log.e(TAG,无效的视频的宽度(+宽+)或高度(+高度+));
        返回;
    }
    Log.v(afmeting, - >中+宽+PX BIJ+高度+PX);
    mIsVideoSizeKnown = TRUE;

    如果(mIsVideoReadyToBePlayed&安培;&安培; mIsVideoSizeKnown){
        startVideoPlayback();
    }
}

公共无效于prepared(MediaPlayer的媒体播放器){
    Log.d(TAG,在prepared名为);
    mIsVideoReadyToBePlayed = TRUE;
    如果(mIsVideoReadyToBePlayed&安培;&安培; mIsVideoSizeKnown){
        startVideoPlayback();
    }
}

公共无效surfaceChanged(SurfaceHolder surfaceholder,诠释我,诠释J,INT K){
    Log.d(TAG,surfaceChanged称为+ I ++ J ++ K);
}

公共无效surfaceDestroyed(SurfaceHolder surfaceholder){
    Log.d(TAG,surfaceDestroyed名为);
}

公共无效surfaceCreated(SurfaceHolder持有者){
    Log.d(TAG,surfaceCreated名为);
    的playVideo();
}

@覆盖
保护无效的onPause(){
    super.onPause();
    releaseMediaPlayer();
    doCleanUp();
}

@覆盖
保护无效的onDestroy(){
    super.onDestroy();
    releaseMediaPlayer();
    doCleanUp();
}

私人无效releaseMediaPlayer(){
    如果(mMediaPlayer!= NULL){
        mMediaPlayer.release();
        mMediaPlayer = NULL;
    }
}

私人无效doCleanUp(){
    mVideoWidth = 0;
    mVideoHeight = 0;
    mIsVideoReadyToBePlayed = FALSE;
    mIsVideoSizeKnown = FALSE;
}

私人无效startVideoPlayback(){
    Log.v(TAG,startVideoPlayback);
    holder.setSizeFromLayout();
    mMediaPlayer.start();
}
}
 

解决方案

同样在这里的问题:

我相信这个问题是Vitamio库,因为我已经经历过类似的问题在与Vitamio SDK处理。调整大小,我没有工作,当使用 SurfaceView 并调用 setLayoutParams(ViewGroup.LayoutParams PARAMS)。下面code工作正常使用标准的Andr​​oid媒体框架,但在导入vitamio包打破它。

RelativeLayout.LayoutParams video_VIEWLAYOUT =(RelativeLayout.LayoutParams)videoView.getLayoutParams();
video_VIEWLAYOUT.width =屏幕宽度;
video_VIEWLAYOUT.height =(INT)(((浮点)videoHeight /(浮点)videoWidth)*(浮点)屏幕宽度);
videoView.setLayoutParams(video_VIEWLAYOUT);

我的建议是尝试使用,而不是 io.vov.vitamio.widget.VideoView A android.view.SurfaceView

The following script works flawless, but the size of my videoplayer will get f'd after changing my surfaceview from portrait to landscape. Tried several options like setFixedSize(), setSizeFromLayout() and removing everything which involves my width + height from my surfaceview. Does anyone knows whats wrong with the code below? Or did someone have the same problem in the past?

package com.list;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.MediaPlayer.OnBufferingUpdateListener;
import io.vov.vitamio.MediaPlayer.OnCompletionListener;
import io.vov.vitamio.MediaPlayer.OnPreparedListener;
import io.vov.vitamio.MediaPlayer.OnVideoSizeChangedListener;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class mediaPlayer extends Activity implements OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {

private static final String TAG = "MediaPlayerDemo";
private int mVideoWidth;
private int mVideoHeight;
private MediaPlayer mMediaPlayer;
private SurfaceView mPreview;
private SurfaceHolder holder;


private boolean mIsVideoSizeKnown = false;
private boolean mIsVideoReadyToBePlayed = false;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.mediaplayer);
    mPreview = (SurfaceView) findViewById(R.id.surface);
    holder = mPreview.getHolder();
    holder.addCallback(this);
}

private void playVideo() {
    doCleanUp();
    try {
        mMediaPlayer = new MediaPlayer(this);
        Intent myIntent = this.getIntent();
        String url = myIntent.getStringExtra("url");
        mMediaPlayer.setDataSource(url);
        mMediaPlayer.setDisplay(holder);
        mMediaPlayer.prepareAsync();
        mMediaPlayer.setScreenOnWhilePlaying(true);
        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnVideoSizeChangedListener(this);
    } catch (Exception e) {
        Log.e(TAG, "error: " + e.getMessage(), e);
    }
}

public void onBufferingUpdate(MediaPlayer arg0, int percent) {
    Log.d(TAG, "onBufferingUpdate percent:" + percent);

}

public void onCompletion(MediaPlayer arg0) {
    Log.d(TAG, "onCompletion called");
    mMediaPlayer.release();
}

public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
    Log.v(TAG, "onVideoSizeChanged called");
    if (width == 0 || height == 0) {
        Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
        return;
    }
    Log.v("afmeting", "->" +width+"px bij "+height+"px");
    mIsVideoSizeKnown = true;

    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
        startVideoPlayback();
    }
}

public void onPrepared(MediaPlayer mediaplayer) {
    Log.d(TAG, "onPrepared called");
    mIsVideoReadyToBePlayed = true;
    if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
        startVideoPlayback();
    }
}

public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
    Log.d(TAG, "surfaceChanged called" + i + "  " + j + "   " + k);
}

public void surfaceDestroyed(SurfaceHolder surfaceholder) {
    Log.d(TAG, "surfaceDestroyed called");
}

public void surfaceCreated(SurfaceHolder holder) {
    Log.d(TAG, "surfaceCreated called");
    playVideo();
}

@Override
protected void onPause() {
    super.onPause();
    releaseMediaPlayer();
    doCleanUp();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    releaseMediaPlayer();
    doCleanUp();
}

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

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

private void startVideoPlayback() {
    Log.v(TAG, "startVideoPlayback");
    holder.setSizeFromLayout();
    mMediaPlayer.start();
}
}

解决方案

Same problem here:

I believe the problem is the Vitamio library as I have experienced a similar problem when dealing with the Vitamio SDK. Resizing didn't work for me, when using a SurfaceView and invoking setLayoutParams(ViewGroup.LayoutParams params). The below code works fine using the standard Android media-framework, but importing the vitamio packages breaks it.

RelativeLayout.LayoutParams video_VIEWLAYOUT = (RelativeLayout.LayoutParams) videoView.getLayoutParams();
video_VIEWLAYOUT.width = screenWidth;
video_VIEWLAYOUT.height = (int) (((float)videoHeight / (float)videoWidth) *(float)screenWidth);
videoView.setLayoutParams(video_VIEWLAYOUT);

My recommendation would be to try using the io.vov.vitamio.widget.VideoView instead of a android.view.SurfaceView.

这篇关于SurfaceView高度+宽度被忽略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆