首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

SurfaceView播放视频时只有声音没有图片解决方案

2012-05-06 
SurfaceView播放视频时只有声音没有图片如题;代码如下:videoplayer.xml?xml version1.0 encodingutf

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" 

热点排行