- 浏览: 249316 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (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 6961 使用内置的camera应用程序捕获图像 /*** ... -
android多媒体学习笔记二
2012-09-04 10:53 778实现SurfaceHolder.Callback ,P ... -
android多媒体学习笔记三___图像合成
2012-09-05 11:36 594/** * 图像合成 * * @time 下午06:21 ... -
android多媒体部分学习笔记四___ Matrix
2012-09-05 11:40 688/*** 图像的缩放和旋转 Matrix** 1 0 0 x= ... -
android多媒体部分学习笔记五----audio
2012-09-08 16:08 682/*** 打开内置音乐播放器*/private void ge ... -
android多媒体部分学习笔记六----音频录制 mediaRecorder
2012-09-08 16:12 637/** * * 使用意图捕获音频 * * @time ... -
android多媒体部分学习笔记七------音频录制 mediaRecorder
2012-09-08 16:13 718/** * 自定义捕获音频 * * @time 下午12 ... -
android多媒体部分学习笔记八------音频录制 mediaRecorder
2012-09-08 16:14 733/** * 原始音频的播放和录制 * * audio ... -
android 多媒体部分学习笔记九----数字音频合成
2012-09-09 12:43 802/** * 数字音频合成 * * @time 下午12: ... -
android 多媒体部分学习笔记十 可视化频率(频谱)
2012-09-09 23:43 3180/** * 可视化频率 * * @time 下午12 ... -
android 多媒体部分学习笔记十--简单视频播放
2012-09-10 17:53 725/** * 简单播放 * * @time 下午05:15 ... -
android 多媒体部分学习笔记十二----mediaplay自定义播放器
2012-09-10 22:31 1605/** * * 自定义播放器 * * @time 下午 ... -
android 多媒体部分学习笔记十三----mediaStore 检索视频
2012-09-12 00:12 982/** * mediaStore检索视频 * * @ti ... -
android 多媒体部分学习笔记十五-----视频录制
2012-09-12 15:02 715/** * 调用系统视频录制 * * @time 下午0 ...
相关推荐
非常好的Android RTSP播放器源码,可供Android多媒体开发的网友们参考学习,这个源码是可以正常运行的!
Vitamio 是一款 Android ...Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 上支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播
源码 android端基于FFmpeg库的使用。添加编译ffmpeg、shine、mp3lame、x264源码的参考脚本 目前音视频相关处理: 音频剪切、拼接 音频混音 音频转码 音视频合成 音频抽取 音频解码播放 音频编码 视频抽取 视频剪切 ...
这个是我在华为进行培训自己写的ppt,欢迎下载.
linux, windows, android, ios. * 适用于物联网,嵌入式,以及网络服务开发等场景 ![struct](https://github.com/gozfree/gear- lib/blob/master/gear-lib.png) 该基础库包含以下库: ## 数据结构 | | | |--|--| |...
Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 上支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。 支持 ARMv6 和 ARMv7 ...
音频剪切、拼接音频混音音频转码音视频合成音频抽取音频解码播放音频编码...播放FFmpeg的AVFilter滤镜使用mp3lame库进行mp3转码视频拖动实时预览moov往前移动ffprobe检测多媒体格式IjkPlayer的RTSP超低延时直播Usage...
拥有强大的多媒体播放引擎+搜索引擎,支持先锋链接xfplay://及多种流媒体、直播、点播协议。 运行于Android系统的万能多媒体播放器。 万能播放 具有超强的多格式支持和解码能力,全面支持目前流行的所有影音格式 ...
能够流畅播放720P至1080P高清MKV,FLV,MP4,TS,H264等常见格式的视频,可以在Windows,Android与IOS上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8)等常见的多种视频流媒体协议,满足点播与直播的需求。 有了libHnPlayer...
网络流媒体: VLC具有流媒体播放功能,可以直接播放来自网络的音频和视频流,包括HTTP、RTSP、MMS等协议。 1.4 支持字幕和多音轨 字幕: VLC支持多种字幕格式,用户可以轻松加载和调整字幕。 多音轨: 对于包含多个...
270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,直接添加控件为封面,列表全屏动画,视频加载速度,列表小窗口支持拖动,动画效果,调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,其他一些...
Freemake Video Converter 是一款功能强大的免费视频转换软件,支持众多的视音频、DVD 及图片格式,基本输出格式包括 AVI、MP4、WMV、MKV、3GP、DVD、Blu-ray、MP3 及 iPod、iPhone、iPad、Android 等设备格式。...
音视频同步、流畅播放; 支持标清、高清; 基于HTTP的HLS传输协议,可穿透防火墙或者代理服务器; 视频H264,音频MP3,码流可按需设置; 可设置HLS分片间隔和分片数量,以达到最佳的接收效果(延迟、兼容性等)
270之类),重力旋转与手动旋转的同步支持,支持列表播放 ,直接添加控件为封面,列表全屏动画,视频加载速度,列表小窗口支持拖动,动画效果,调整比例,多分辨率切换,支持切换播放器,进度条小窗口预览,其他一些...
所有内容均以POSIX C编写,旨在在Linux,Windows,Android,iOS上使用兼容。 旨在重用于物联网,嵌入式和网络服务开发 数据结构 libdict:哈希键值字典库 libhash:基于内核中的hlist的哈希键值库 libringbuffer:...
AOKU AMS流媒体直播服务系统是北京北极星通信息技术有限公司研发的一套基于IP网络的音视频应用平台,采用模块化,跨平台的架构设计,采用自主研发的高性能 流媒体服务引擎,支持多种主流流媒体协议(RTP、 RTMP等)...
采用TMS320DM365多媒体处理器设计并实现了一种集音视频采集、编码、压缩、本地存储、RTP/RTCP, RTSP传输的嵌入式前端服务器。该监控系统在PC或者Android系统的PDA上实时接收并播放音视频流,实现了音视频实时监控;...