I am creating a video recorder and would like to create video player to preview the recorded videos. Modifying the code from this page I have created a MediaPreview class the following way:
我正在创建一个录像机,我想创建一个视频播放器来预览录制的视频。修改本页的代码,我创建了MediaPreview类,方法如下:
public class MediaPreview extends Activity implements OnErrorListener,
OnBufferingUpdateListener,
OnCompletionListener, OnPreparedListener, SurfaceHolder.Callback{
private static final String TAG = "MediaPreview";
private MediaPlayer mp;
private SurfaceView mPreview;
private SurfaceHolder holder;
private Button btnPlay;
private Button btnPause;
private Button btnReset;
private Button btnStop;
private String mPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.media_preview);
mPreview = (SurfaceView)findViewById(R.id.mPreview);
btnPlay = (Button)findViewById(R.id.btnPlay);
btnPause = (Button)findViewById(R.id.btnPause);
btnReset = (Button)findViewById(R.id.btnReset);
btnStop = (Button)findViewById(R.id.btnStop);
getPathFromParentDialog();
btnPlay.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
playVideo();
}
});
btnPause.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(mp != null){
mp.pause();
}
}
});
btnReset.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(mp != null){
mp.seekTo(0);
}
}
});
btnStop.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(mp != null){
mp.stop();
mp.release();
}
}
});
getWindow().setFormat(PixelFormat.TRANSPARENT);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setFixedSize(400, 300);
}
@Override
protected void onResume() {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
super.onResume();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if(mp != null){
mp.stop();
mp.release();
}
return false;
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// TODO Auto-generated method stub
}
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
}
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
}
@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
}
private void playVideo() {
try{
mp = new MediaPlayer();
mp.setOnErrorListener(this);
mp.setOnBufferingUpdateListener(this);
mp.setOnCompletionListener(this);
mp.setOnPreparedListener(this);
mp.setAudioStreamType(2);
mp.setDisplay(mPreview.getHolder());
Runnable r = new Runnable(){
@Override
public void run() {
try{
setDataSource(mPath);
}
catch(Exception ex){
Log.e(TAG, ex.getMessage());
}
try {
mp.prepare();
Log.v(TAG, "Duration: ===> " + mp.getDuration());
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e(TAG, e.getMessage());
}
mp.start();
}
};
new Thread(r).start();
}
catch(Exception ex){
String sDummy = ex.toString();
if(mp != null){
mp.stop();
mp.release();
}
}
}
private void setDataSource(String path) throws IOException {
if(!URLUtil.isNetworkUrl(mPath)){
mp.setDataSource(mPath);
}
else{
URL url = new URL(mPath);
URLConnection cn = url.openConnection();
cn.connect();
InputStream stream = cn.getInputStream();
if(stream == null){
throw new RuntimeException("stream is null");
}
File fileTemp = File.createTempFile("mediaplayerTmp", "dat");
String tempPath = fileTemp.getAbsolutePath();
FileOutputStream out = new FileOutputStream(fileTemp);
byte buf[] = new byte[128];
do{
int numRead = stream.read(buf);
if(numRead <= 0){
break;
}
out.write(buf, 0, numRead);
}while(true);
mp.setDataSource(tempPath);
try{
stream.close();
}
catch(Exception ex){
String sDummy = ex.toString();
}
}
}
private void getPathFromParentDialog()
{
Intent intent = getIntent();
mPath = intent.getExtras().getString(MediaLibrary.FILENAME);
}
}
The code successfully executes (without any exceptions) until mp.start();
, but the screen is blank (there are only buttons on the screen).
代码成功执行(没有任何异常),直到mp.start();但是屏幕是空的(屏幕上只有按钮)。
Does anyone know what could be wrong in the code above or is there any example that works available on the web?
有没有人知道上面代码中可能出现的错误,或者在web上有可用的例子吗?
I would really appreciate your help
我非常感谢你的帮助。
2 个解决方案
#1
6
Off the cuff, I think you need some more logic in some of your callback methods, like surfaceCreated()
.
我认为您需要在一些回调方法中使用更多的逻辑,比如surfaceCreated()。
#2
6
You need to attach the surface to the played after the surface is created.
在创建表面之后,您需要将表面附加到播放表面。
call
调用
mp.setDisplay(mPreview.getHolder());
from inside
从内
public void surfaceCreated(SurfaceHolder holder)
#1
6
Off the cuff, I think you need some more logic in some of your callback methods, like surfaceCreated()
.
我认为您需要在一些回调方法中使用更多的逻辑,比如surfaceCreated()。
#2
6
You need to attach the surface to the played after the surface is created.
在创建表面之后,您需要将表面附加到播放表面。
call
调用
mp.setDisplay(mPreview.getHolder());
from inside
从内
public void surfaceCreated(SurfaceHolder holder)