- 浏览: 263108 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
/**
* 网络视频播放
*
* 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;
}
}
发表评论
-
android多媒体学习笔记一
2012-09-04 10:47 7301 使用内置的camera应用程序捕获图像 /*** ... -
android多媒体学习笔记二
2012-09-04 10:53 821实现SurfaceHolder.Callback ,P ... -
android多媒体学习笔记三___图像合成
2012-09-05 11:36 631/** * 图像合成 * * @time 下午06:21 ... -
android多媒体部分学习笔记四___ Matrix
2012-09-05 11:40 736/*** 图像的缩放和旋转 Matrix** 1 0 0 x= ... -
android多媒体部分学习笔记五----audio
2012-09-08 16:08 726/*** 打开内置音乐播放器*/private void ge ... -
android多媒体部分学习笔记六----音频录制 mediaRecorder
2012-09-08 16:12 691/** * * 使用意图捕获音频 * * @time ... -
android多媒体部分学习笔记七------音频录制 mediaRecorder
2012-09-08 16:13 770/** * 自定义捕获音频 * * @time 下午12 ... -
android多媒体部分学习笔记八------音频录制 mediaRecorder
2012-09-08 16:14 788/** * 原始音频的播放和录制 * * audio ... -
android 多媒体部分学习笔记九----数字音频合成
2012-09-09 12:43 885/** * 数字音频合成 * * @time 下午12: ... -
android 多媒体部分学习笔记十 可视化频率(频谱)
2012-09-09 23:43 3245/** * 可视化频率 * * @time 下午12 ... -
android 多媒体部分学习笔记十--简单视频播放
2012-09-10 17:53 780/** * 简单播放 * * @time 下午05:15 ... -
android 多媒体部分学习笔记十二----mediaplay自定义播放器
2012-09-10 22:31 1717/** * * 自定义播放器 * * @time 下午 ... -
android 多媒体部分学习笔记十三----mediaStore 检索视频
2012-09-12 00:12 1039/** * mediaStore检索视频 * * @ti ... -
android 多媒体部分学习笔记十五-----视频录制
2012-09-12 15:02 789/** * 调用系统视频录制 * * @time 下午0 ...
相关推荐
总之,EasyPlayer-RTSP-Android-master为Android开发者提供了一种强大的流媒体播放解决方案,无论是在实时监控、在线教育还是其他多媒体应用中,都能发挥其高效稳定的优势。理解并掌握其工作原理和应用技巧,对于...
在Android平台上,开发人员经常需要处理视频播放任务,特别是实时流媒体服务如RTSP (Real-Time Streaming Protocol) 和RTMP (Real-Time Messaging Protocol)。IjkPlayer是一个强大的开源媒体播放器库,它由Bilibili...
在Android平台上进行多媒体处理时,有时需要利用开源的Gstreamer框架和gst-rtsp-server来...学习并实践这些教程,将有助于在Android平台上构建自己的Gstreamer和gst-rtsp-server应用,实现高效的多媒体流处理和分发。
【vlc-android播放rtsp视频流demo】是一款专为Android平台设计的应用示例,它演示了如何集成VLC库来播放RTSP(Real Time Streaming Protocol)视频流。VLC是一款广泛使用的开源媒体播放器,它支持多种媒体格式和流...
综上所述,`Android-RTSP-master`项目涉及了Android多媒体编程、RTSP协议、网络通信等多个方面,对于希望在Android平台上实现RTSP流媒体播放的开发者来说,这是一个极好的学习和参考实例。通过深入研究这个项目,...
在Android平台上实现RTSP(Real Time Streaming Protocol)在线视频播放是一项技术性较强的任务,涉及到多媒体处理、网络通信以及Android系统层面的API交互。本实例将深入探讨如何在Android应用中集成RTSP视频流的...
在Android开发中,有时我们需要实现一个功能,即在应用程序中播放远程实时流媒体视频,例如通过Rtsp协议。这个任务通常涉及到`VideoView`组件的使用,它提供了一个简单的接口来显示视频内容。本篇将详细介绍如何在...
本教程将深入探讨如何利用MediaCodec在Android上实现RTSP视频流的播放。 首先,理解RTSP协议至关重要。RTSP是一种应用层协议,用于控制多媒体数据的传输。它允许客户端向服务器请求实时数据流,如视频和音频,以便...
在Android平台上实现FFmpeg RTSP播放涉及多个技术层面,包括FFmpeg库的移植、Android多媒体框架的理解以及网络流媒体协议的处理。以下是对这个主题的详细解析: **FFmpeg库移植** FFmpeg是一个开源的多媒体处理框架...
【标题】:在Android平台上实现RTSP视频播放的源码解析 在移动设备上,尤其是Android系统中,实时流协议(Real-Time Streaming Protocol,简称RTSP)被广泛应用于视频流媒体服务,例如视频监控和直播。这个项目是...
【Android RTSP Player详解】...总的来说,"android-rtspplayer-master"项目为Android开发者提供了一个实践RTSP播放的实例,通过学习和研究,开发者不仅可以掌握RTSP协议的运用,还能深入了解Android多媒体框架的实现。
在Android平台上,RTSP(Real-Time Streaming Protocol)是一种广泛用于实时流媒体的协议,它允许设备从服务器获取音频、视频...通过深入研究DEMO代码,你可以掌握更多关于Android多媒体播放和RTSP协议的实际应用知识。
在Android平台上实现RTSP(Real-Time Streaming Protocol)实时播放是一项技术挑战,特别是对于追求低延迟的应用场景。RTSP是一种协议,常用于流媒体传输,它允许客户端控制服务器上的媒体流,实现播放、暂停、快进...
总之,这个"Android视频采集+RTSP完整代码(可用)"源码提供了从视频采集到RTSP流传输的完整实现,对于学习和开发相关应用非常有帮助。开发者在使用时应理解每个组件的作用,结合自己的需求进行适当的修改和扩展。
标题中的“H264-RTSP-Server-iOS实时视频流输出”指的是一个iOS应用项目,它能够捕获摄像头的视频数据,并将其编码为H.264格式,然后通过RTSP(Real Time Streaming Protocol)协议进行实时传输。这个项目可能是一个...
EasyPlayer-RTSP是一款专为Android平台设计的多媒体播放器,它具备丰富的功能,包括全屏播放、声音控制、视频截图以及视频录制等。这款应用的实现离不开几个关键的技术组件,如FFmpeg、JNI(Java Native Interface)...
在Android平台上,直播视频播放、流媒体IPCamera、RTSP(Real Time Streaming Protocol)和DLNA(Digital Living Network Alliance)是构建多媒体应用的关键技术。VLC是一款广泛应用的开源媒体播放器,它支持多种...
综上,VLC SDK在Android应用开发中提供了强大的多媒体处理能力,不仅可以播放RTSP流媒体,还能实现录屏和截图,极大地丰富了应用的功能。对于希望在应用中集成这些特性的开发者来说,VLC SDK是一个值得考虑的解决...
ijkplayer-android可录屏可播放RTSP格式是一个针对Android平台的开源媒体播放器项目,它基于FFmpeg库,由IJKProject团队开发。这个播放器不仅支持常见的多媒体格式,还特别强调了对RTSP(Real Time Streaming ...
vlcPlayer.AddOption("--rtsp-tcp"); vlcPlayer.AddOption(":network-caching=500"); // 调整缓冲时间 vlcPlayer.SetMedia(rtspUrl); vlcPlayer.Play(); } void Update() { if (Input.GetKeyDown(KeyCode....