SurfaceView播放视频时只有声音没有图片
如题;
代码如下:
videoplayer.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<SeekBar
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/skb_video"
/>
<SurfaceView
android:id="@+id/vdoplayer"
android:layout_width="wrap_content"
android:layout_height="200dp"
android:layout_gravity="center"
/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/vdoplayer"
android:id="@+id/videocontrol"
>
<Button
android:id="@+id/cmd_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="250dp"
android:layout_marginLeft="200dp"
android:text="@string/play"
/>
<Button
android:id="@+id/cmd_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="250dp"
android:layout_toRightOf="@id/cmd_play"
android:text="@string/pause"
/>
</LinearLayout>
</FrameLayout>
VideoPlayer.java
package www.lemon.mine;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.SeekBar;
public class VideoPlayer extends Activity implements Callback,OnClickListener{
/** Called when the activity is first created. */
private Button cmd_play =null;
private Button cmd_pause = null;
private Boolean isChanging = true;
private MediaPlayer mp =null;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Timer mTimer;
private TimerTask mTimerTask;
private LinearLayout ll = null;
private SeekBar skb_video = null;
private static final String tag = "mine";
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//隐藏状态栏
setContentView(R.layout.videoplayer);//设置布局
skb_video = (SeekBar)findViewById(R.id.skb_video);//进度条
cmd_play = (Button)findViewById(R.id.cmd_play);//播放按钮
cmd_play.setOnClickListener(this);
cmd_pause = (Button)findViewById(R.id.cmd_pause);//暂停按钮
cmd_pause.setOnClickListener(this);
Bundle bunde = this.getIntent().getExtras();
String videoPath = bunde.getString("filePath");//得到视频路径
mTimer = new Timer();//计时器
mTimerTask = new TimerTask() {
@Override
public void run() {
if(isChanging==true)
return;
if(mp.getVideoHeight()==0)
skb_video.setProgress(mp.getCurrentPosition());
}
};
mTimer.schedule(mTimerTask, 0, 10);
surfaceView = (SurfaceView)findViewById(R.id.vdoplayer);//得到播放view
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setFixedSize(176, 144);//确定大小
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mp = new MediaPlayer();//设置媒体播放器
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer arg0) {
mp.release();
}
});
playVideo(videoPath);//播放视频
skb_video.setMax(mp.getDuration());//设置SeekBar的长度
skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());
}
private void playVideo(String path){//播放视频
try {
mp.setDataSource(path);
mp.setDisplay(surfaceHolder);
mp.prepare();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (Exception e) {
e.printStackTrace();
}//读取视频
mp.start();
}
@Override
public void onClick(View v) {//点击按钮事件
if (v == cmd_play) {
mp.start();
} else if (v == cmd_pause) {
mp.pause();
}
}
protected void onDestroy() {
super.onDestroy();
if(mp.isPlaying()){
mp.stop();
}
mp.release();
}
class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{//进度条事件
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
isChanging=true;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mp.seekTo(seekBar.getProgress());
isChanging=false;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
[解决办法]
检查视频显示尺寸的设置。
[解决办法]
感觉可能是没设置好显示的范围,查查xml文件,Surface的layout什么的。试试xml里就指定为固定值。
不知道为什么一个用固定值一个用wrap_content。
- XML code
android:layout_width="wrap_content" android:layout_height="200dp"