android如何在媒体播放器的surface view中调整视频宽度和高度
要在曲面视图中调整视频大小 我在媒体播放器中播放视频,使用表面视图和视频支架 //但在一些设备上实现MediaPlayerControl时,比如Micromax、iball、Akash平板电脑,它给出了ACRA错误跟踪无法跟踪的抽象方法错误 现在我想提出上述问题的解决方案:android如何在媒体播放器的surface view中调整视频宽度和高度,android,android-layout,android-video-player,Android,Android Layout,Android Video Player,要在曲面视图中调整视频大小 我在媒体播放器中播放视频,使用表面视图和视频支架 //但在一些设备上实现MediaPlayerControl时,比如Micromax、iball、Akash平板电脑,它给出了ACRA错误跟踪无法跟踪的抽象方法错误 现在我想提出上述问题的解决方案: 如何使媒体播放器控件在所有设备中处于活动状态,而不会像某些设备中的媒体控制器那样由于抽象方法而崩溃 设备 如何调整视频表面视图的大小 代码在三星galaxy gt p1000 OS 2.2和一些更便宜的设备WorldTe
- 如何使媒体播放器控件在所有设备中处于活动状态,而不会像某些设备中的媒体控制器那样由于抽象方法而崩溃 设备
- 如何调整视频表面视图的大小
/* Media Player Control is commented due to force close in some devices say *micromax,Creative ziio, akash etc */
public class VideoViewerActivity extends Activity implements
OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener,
OnVideoSizeChangedListener, SurfaceHolder.Callback {
// implements ERROR in some devices , MediaPlayerControl
private static final String TAG = "MediaPlayerDemo";
private int mVideoWidth;
private int mVideoHeight;
private MediaPlayer mMediaPlayer;
private SurfaceView mPreview;
private SurfaceHolder holder;
private String path = "";
private Bundle extras;
private static final String MEDIA = "media";
private static final int LOCAL_AUDIO = 1;
private static final int STREAM_AUDIO = 2;
private static final int RESOURCES_AUDIO = 3;
private static final int LOCAL_VIDEO = 4;
private static final int STREAM_VIDEO = 5;
private boolean mIsVideoSizeKnown = false;
private boolean mIsVideoReadyToBePlayed = false;
/* ERROR In Abstract method implementation in the other devices */
// private MediaController mediaController;
private Context context;
private final Handler handler = new Handler();
/**
*
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.video_layout);
context = this;
path = getIntent().getExtras().getString("media");
Log.v("arpit", "path " + path);
mPreview = (SurfaceView) findViewById(R.id.surfaceview1);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
extras = getIntent().getExtras();
}
private void playVideo() {
doCleanUp();
try {
// Create a new media player and set the listeners
File f = new File(path);
// FileInputStream in = new FileInputStream(f);
RandomAccessFile randomAccessFile = new RandomAccessFile(f, "r");
// randomAccessFile.skipBytes(1024);
FileDescriptor fileDescriptor = randomAccessFile.getFD();
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(fileDescriptor, Constant.key1.length
+ Data.deviceID.length(), f.length());
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.setScreenOnWhilePlaying(true);
// mediaController = new MediaController(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (Exception e) {
Log.e(TAG, "error: " + e.getMessage(), e);
Toast.makeText(context, "supported video was not found",
Toast.LENGTH_SHORT).show();
finish();
}
}
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;
}
mIsVideoSizeKnown = true;
mVideoWidth = width;
mVideoHeight = height;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
}
}
public void surfaceDestroyed(SurfaceHolder surfaceholder) {
Log.d(TAG, "surfaceDestroyed called");
}
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "surfaceCreated called");
playVideo();
}
private void doCleanUp() {
mVideoWidth = 0;
mVideoHeight = 0;
mIsVideoReadyToBePlayed = false;
mIsVideoSizeKnown = false;
}
private void startVideoPlayback() {
Log.v(TAG, "startVideoPlayback");
//also tried and used the below line but nothing good
// holder.setFixedSize(480, 800);
holder.setFixedSize(mVideoWidth, mVideoHeight);
mMediaPlayer.start();
}
}
嗨,arpit我也在使用你提到的播放视频文件的相同设备, 我在将控件应用于视频播放器时遇到了同样的问题(抽象方法不可用) 根据我在这个主题上的研发,我得出结论,定制的android操作系统和这些设备的硬件互不兼容,因为它们的质量与三星设备相比非常差, 虽然android操作系统中有很多方法,但这些设备不支持这些方法 所以我认为在这些设备中没有解决这些问题的方法 plz在开发任何项目时,都会尝试使用标准设备。这可能对你有很大帮助
谢谢。:) 我使用TextureView而不是surface view(它允许旋转视频),并在以下位置适当设置其设置比例{X | Y}():
@Override
public void onVideoSizeChanged(MediaPlayer mp, int w, int h) {
if (w > 0 && h > 0) {
RelativeLayout.LayoutParams l;
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
l = new RelativeLayout.LayoutParams(metrics.heightPixels, metrics.widthPixels);
l.addRule(RelativeLayout.CENTER_IN_PARENT, -1);
float scale = (metrics.heightPixels * 1.0f) / (metrics.widthPixels * 1.0f);
videoView.setScaleX(scale);
videoView.setLayoutParams(l);
Log.d(YourApp.TAG, "video size: " + mp.getVideoWidth() + "x" + mp.getVideoHeight() + " vertical scale: " + scale);
}
}
请注意,我已经旋转了我的视频,这就是我设置X的比例的原因。试试。这可能会对您有所帮助。