`

android 多媒体部分学习十四---网络视频播放(http/rtsp)

阅读更多

/**
* 网络视频播放
*
* openCore
*
* stagefright
*
* @time 下午05:15:41
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
@SuppressWarnings("unused")
public class StreamVideoActivity extends Activity implements //
SurfaceHolder.Callback, //
OnErrorListener,//
OnCompletionListener,//
OnInfoListener,//
OnPreparedListener,//
OnSeekCompleteListener, //
OnVideoSizeChangedListener, //
OnBufferingUpdateListener,//
MediaPlayerControl, OnTouchListener {//


SurfaceView surfaceView;
TextView txv_status;
LinearLayout main_view;


MediaPlayer mediaPlayer;
SurfaceHolder surfaceHolder;
Display currentDisplay;
MediaController controller;


int videoH = 0;
int videoW = 0;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stream_video);
findView();
init();
}


// rtsp://media2.tripsmarter.com/LiveTV/BTV/
// rtsp://202.38.64.28/broadcast/tvserver/encoder/tv1
// rtsp://v.starv.tv/later.3gp


/**
* 初始化方法
*
*/
private void init() {
String filePath = " rtsp://v.starv.tv/later.3gp";
// String filePath = Environment.getExternalStorageDirectory().getPath()
// + "/kiss.mp4";
try {
mediaPlayer.setDataSource(filePath);
} catch (IllegalArgumentException e) {
e.printStackTrace();
Log.i("tag", "" + e.getMessage());
finish();
} catch (IllegalStateException e) {
e.printStackTrace();
Log.i("tag", "" + e.getMessage());
finish();
} catch (IOException e) {
e.printStackTrace();
Log.i("tag", "" + e.getMessage());
finish();
}
txv_status.setText("MediaPlayer Set Datasource!");
currentDisplay = getWindowManager().getDefaultDisplay();
controller = new MediaController(this);
}


/**
* 实例化控件
*/
private void findView() {
main_view = (LinearLayout) this.findViewById(R.id.lay_mview);
main_view.setOnTouchListener(this);
txv_status = (TextView) this.findViewById(R.id.txt_video_status);
surfaceView = (SurfaceView) this.findViewById(R.id.sfv_stream_view);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


mediaPlayer = new MediaPlayer();
txv_status.setText("MediaPlayer is created!");


mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnInfoListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnSeekCompleteListener(this);
mediaPlayer.setOnVideoSizeChangedListener(this);
mediaPlayer.setOnBufferingUpdateListener(this);
}


/********************************************/
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i("tag", "===surfaceCreated()===");
mediaPlayer.setDisplay(surfaceHolder);
try {
// TODO
mediaPlayer.prepareAsync();
} catch (IllegalStateException e) {
Log.i("tag", "mediaplay prepare: " + e.getMessage());
e.printStackTrace();
finish();
}
txv_status.setText("MediaPlayer Preparing");
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.i("tag", "===surfaceChanged()===");
}


@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i("tag", "===surfaceDestroyed()===");
}


/******************************************************************/
@Override
public void onCompletion(MediaPlayer mp) {
Log.i("tag", "===onCompletion()===");
txv_status.setText("MediaPlayer playback completed");


}


@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
txv_status.setText("MediaPlayer Error!");
Log.i("tag", "===onError()===");
if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) {
Log.i("tag", "Media Error,Server Died! " + extra);
} else if (what == MediaPlayer.MEDIA_ERROR_UNKNOWN) {
Log.i("tag", "Media Error, Unknow Error! " + extra);
}
return false;
}


@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
txv_status.setText("MediaPlayer onInfo!");
if (what == MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING) {
Log.i("tag", "Media info,Media info bad interleaveing " + extra);
} else if (what == MediaPlayer.MEDIA_INFO_METADATA_UPDATE) {
Log.i("tag", "Media info,Media info metadata update " + extra);
} else if (what == MediaPlayer.MEDIA_INFO_NOT_SEEKABLE) {
Log.i("tag", "Media info,Media info not_seekable " + extra);
} else if (what == MediaPlayer.MEDIA_INFO_UNKNOWN) {
Log.i("tag", "Media info,Media info unknown " + extra);
} else if (what == MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING) {
Log.i("tag", "Media info,Media info video track lagging " + extra);
}
return false;


}


@Override
public void onPrepared(MediaPlayer mp) {
Log.i("tag", "===onPrepared()===");
txv_status.setText("MediaPlayer prepared !");
// 取得播放器大小
videoH = mp.getVideoHeight();
videoW = mp.getVideoWidth();


if (videoH > currentDisplay.getHeight() || videoW > currentDisplay.getWidth()) {
// 缩放
float ratioH = (float) videoH / (float) currentDisplay.getHeight();
float ratioW = (float) videoW / (float) currentDisplay.getWidth();


if (ratioH > 1 || ratioW > 1) {
if (ratioH > ratioW) {
videoH = (int) Math.ceil((float) videoH / (float) ratioH);
videoW = (int) Math.ceil((float) videoW / (float) ratioH);


} else {
videoH = (int) Math.ceil((float) videoH / (float) ratioW);
videoW = (int) Math.ceil((float) videoW / (float) ratioW);


}
}
}
surfaceView.setLayoutParams(new LinearLayout.LayoutParams(videoW, videoH));
controller.setMediaPlayer(this);
controller.setAnchorView(main_view);
controller.setEnabled(true);
controller.show();


mp.start();
txv_status.setText("MediaPlayer started !");
}


@Override
public void onSeekComplete(MediaPlayer mp) {
Log.i("tag", "===onSeekComplete()===");
}


@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
Log.i("tag", "===onVideoSizeChanged()===");
// 取得播放器大小
videoH = mp.getVideoHeight();
videoW = mp.getVideoWidth();


if (videoH > currentDisplay.getHeight() || videoW > currentDisplay.getWidth()) {
// 缩放
float ratioH = (float) videoH / (float) currentDisplay.getHeight();
float ratioW = (float) videoW / (float) currentDisplay.getWidth();


if (ratioH > 1 || ratioW > 1) {
if (ratioH > ratioW) {
videoH = (int) Math.ceil((float) videoH / (float) ratioH);
videoW = (int) Math.ceil((float) videoW / (float) ratioH);


} else {
videoH = (int) Math.ceil((float) videoH / (float) ratioW);
videoW = (int) Math.ceil((float) videoW / (float) ratioW);


}
}
}
surfaceView.setLayoutParams(new LinearLayout.LayoutParams(videoW, videoH));


}


@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
txv_status.setText("MediaPlayer buffering: " + percent + "%");
Log.i("tag", "MediaPlayer buffering: " + percent + "%");
}


/****************************************************/
@Override
public void start() {
mediaPlayer.start();
}


@Override
public void pause() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}


@Override
public int getDuration() {
return mediaPlayer.getDuration();
}


@Override
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}


@Override
public void seekTo(int pos) {
mediaPlayer.seekTo(pos);
}


@Override
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}


@Override
public int getBufferPercentage() {
return 0;
}


@Override
public boolean canPause() {
return true;
}


@Override
public boolean canSeekBackward() {
return true;
}


@Override
public boolean canSeekForward() {
return true;
}


@Override
public boolean onTouch(View v, MotionEvent event) {
if (controller.isShowing()) {
controller.hide();
} else {
controller.show();
}


return false;

}

}

 

分享到:
评论

相关推荐

    EasyPlayer-RTSP-Android-master.zip

    总之,EasyPlayer-RTSP-Android-master为Android开发者提供了一种强大的流媒体播放解决方案,无论是在实时监控、在线教育还是其他多媒体应用中,都能发挥其高效稳定的优势。理解并掌握其工作原理和应用技巧,对于...

    Android IjkPlayer 播放RTSP/RTMP视频流 Demo 可运行

    在Android平台上,开发人员经常需要处理视频播放任务,特别是实时流媒体服务如RTSP (Real-Time Streaming Protocol) 和RTMP (Real-Time Messaging Protocol)。IjkPlayer是一个强大的开源媒体播放器库,它由Bilibili...

    移植Gstreamer 和gst-rtsp-server到Android实例

    在Android平台上进行多媒体处理时,有时需要利用开源的Gstreamer框架和gst-rtsp-server来...学习并实践这些教程,将有助于在Android平台上构建自己的Gstreamer和gst-rtsp-server应用,实现高效的多媒体流处理和分发。

    vlc-android播放rtsp视频流demo

    【vlc-android播放rtsp视频流demo】是一款专为Android平台设计的应用示例,它演示了如何集成VLC库来播放RTSP(Real Time Streaming Protocol)视频流。VLC是一款广泛使用的开源媒体播放器,它支持多种媒体格式和流...

    Android-RTSP-master播放rtsp源码

    综上所述,`Android-RTSP-master`项目涉及了Android多媒体编程、RTSP协议、网络通信等多个方面,对于希望在Android平台上实现RTSP流媒体播放的开发者来说,这是一个极好的学习和参考实例。通过深入研究这个项目,...

    android rtsp在线视频播放实例

    在Android平台上实现RTSP(Real Time Streaming Protocol)在线视频播放是一项技术性较强的任务,涉及到多媒体处理、网络通信以及Android系统层面的API交互。本实例将深入探讨如何在Android应用中集成RTSP视频流的...

    Android 使用videoview播放Rtsp视频 demo

    在Android开发中,有时我们需要实现一个功能,即在应用程序中播放远程实时流媒体视频,例如通过Rtsp协议。这个任务通常涉及到`VideoView`组件的使用,它提供了一个简单的接口来显示视频内容。本篇将详细介绍如何在...

    android ffmpeg rtsp播放

    在Android平台上实现FFmpeg RTSP播放涉及多个技术层面,包括FFmpeg库的移植、Android多媒体框架的理解以及网络流媒体协议的处理。以下是对这个主题的详细解析: **FFmpeg库移植** FFmpeg是一个开源的多媒体处理框架...

    ANDROID源码-RTSP视频播放

    【标题】:在Android平台上实现RTSP视频播放的源码解析 在移动设备上,尤其是Android系统中,实时流协议(Real-Time Streaming Protocol,简称RTSP)被广泛应用于视频流媒体服务,例如视频监控和直播。这个项目是...

    用Android的 Media Codec播放RTSP视频流.rar

    本教程将深入探讨如何利用MediaCodec在Android上实现RTSP视频流的播放。 首先,理解RTSP协议至关重要。RTSP是一种应用层协议,用于控制多媒体数据的传输。它允许客户端向服务器请求实时数据流,如视频和音频,以便...

    android-rtspplayer-master

    【Android RTSP Player详解】...总的来说,"android-rtspplayer-master"项目为Android开发者提供了一个实践RTSP播放的实例,通过学习和研究,开发者不仅可以掌握RTSP协议的运用,还能深入了解Android多媒体框架的实现。

    android rtsp播放DEMO

    在Android平台上,RTSP(Real-Time Streaming Protocol)是一种广泛用于实时流媒体的协议,它允许设备从服务器获取音频、视频...通过深入研究DEMO代码,你可以掌握更多关于Android多媒体播放和RTSP协议的实际应用知识。

    android Rtsp实时播放 低延时

    在Android平台上实现RTSP(Real-Time Streaming Protocol)实时播放是一项技术挑战,特别是对于追求低延迟的应用场景。RTSP是一种协议,常用于流媒体传输,它允许客户端控制服务器上的媒体流,实现播放、暂停、快进...

    Android视频采集+RTSP完整代码(可用)

    总之,这个"Android视频采集+RTSP完整代码(可用)"源码提供了从视频采集到RTSP流传输的完整实现,对于学习和开发相关应用非常有帮助。开发者在使用时应理解每个组件的作用,结合自己的需求进行适当的修改和扩展。

    H264-RTSP-Server-iOS实时视频流输出

    标题中的“H264-RTSP-Server-iOS实时视频流输出”指的是一个iOS应用项目,它能够捕获摄像头的视频数据,并将其编码为H.264格式,然后通过RTSP(Real Time Streaming Protocol)协议进行实时传输。这个项目可能是一个...

    EasyPlayer-RTSP

    EasyPlayer-RTSP是一款专为Android平台设计的多媒体播放器,它具备丰富的功能,包括全屏播放、声音控制、视频截图以及视频录制等。这款应用的实现离不开几个关键的技术组件,如FFmpeg、JNI(Java Native Interface)...

    安卓直播视频播放流媒体IPCameraRTSPDLNA相关-vlc-android精简源码截图和录制视频功能rtsp.rar

    在Android平台上,直播视频播放、流媒体IPCamera、RTSP(Real Time Streaming Protocol)和DLNA(Digital Living Network Alliance)是构建多媒体应用的关键技术。VLC是一款广泛应用的开源媒体播放器,它支持多种...

    android VLC可实现rtsp播放 录屏 截图等功能

    综上,VLC SDK在Android应用开发中提供了强大的多媒体处理能力,不仅可以播放RTSP流媒体,还能实现录屏和截图,极大地丰富了应用的功能。对于希望在应用中集成这些特性的开发者来说,VLC SDK是一个值得考虑的解决...

    unity3d播放rtsp视频

    vlcPlayer.AddOption("--rtsp-tcp"); vlcPlayer.AddOption(":network-caching=500"); // 调整缓冲时间 vlcPlayer.SetMedia(rtspUrl); vlcPlayer.Play(); } void Update() { if (Input.GetKeyDown(KeyCode....

    IJKPlayer Android 可录屏 可播放RTSP格式

    ijkplayer-android可录屏可播放RTSP格式是一个针对Android平台的开源媒体播放器项目,它基于FFmpeg库,由IJKProject团队开发。这个播放器不仅支持常见的多媒体格式,还特别强调了对RTSP(Real Time Streaming ...

Global site tag (gtag.js) - Google Analytics