首先要明确的概念:什么是流媒体?转载请注明出处http://blog.csdn.net/gaoshouxiaodi/article/details/41259351
流媒体:所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式。 流媒体又叫流式媒体,它是指商家用一个视频传送服务器把节目当成数据包发出,传送到网络上。用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显示出来。
常见的流媒体的格式:mov .asf .3gp .viv .swf .rt .rp .ra .rm,每一种格式都有各自的优缺点。大家可以根据实际情况需要来决定。
通俗上讲,通常实现流媒体的方法大致有三种。
一,讲音视频文件拆分成若干多个小文件,在播放时,逐个下载,然后播放。也叫伪流媒体。
二,将视频通过转换软件,在服务器端转换成流媒体格式文件,然后客户端进行播放。
三,在本地录制视频的过程中。直接编解码为流媒体格式文件。(后续的博客中我会单独讲这里)
而实际上,流媒体的实现原理,也就跟第一点类似,只不过可以理解为,拆分的包更多,更小,而仍然是一个整体。它的网络传输,同样是若干多得包单通道或者多通道下发的。
我们熟知的安卓手机支持的视频格式并不多,3GP,mp4等。可针对广大需求来讲,这点支持确实少的可怜。那如果想在Android手机上播放其他格式的怎么办,这就涉及到视频的编解码。视频解码,分为软解码和硬解码。可惜两种我都不会。暂时也不想会。还好,有那么一批人,他们无私奉献,在他们的字典里,他们的时间就是我们的时间,他们的金钱就是我们的金钱,他们的媳妇。。。哼。。他们叫做开源。
我在网上找到了一个很好的开源项目,vitamio 。这么好的东西,我之前竟然不知道。于是我开始下载他们的sdk,Demo,开发文档等有用的东东。。可惜,,没看懂。。给我的感觉是他们提供的东西杂乱无章,可又确实是好东西,怎么办,耐着性子,搞!
https://www.vitamio.org/docs/Tutorial/2014/0210/29.html粘上他们的介绍链接。感兴趣的朋友可以看一下。
据不完全统计,vitamio框架支持不下百种视频格式。
下面介绍下简单播放实现:
首先是界面:
<p> </p> <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <io.vov.vitamio.widget.CenterLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <io.vov.vitamio.widget.VideoView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </io.vov.vitamio.widget.CenterLayout> </LinearLayout>很简单的一个现形布局界面,
io.vov.vitamio.widget.VideoView是它的自定义视频展示控件。
然后是activity的实现:
public class VideoViewDemo extends Activity { /** * TODO: Set the path variable to a streaming video URL or a local media file * path. */ //视频路径 private String path = ""; private VideoView mVideoView; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); //对vitamio框架进行初始化。返回值用来做相关操作,通常没有要作的事情,初始化一定要在显示界面之前。 if (!LibsChecker.checkVitamioLibs(this)) return; //显示界面 setContentView(R.layout.videoview); //初始化组件 mVideoView = (VideoView) findViewById(R.id.surface_view); //设置的两个网络流媒体地址,大家可以直接进行测试。 // path = "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"; path = "http://www.modrails.com/videos/passenger_nginx.mov"; if (path == "") { // Tell the user to provide a media file URL/path. Toast.makeText(VideoViewDemo.this, "Please edit VideoViewDemo Activity, and set path" + " variable to your media file URL/path", Toast.LENGTH_LONG).show(); return; } else { /* * 也可以用这个方法来播放流媒体 * mVideoView.setVideoURI(Uri.parse(URLstring)); */ //设置videoview播放的路径 mVideoView.setVideoPath(path); //创建视频播放时的控制器,这个控制器可以自定义。此处是默认的实现 mVideoView.setMediaController(new MediaController(this)); //请求焦点 mVideoView.requestFocus(); //设置播放监听 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { // optional need Vitamio 4.0 //设置重放速度 mediaPlayer.setPlaybackSpeed(1.0f); } }); //加载结束后开始播放,这行代码可以控制视频的播放。 mVideoView.start(); } } }在使用之前,需要看一下VideoView类里的方法:
类概述
public class VideoView extends SurfaceView implements MediaController.MediaPlayerControl
用于播放视频文件。VideoView可以加载各种来源的图像(如资源或ContentProvider),注意计算视频尺寸,以便在任意布局管理器中使用,它还提供了诸如缩放等显示选项。
VideoView也提供封装了许多MediaPlayer的方法,例如getVideoWidth、setSubShown。
常量
public static final int VIDEO_LAYOUT_ORIGIN
缩放参数,原始画面大小。
常量值:0
public static final int VIDEO_LAYOUT_SCALE
缩放参数,画面全屏。
常量值:1
public static final int VIDEO_LAYOUT_STRETCH
缩放参数,画面拉伸。
常量值:2
public static final int VIDEO_LAYOUT_ZOOM
缩放参数,画面裁剪。
常量值:3
公共方法
public void setVideoLayout(int layout, float aspectRatio)
获取扫描视频的Uri。
参数
layout 缩放参数
aspectRation 宽高比,为0将自动检测。
public boolean isValid()
Surface是否有效。 参见Surface的isValid方法。
public void setVideoPath(String path)
设置视频路径。
public void setVideoURI(Uri uri)
设置视频URI。(可以是网络视频地址)
public void stopPlayback()
停止视频播放,并释放资源。
public void setMediaController(MediaController controller)
设置媒体控制器。
参数
controller 媒体控制器,注意是io.vov.vitamio.widget.MediaController。
public void setOnPreparedListener(OnPreparedListener l)
注册一个回调函数,在视频预处理完成后调用。在视频预处理完成后被调用。此时视频的宽度、高度、宽高比信息已经获取到,此时可调用seekTo让视频从指定位置开始播放。
public void setOnCompletionListener(OnCompletionListener l)
注册一个回调函数,视频播放完成后调用。
public void setOnErrorListener(OnErrorListener l)
注册一个回调函数,在异步操作调用过程中发生错误时调用。例如视频打开失败。
public void setOnBufferingUpdateListener(OnBufferingUpdateListener l)
注册一个回调函数,在网络视频流缓冲变化时调用。
public void setOnSeekCompleteListener(OnSeekCompleteListener l)
注册一个回调函数,在seek操作完成后调用。
public void setOnSubtitleUpdateListener(OnSubtitleUpdateListener l)
注册一个回调函数,在字幕需要显示时调用。
public void setOnInfoListener(OnInfoListener l)
注册一个回调函数,在有警告或错误信息时调用。例如:开始缓冲、缓冲结束、下载速度变化。
public boolean onTouchEvent(MotionEvent ev)
处理显示/隐藏MediaController。
public void start()
开始播放。
public void pause()
暂停播放。
public void suspend()
挂起(暂时没有实现功能)
public void resume()
恢复播放。
public long getDuration()
获取视频播放时长。
public long getCurrentPosition()
获取当前播放位置。
public void seekTo(long msec)
设置播放位置。
参数
msec 位置
public boolean isPlaying()
是否正在播放。
public int getBufferPercentage()
获取缓冲百分比。
public void setVolume(float leftVolume, float rightVolume)
设置音量。
参数
leftVolume 左声道
rightVolume 右声道
public int getVideoWidth()
获取视频宽度。
public int getVideoHeight()
获取视频高度。
public float getVideoAspectRatio()
设置视频宽高比例。没有视频或者宽高不正确返回0。
public void setVideoQuality(int quality)
设置视频质量。
参数
quality 参见MediaPlayer的常量:VIDEOQUALITY_LOW(流畅)、VIDEOQUALITY_MEDIUM(普通)、VIDEOQUALITY_HIGH(高质)。
public void setBufferSize(int bufSize)
设置视频缓冲大小(默认1024KB)单位Byte。
public boolean isBuffering()
检测是否缓冲完毕。
public void setMetaEncoding(String encoding)
设置元数据编码。例如:UTF-8
public String getMetaEncoding()
获取元数据编码。
public HashMap getAudioTrackMap(String encoding)
获取视频中嵌入的音轨。例如:English
public int getAudioTrack()
设置播放音轨编号。
public void setAudioTrack(int audioIndex)
设置音轨编号,必须使用getAudioTrackMap的返回值。
public void setSubShown(boolean shown)
设置是否显示字幕。
参数
shown true表示显示字幕
public void setSubEncoding(String encoding)
设置字幕编码。
参数
encoding 字幕编码。如果为null将自动检测。
public int getSubLocation()
获取字幕位置类型。0为内嵌字幕,1为外挂字幕。
public void setSubPath(String subPath)
设置外挂字幕路径。必须是本地文件路径。
public String getSubPath()
获取外挂字幕路径。
public void setSubTrack(int trackId)
设置字幕编号。必须是getSubTrackMap的返回值。
public int getSubTrack()
获取字幕编号。
public HashMap getSubTrackMap(String encoding)
获取视频内嵌字幕集合。
参数
encoding 格式化字符串编码。如果为null将自动检测。
返回值
返回字幕名称和字幕编号组成的Map。
public boolean canPause()
是否可暂停。(暂时没有实现功能)
public boolean canSeekBackward()
(暂时没有实现功能)
public boolean canSeekForward()
(暂时没有实现功能)
受保护方法
protected boolean isInPlaybackState()
是否处于正在播放的状态。
实时证明,开源才是人类社会进步的阶梯。转载请注明出处。
vitamio库下载地址
针对流媒体编解码,ffmpeg等,下回在讲。