读书人

SurfaceView播放视频时只有声音没有图

发布时间: 2012-05-06 16:15:43 作者: rapoo

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" 

读书人网 >Android

热点推荐