SurfaceView高度+宽度被忽略 [英] SurfaceView height + width gets ignored
问题描述
下面的脚本作品完美无瑕,但改变我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工作正常使用标准的Android媒体框架,但在导入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屋!