没有其他的。希望从事流媒体开发案例。还承诺提供朋友博客。上个星期。制定出最后一点机会。
在这里,与大家分享。
首先要明白的概念:什么是流媒体?转载请注明出处http://blog.csdn.net/gaoshouxiaodi/article/details/41259351
流媒体:所谓流媒体是指採用流式传输的方式在Internet播放的媒体格式。
流媒体又叫流式媒体,它是指商家用一个视频传送server把节目当成数据包发出,传送到网络上。用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显示出来。
常见的流媒体的格式:mov .asf .3gp .viv .swf .rt .rp .ra .rm。每一种格式都有各自的优缺点。大家能够依据实际情况须要来决定。
通俗上讲,通常实现流媒体的方法大致有三种。
一。讲音视频文件拆分成若干多个小文件。在播放时。逐个下载。然后播放。也叫伪流媒体。
二,将视频通过转换软件,在server端转换成流媒体格式文件。然后client进行播放。
三。在本地录制视频的过程中。
直接编解码为流媒体格式文件。(兴许的博客中我会单独讲这里)
而实际上,流媒体的实现原理,也就跟第一点类似,仅仅只是能够理解为,拆分的包很多其它,更小。而仍然是一个总体。它的网络传输,相同是若干多得包单通道或者多通道下发的。
我们熟知的安卓手机支持的视频格式并不多,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>
非常easy的一个现形布局界面,
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()
是否处于正在播放的状态。
实时证明。开源才是人类社会进步的阶梯。转载请注明出处。
对于流媒体编解码器。ffmpeg等待,下一次说起。
Android 之流媒体播放器,广播侧下方这么简单。的更多相关文章
-
EasyPlayer Android安卓流媒体播放器实现播放同步录像功能实现(附源码)
本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551,John是EasyPusher安卓直播推流.EasyPlayer直播流媒体播放端的开发和维护者 ...
-
EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
本文转自:http://blog.csdn.net/jyt0551/article/details/56942795 对于一个裸的RTSP URL,存放在播放列表上略显单调与枯燥.大家可以看到Easy ...
-
Android开发学习—— Broadcast广播接收者
现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息.Android中:系统在运行过程中,会产生许多事件,那么某些事件产生时,比如:电量改变.收发短信.拨打电话.屏 ...
-
Android四大组件之一“广播”
前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...
-
九、Android学习第八天——广播机制与WIFI网络操作(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...
-
Android 四大组件之三(广播)
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
-
android开发4:Android布局管理器1(线性布局,相对布局RelativeLayout-案例)
控件类概述 View 可视化控件的基类 属性名称 对应方法 描述 android:background setBackgroundResource(int) 设置背景 android:clickabl ...
-
Android应用程序发送广播(sendBroadcast)的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6744448 前面我们分析了Android应用程 ...
-
Android应用程序注册广播接收器(registerReceiver)的过程分析
前 面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息:而对 Android应用程序来说,订阅消息其实就是注册广播接收器, ...
随机推荐
-
第2月第1天 GCDAsyncSocket dispatch_source_set_event_handler
一.GCDAsyncSocket的核心就是dispatch_source_set_event_handler 1.accpet回调 accept4Source = dispatch_source_cr ...
-
PL/SQL使用技巧
1.如何在PL/SQL developer中查看所连接的oracle的版本答:select * from v$version;或者在pl/sql developer 里查看[Reports]——> ...
-
linux中授予普通用户root权限
本来也更改了/etc/passwd,改成0:0淡水其他地方又出问题,所以又改回来了. chown -R hxsyl .Spark_Relvant 当前在hadoop-2.6.4下,‘.’表示当前目录.
-
NetBIOS
NetBIOS是Network Basic Input/Output System的缩写,严格来说它不是一个网络协议,而是一套API,为局域网内应用程序通信提供会话层(OSI七层参考模型)的支持. N ...
-
如何查看LINUX 硬件配置信息
如何查看LINUX 硬件配置信息 在网上找了N久,发现了一篇不错的文档,转载一下: 1.查看机器所有硬件信息: dmidecode |more dmesg |more 这2个命令出来的信息都非常多,所 ...
-
Lotus Notes中编程发送邮件(二)
在编程发送各种类似通知的邮件时,时常会需要发件人显示为某个特定的帐户,比如某个部门的名称或者管理员的名字.另一种需求是,用户收到某封邮件后,回复邮件的地址不同于发件人栏显示的地址.而正常情况下,发送邮 ...
-
(二)CSS3应用 - 实现圆角
html <link href="test.css" type="text/css" rel="stylesheet" /> & ...
-
怎样查看修改sqlserver数据库的编码格式
原文地址:http://zhidao.baidu.com/question/107168202.html SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI ...
-
雷林鹏分享:jQuery EasyUI 数据网格 - 动态改变列
jQuery EasyUI 数据网格 - 动态改变列 数据网格(DataGrid)列可以使用 'columns' 属性简单地定义.如果您想动态地改变列,那根本没有问题.为了改变列,您可以重新调用dat ...
-
使用linux kernel代码编译perf工具
环境:Qemu + ARMv8 perf是一款综合性分析工具,大到系统全局性性能,再小到进程线程级别,甚至到函数及汇编级别. 在内核源码目录下执行编译脚本: #!/bin/bash cross_com ...