1. android vitamio使用不能访问mms流媒体协议
没用过vitamio,姑且说下我的看法。你要觉得靠谱就试试,不靠谱就一笑置之好了
看Log显示是从http请求的头文件中读取数据时出的错
如果你有Chrome浏览器(其他浏览器有些也可以,但我不熟悉),就打开开发者工具,输入你要播放的视频的url,跳转。如果在浏览器中能正常播放,就记下你http请求的头文件信息,如下图红圈中的内容
然后检查vitamio中有没有setHttpHeader或setUserAgent之类的方法,把你记下的信息放进去,伪造一个http头文件再试验看看能不能在android上播放
2. 手机端ios和android浏览器 如何实现mms广播电台在线音频播放
从软件的功能角度来讲,Mms分为对话列表,消息列表,短信编辑,彩信编辑,短信显示,彩信显示和配置。
从实现的角度来看,它分为GUI展示层,发送/接收,彩信解析,彩信附件,信息数据等,这些分类对应着源码中的各种包。
源码导航
Mms的源码的位置在于android/packages/apps/Mms
其中Mms/src/com/android/mms里面都是Mms相关的代码,而Mms/src/org/w3c/dom里面是一个类库,主要用于彩信格式的解析和显示。这里主要讲一下Mms/src/com/android/mms下面的一些包和类的主要用途。
ui---GUI展示层,用于展示对话列表,消息列表,消息编辑页,彩信附件编辑,彩信展示,播放幻灯片。负责直接与用户交互。
•ConversationListAdapter.java---对话列表的Adapter用于给显示层ConversationList绑定数据。
•ConversationListItemData.java---代表对话列表中的每一项的数据结构,里面含有要在对话列表中展示的信息。
•ConversationList.java------这是对话列表的显示窗口Activity,它是一个ListActivity,这几个类都是对话列表的相关类,用于显示,编辑和管理所有的对话。
•ComposeMessageActivity.java----这个是核心的窗口Activity,编辑信息,显示一条对话Thread中的所有往来信息。MessageListView会加在其上面,另外,AttachmentEditor也会加在其上面。这个Activity也负责响应外部应用程序,发送SENDTO或SEND等请求Intent,比如外部应用想要发送信息,等就由这个Activity来响应。
•MessageItem.java---代表一个信息的抽象数据,它包含了信息相关的所有内容,比如信息的主题,消息内容,来信地址,附件内容等等。它的所有数据都是公共的内部成员,都可以直接访问。
•MessageListAdapter.java---用于给消息列表显示层(由ComposeMessageActivity创建,绑定到MessageListView上)绑定数据。
•MessageListView.java---用于显示消息列表,继承自ListView,其生命周期由ComposeMessageActivity来控制,显示与否也由它来控制。
•MessageListItem.java---是一个布局,用于显示和控制消息列表中的每一个消息的显示。
•AttachmentTypeSelectorAdapter.java---用于添加附件件时的一个支持的附件列表,它就是一个菜单。
•AttachmentEditor.java---用于在编辑MMS彩信信息时,显示已添加的附件,它的生命周期由ComposeMessageActivity来控制,显示与否也是由ComposeMessageActivity来控制,当有彩信附件时,它就会显示,否则就被Hide。它是一个布局管理器,管理着下面四个布局,根据附件的类型动态的显示下面四个View中的某一个。
•AudioAttachmentView.java---在编辑信息器中用于显示音频附件,它是继承自线性布局。并不在代码中直接使用,而是在布局文件中来当成布局管理器使用。
•ImageAttachmentView.java---在编辑信息器中用于显示图片附件,它是继承自线性布局。并不在代码中直接使用,而是在布局文件中来当成布局管理器使用。
•SlideshowAttachmentView.java---在编辑信息器中用于显示幻灯片附件,它是继承自线性布局。并不在代码中直接使用,而是在布局文件中来当成布局管理器使用。
•VideoAttachmentView.java---在编辑信息器中用于显示视频附件,它是继承自线性布局。并不在代码中直接使用,而是在布局文件中来当成布局管理器使用。
•SlideshowActivity.java—用来全屏播放幻灯片,也即幻灯片的展示,因为彩信的创建和播放都是以幻灯片的方式进行的,也即一张一张的,每张上面可以文字,图片,视频和音频,每一张有浏览时长。
•SlideshowEditActivity.java---以列表方式管理幻灯片,也即是把所有的幻灯片用列表显示出来,用户可添加一页幻灯片,也可以点击进入编辑某页幻灯片,用于创建和编辑幻灯片。
•SlideshowEditor.java---用于编辑某页幻灯片,比如添加元素,删除元素和替换元素,这里的元素可以是图片,视频,音频和文字。也可以用于编辑整页幻灯片,比如删除某页幻灯片,调整这页幻灯片在所有幻灯片中的位置等。它是一个具体操作幻灯片的封装,SlideEditorActivity创建它并使用它来完成纪灯片的编辑。
•SlideshowPresenter.java---用于展示所有的幻灯片,也就是播放所有的幻灯片。由SlideshowActivity来创建和使用。
•SlideViewInterface.java---定义了一些用于显示一页幻灯片中的内容的接口,如设置图像,设置视频,设置音频,播放视频,播放音频,暂停,随机定位等等。附件显示的View:AudioAttachmentView,ImageAttachmentView,SlideshowAttachmentView和VideoAttachmentView均实现了此接口,这样AttachmentEditor就可以用统一的接口来控制内容的播放,而不用关心具体的内容是什么。
•SlideEditorActivity.java---用于编辑某页幻灯片,比如添加音频,添加视频,添加图像,添加文字等。它只是提供用户界面,让用户来操作各种按扭以达到添加元素,替换元素或是删除元素。而对具体的幻灯片的操作是通过SlideshowEditor来完成的,它主要负责与用户交互。
•SlideListItemView.java--- SlideshowEditActivity中列表的每一项的布局管理,继承自LinearLayout。
•MmsThumbnailPresenter.java---用于在消息列表中,显示彩信的缩略图,因为彩信的内容不固定,可能是图片,可能是音频,可能是视频也可能是幻灯片,所以用这个类来处理并显示彩信的缩略图。
•MessagingPreferenceActivity.java---Mms的配置信息编辑器,用来编辑和更改配置信息,继承息PreferenceActivity。它负责与用户交互,显示和更改配置。在Mms启动时,MmsConfig会从SharedPreference中读出配置信息,在运行时其他的类的配置信息都是从MmsConfig中获取的,MmsConfig提供了很多Get方法以获取配置信息。
•Presenter.java---用来展示附件的一个抽象类。
•PresenterFactory.java---工厂方法。
•RecipientsAdapter.java
•RecipientsEditor.java---用于显示信息编辑页面上面的收信人的编辑框,它可以有自动补全的功能,补全的数据由RecipientsAdapter来提供。
•ViewInterface.java---代表一个View的基类,用于Slideshow显示内容或是取缩略图。可以取View的长宽高等。
•BasicSlideEditorView.java---编辑某一页幻灯片时所用的布局,也就是在SlideEditorActivity.java中使用。
•EditSlideDurationActivity.java---顾名思义,用于编辑某一页幻灯片的浏览时长。
•ManageSimMessages.java---这个是在设置中使用的,用来管理SIM里的消息。在设置中有一项是管理SIM卡上面的消息。在Mms的设置Settings中有一个选项可以设置是把信息存储在SIM卡,还是存储在手机里。在收信时SmsReceiverService会查看这个设置然后把收到的信息写到相应的地址。ManageSimMessages也是以列表方式显示SIM里面的信息,提供了二个菜单:把信息存入手机和删除。
•NumberPickerButton.java---用于显示选择数字的按扭,在配置里面用。
•NumberPickerDialog.java---用于显示选择数字的对话框,在配置里面用。
•NumberPicker.java---用于在配置的时候选择数字。这几个NumerPicker主要是用于Settings中的。
•DeliveryReportActivity.java---信息发送情况报告。以列表的方式来显示
•DeliveryReportAdapter.java---相应的Adapter
•DeliveryReportItem.java---相应的数据,每一项的数据
•DeliveryReportListItem.java---相应每一项的布局。
data---用于操作当前正在编辑的信息的相关数据,比如联系人列表,比如当前对话,比如当前消息。负责管理当前正在编辑的信息和当前所处的对话以及当前信息用到的联系人。这些类都是在编辑信息的时候使用,由于这些多半都是用来管理数据的,而又无法直接做为对象传递给编辑器。所以它们的很多方法都是静态的,也就是这些类都近似单键。
•WorkingMessage.java---用来管理当前正在编辑的消息,它从创建,草稿到发送完成后一直存在,只要打开了编辑信息的页面就会创建一个WorkingMessage,直到退出编辑页面。
•Conversation.java---用来管理对话Threads,通常用来管理当前的对话,也就是进入的对话和正在进行操作的对话,它也用来管理对话列表,比如查询对话列表。
•Contact.java---用来代表一个联系人的信息,和管理联系人,加载联系人信息,其中还有相应的Cache。因为一个联系人的数据是比较多的包含名字,名,姓,各种电话号码,各种地址等等。因为Mms中直接使用Contact来作为联系人,所有信息都是直接从其中获取。另外,由于信息交互中也会涉及到联系人,因为收发信时可以直接使用一串电话号码,这时就需要有如添加联系人的功能。Contact中有很多异步的操作,比如加载联系人信息的时候或者更新Cache的时候都需要异步操作以不阻塞调用者。
•ContactList.java---是一个Contact的List列表它继承自ArrayList<Contact>。用来管理一个Contact列表,或管理多个Contact。因为每个信息可以发送给多个联系人,这时就需要用到ContactList来管理这些收信人。也提供了一些方便存储和传递Contact的方法,比如把多个Contact转成String,或者转成String数组等。
•RecipientIdCache.java---用于保存所用到的Contact的Id和地址(电话)。每次WorkingMessage会更新这个Cache,然后ContactList会优先从这个Cache中查询联络人。
dom---用于解析彩信内容smil的工具包
drm---用于处理DRM的媒体文件的工具包
layout---为了满足特殊需要而改写的布局元素
model---这里面定义了彩信支持的附件数据结构和附件的组织方式。彩信可包含的内容有图片,视频,音频和文字。这些内容可以单独存在,也可以组合在一起。如果组合在一起就变成了幻灯片。用户可以用幻灯片的方式来创建含有多个媒体的附件,图文并茂的展示。每张幻灯片上面可以加视频,音频,图片和文字,但通常一张幻灯片上面只允许加一个图片或视频,文字是都可以添加的,音频在没有视频的情况下只可以添加的。播放的时候可以设置每张幻灯片的播放时长,以及文字的滚动速度等等。
•CarrierContentRestriction.java---是具体的彩信附件检查站,对于不支持的附件,或者附件大小超出限制,或者图像分辨率不对,或者图像超出尺寸,会抛出异常:,ResolutionException,ExceedMessageSizeException,ContentRestrictionException。
•ContentRestriction.java是用于检查附件的接口,外部直接使用这相接口,而具体实现是CarrierContentRestriction
•ContentRestrictionFactory.java是创建附件检查的工厂方法。外部通过这个工厂来创建一个ContentRestriction对象,然后使用其中定义的检查方法来进行附件内部检查。
•SmilHelper.java用于解析和处理附件中的Smil的工具类。
•IModelChangedObserver.java接口,用于监听附件内容有变化。
•Model.java---彩信附件的数据组织方式和管理方式是每一个附件都是一个Model的子类,它不但用于管理附件的具体数据,比如Uri,大小,文件名,位置等,也可以用于在GUI显示附件和查看附件。
•LayoutModel.java---继承自Model用于管理可视的附件的布局的类。它用来管理RegionModel等的基本元素。它就好比ViewGroup或LinearLayout,RelativeLayout等一些布局管理器,用来组织并管理布局基本元素也就是RegionModel的子类ImageModel,TextModel和VideoModel。
•RegionModel.java---继承自Model用于管理可视附件和布局,比如图像,视频和文字。特别是在显示可视附件的时候,用于控制可视附件在屏幕中的位置。一个RegionModel代表着一张幻灯片上的一块区域,它是幻灯片上的布局基本元素。好比UI元素中的View,但多在使用时都是使用它的子类,也就是ImageModel,TextModel和VideoModel。
•RegionMediaModel.java---继承自MediaModel,是用于多媒体附件中的可视部分的布局控制,主要用在附件的显示和播放幻灯片时的控制。它的子类是ImageModel,TextModel和VideoModel。
•MediaModel.java---继承自Model,代表媒体的数据结构,管理具体的附件数据,同时也用于管理附件的显示控制,比如图像的显示,音频和视频的播放控制等。
•MediaModelFactory.java---用于从一个P附件中解析出来MediaModel,也就是把P转化为Mms内部的附件数据。
•ImageModel.java—继承自RegionMediaModel用于管理图像附件和控制图像附件的显示。
•VideoModel.java---继承自RegionMediaModel用于管理视频附件和控制视频附件的播放。
•AudioModel.java----继承自MediaModel用于管理音频附件和控制音频附件的播放
•SlideModel.java----继承自Model用于管理一组附件,这些附件同一次显示给用户。就好像幻灯片的一片一样,每一个SlideModel里面有一个可以存储Model的列表,可以包含文字,音频,图像或视频,其上面的附件同时显示出来。
•SlideshowModel.java---继承自Model,用于管理一个彩信中的所有附件。其内含有一个存储SlideModel的列表,用于保存和控制一条彩信中的所有附件。另外它也负责显示这些附件,把一个个SlideModel组织起来,播放。它也负责着把这些Mms形式的附件(各种Model)转化为Android的附件P,和从P提出各自Model,因为Slideshow是应用程序层的彩信处理方式,而能发送和接收的彩信数据是P。
•TextModel.java---继承自RegionMediaModel用于管理文字附件和控制文字附件的显示,比如按时间来滚动
util---这里面是整个Mms共享的工具类,其中全部都是单键或是直接使用类,不可以创建对象和以对象方式来使用
•AddressUtils.java---关于地址的工具类,目前只有一个getFrom()方法,用于获取发信人地址。
•DraftCache.java---用于标识哪些对话Thread有Draft,哪些没有,也就是用于管理和查询对话的草稿状态,有草稿还是没有。它里面维护了一个HashSet,里面包含了所有含有草稿的Thread Id。它里面也有一个HashSet用于存储OnDraftChangedListener,即当Thread的Draft状态有变化时,DraftCache会调用相应的Listener以告知相应模块,这个对话的草稿状态有所变化。可以通过DraftCache.setDraftState(threadId, state)来设置某个对话的草稿状态; 可以通过DraftCache.hasDraft(threadId)来查询某个对话是否含有草稿。
•Recycler.java---是一个抽象的工具类,里面定义了SmsRecycler和MmsRecycler,用于删除陈旧的消息,或者删除超过信息数量限制的信息。使用方法都是Recycler.getSmsRecycler.deleteOldMessages(context) 或者Recycler.getMmsRecycler.deleteOldMessages(context)
•SmileyParser.java---把标点式的表情符号转化为图形的表情,比如把用图标笑脸来代替。
•DownloadManager.java---不要被名字骗到,它并不是真正意义上的下载管理器,因为它并不负责任何与下载文件过程或下载文件的管理。它是用于管理与下载相关的配置信息,比如是否是自动下载,以及下载过程的各种通知,比如Notification Bar和Toast提示等。
•RateController.java
•SendingProgressTokenManager.java
transaction---对于Mms来讲是最底层的一个包,用户不可见,它负责发信息的最后处理和收信息的最初处理。主要是负责发送信息和接收信息。它并不是真正的发送和接收信息。是由系统Frameworks里面来负责接收和发送信息。这个包只是对于Mms应用层来讲是发送和接收。
•AbstractRetryScheme.java
•DefaultRetryScheme.java—这二个类是实现一种Retry机制,因为信息的发送与接收会受到环境的限制,比如现在手机没信号,或是网络连接不成功,那么就会把信息放到Pending队列里面,等一段时间再重新尝试发送与接收。这里的二个类就是为了实现此Retry机制。
•HttpUtils.java—彩信发送与接收的最底层实现者,它负责用HTTP协议接收和发送彩信到MMSC彩信服务中心。
•MessageSender.java—像其名字所预示的那样,它是为了发送信息而封装的一个接口,它里面只有一个方法sendMessage(),UI层只需要调用实现了这个接口的类即可发送信息。
•MessagingNotification.java—专门负责在Status Bar上面做Notification,比如新接收到了信息,或是信息发送失败,或是接收失败等。它被UI层,和底逻辑层共用着。
•MmsMessageSender.java—继承自MessageSender,专门用于发送彩信。它并不是做发送的事情,而是做一些错误检查和前期准备工作,然后启动TransactionService来做发送相关的事情。
•NotificationTransaction.java—继承自Transaction,负责接收彩信和更新通知(Notification)。当有一个新彩信时,Frameworks会先发出一个短信,称作彩信通知(NotificationIndication),其内含有彩信相关的信息(MMSC, 彩信的ContentLocation(URL)等),之后是由应用程序自己去MMSC用ContentLocation取彩信。这个NotificationTransaction就是专门用于处理彩信通知的,它会从MMSC上取出彩信数据(P),把它写入数据库中,然后更新Notification。需要注意的是,只有彩信的设置是自动获取(“auto retrieve”)时,它才会去下载彩信,否则,它只处理彩信通知(Notification Indication),而不去下载彩信。
•Observable.java—里面定义了观察对象,Transaction是它的一个子类,其他的实体Transaction都是观察对象,里面有一个列表保存着观察者的引用,当一个Transaction完成时,或是有异常时就会调用notifyObservers()方法来把状态通知给观察者。
•Observer.java—观察者,TransactionService实现了这个接口。它是所有Transaction的观察者,以监听他们的状态和处理结果,因为所有的Transaction都 是异步的,所以才用观察模式来通知Transaction的处理结果。
•PrivilegedSmsReceiver.java—继承自SmsReceiver短信收信的事件监听者,负责监听新短信事件android.provider.Telephony.Intents.SMS_RECEIVED_ACTION(“android.provider.Telephony.SMS_RECEIVED”);当接收到这个Intent时表明有一个新短信。它会唤起SmsReceiverServier来处理短信。
•ProgressCallbackEntity.java
•PushReceiver.java—一个BroadcastReceiver专门用于接收彩信事件android.provider.Telephony.WAP_PUSH_RECEIVED_ACTION(“android.provider.Telephony.WAP_PUSH_RECEIVED”),它会先做一些预处理,然后启动TransactionService,TransactionService又会创建NotificationTransaction来处理这个彩信通知。
•ReadRecTransaction.java
•RetrieveTransaction.java—继承自Transaction,用于主动获取彩信数据。当彩信设置为非自动获取时,需要用户触发获取,TransactionService会创建一个RetrieveTransaction来获取彩信数据(P),存入数据库,更新Notification等。
•RetryScheler.java
•SendTransaction.java—继承自Transaction,用于发送彩信数据。
•SimFullReceiver.java
•SmsMessageSender.java—发送短信的封装,继承自MessageSender。它会启动SmsReceiverService来发送。
•SmsReceiver.java—是一个BroadcastReceiver,不要被其名字唬到,它并不负责接收新短信通知,相反,它用于发送信息,接收发送信息请求,并唤起SmsReceiverService来处理发送。这里可能是Android命名规则的原因,Android里的四大组件都喜欢把其组件的名字加上,比如ComposeMessageActivity,是一个Activity,TransactionService是一个Service,而这里SmsReceiver是一个BroadcastReceiver,它与接收短信(receiving Sms)没有关系。当然了,这完全是一个糟糕的命名。
•SmsReceiverService.java—它是一个Service,专门用于处理短信的发送与接收。它是由SmsReceiver和PrivilegedSmsReceiver监听事件,然后启动它的,自己并不会监听Intent事件。
•SmsRejectedReceiver.java
•SmsSingleRecipientSender.java—继承自SmsMessageSender,它针对一个收信人,调用Frameworks层接口发送信息,对于Mms应用来说,这是发送短信的最后一站,对就是说对于应用来说,它会把短信发送出去。
•TransactionBundle.java—Transaction所用的一个数据结构,用于给Transaction传送数据。
•Transaction.java—各种Transaction的基类,它里面定义了二个方法getP(),sendP()这二个方法是从MMSC取彩信数据,和向MMSC发送数据。它是对HttpUtils的一层包装。
•TransactionService.java—是一个Service,接收各种Transaction请求,然后处理Transaction。每个Transaction都 会开启新的线程异步的处理,所以当处理完成时又会通过Observer来通知TransactionService。
•TransactionSettings.java—彩信相关配置信息的数据结构,比如MMSC,Proxy,Port等。请求方可能会提供这些数据,如果提供就使用;否则就会从Telephony数据库加载默认的数据,这些数据与运营商和APN的设置有关。
•TransactionState.java—标识每一个Transaction处理情况的数据结构,很简单,只是标明处理成功还是失败,用于Transaction回调Observer(TransactionService)时用。
还有com/android/mms根目录下面的一些文件,其中绝大多数是定义的基类异常和一些公共的类。
•MmsApp.java---Mms Application会在应用进程启动的时候做一些必要的初始化工作,比如配置,下载,联系人,对话,Smiley解析器和通知等。
•MmsConfig.java---管理Mms的一些常用配置,比如彩信大小上限,彩信图片尺寸上限,收信人的个数上限等等。这些配置信息是保存在在res/xml/mms_config.xml里面。MmsApp在初始化时会调用MmsConfig.init(),在这里面会调用loadMmsSettings来解析mms_config.xml从而得到所需要的配置信息。其他的模块只通过MmsConfig来访问这些配置信息。
•LogTag.java---有关日志跟踪信息的控制。它可以方便的控制日志输出级别。但是实际上整个Mms代码中使用这个LogTag的地方并不多。
3. android中怎么获取播放的流媒体的格式
Android手机收听mms格式流媒体电台的方法 [i=s] 本帖最后由 eth7 于 2010-1-10 21:21 编辑 [/i] 入手HTC Hero之后一直在寻找Android平台下可以收听mms格式流媒体电台的软件,国内和港台的中文电台多数是这种格式的。
4. mms是什么mms可以干什么mms在哪里出现根网站有关的吗流媒体是什么
MMS为Multimedia Messaging Service的缩写,中文译为多媒体短信服务。中国移动公司把它定名为“彩信”,可以用于传送文字、图片、动画、音频和视频等多媒体信息。
MMS是Multimedia Message Service的简称,中文名为多媒体信息服务。MMS的工业标准是由两个组织,WAP Forum(WAP论坛)和3GPP(3G Partnership Project:3G伙伴计划)所制订的。因此,MMS是设计成可以在WAP协议的上层运行,它不局限于传输格式,既支持电路交换数据格式(circuit-switched data),也支持通用分组无线服务GPRS格式(general packet radio service)。其工作原理为利用高速传输技术EDGE(Enhanced Data rates for GSM Erolution是一种提高数据速率的新技术,是GSM向第三代移动通信系统IMT-2000过渡的台阶。它也被称为"GSM 384",因为这种技术能使数据速率由目前的9.6kbit/s提高到384kbit/s,这种速率可以支持语音、因特网浏览、电子邮件、会议电视等多种高速数据业务)和GPRS的支持下,以WAP(无线应用协议)为载体传送视频、图片、声音和文字。
5. 为什么我不能下载MMS协议的流媒体
MMS协议是一种流媒体传输协议
WINDOWS
MEDIA
PLAYER就支持在线播放这个格式的文件
较低版本的FLASHGET是不支持MMS
RSTP等格式文件下载的
将MMS改成HTTP(hyper
text
transfer
protocol)超文本传输协议
连接还是能建立,但是由于流媒体的一大特点是文件传输过程中需要缓冲,而HTTP协议下是不支持的,于是就会下下来多个同名的文件
所以要想下载MMS格式的文件
下载工具很重要
自己想到以前的一些经验在这里说一说
希望对你有帮助
6. 内网如何建立mms媒体流,手机如何打开mms媒体流
ADSL的IP是非固定类IP地址,会常常有变动,这个你核实过吗?也就是说,除了那家公司,另外别的公网用户可以用这个地址看吗?一定要同时判定:即当你转播时,除了公司内网不能看,其他用户可以看吗?第二,这个不能看的内网,是否做了相关限制;我们以前内网就封掉了所有流媒体协议
7. 求一个在安卓上支持MMS流媒体的播放器
MXPlayer就支持网络视频啊!非常好的播放器,可以秒杀所有播放器 ,但看到你说的是内网,内网需要手机与网络连通啊,可以通过WIFI接入到内网
8. android开发Vitamio是否可以录制视频
android上,视频/音频流直播是极少有人关注的一部分。每当我们讨论流媒体,RTMP(Real Time Messaging Protocol)是不可或缺的。RTMP是一个基本的视频/音频直播流协议,但是不幸的是Android标准的VideoView不支持RTMP的播放。因此,如果想在android上播放RTMP直播流,你必须使用支持RTMP协议的库。在本教程中我们将讨论如何通过使用安卓的 [Vitamio] 库播放由 RTMP 协议传输的流媒体。
Android Vitamio 库
Vitamio是一个android和ios上基于FFmpeg的开源项目。Vitamio为我们提供了一个清洁、简单、全面、真实的硬件加速解码器和渲染器API,Vitamio是一个支持多种音视频格式 如 FLV, TS/TP, WMV, DivX, Xvid等多种标准格式的非常强大的库。所不同的是,它也支持类似.mkv和.srt嵌入和外挂字幕播放。但是它带有一个许可证,因此在使用它之前请先获得认证。在这个android RTMP例子中,我们不仅讨论RTMP直播流,而且也会讨论m3u8流(HLS),RTSP流和 MMS (Microsoft Media Stream)。首先让在我们的项目中引用Vitamio库。
在Android Studio中引用Vitamio库的步骤如下:
1.下载Vitamio bundle
2.解压并且在Android Studio上File->Import Mole
3.指定到VitamioBundle路径,选择vitamio文件夹 点击完成
4.在build.gradle(Mole: app)依赖部分添加依赖项目(‘:vitamio’)
5.打开build.gradle (Mole: vitamio) – 改变最小sdk版本为7
6.不要忘记在manifest.xml中添加internet权限
7.完成!
Android RTMP流
在讲述如何使用之前,让我们先了解下RTMP。Real Time Messaging Protocol (RTMP)是一个Adobe Systems所拥有的一个协议。该协议是Adobe公司拥有的开发音视频流的flash player。后来该协议的部分被公开,供公众使用。更多请查看这里.这个协议大多用于IPTV和实时视频点播流,但它也用于其他领用。
在android上,标准的VideoView不支持RTMP播放。但WebView可以播放RTMP流。这解决了播放RTMP流的问题,但是我认为web apps 不能提供一个很好的界面和体验。因此这这个android RTMP例子中我们将运用第三方库-Vitamio 直播RTMP流的流媒体。在工程中引用Vitamio之后,请在你的layout文件添加Vitamio的VideoView:
activity_main.xml
<?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.VideoView android:id="@+id/vitamio_videoView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>123456789101112
另外请编写你的activity如下:
MainActivity.java
package com.truiton.rtmpplayer; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import java.util.HashMap; import io.vov.vitamio.LibsChecker; import io.vov.vitamio.MediaPlayer; import io.vov.vitamio.widget.MediaController; import io.vov.vitamio.widget.VideoView; public class MainActivity extends ActionBarActivity {
private static final String TAG = "MainActivity"; private String path; //private HashMap<String, String> options;
private VideoView mVideoView; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!LibsChecker.checkVitamioLibs(this)) return;
setContentView(R.layout.activity_main);
mVideoView = (VideoView) findViewById(R.id.vitamio_videoView);
path = "rtmp://rrbalancer.broadcast.tneg.de:1935/pw/ruk/ruk"; /*options = new HashMap<>();
options.put("rtmp_playpath", "");
options.put("rtmp_swfurl", "");
options.put("rtmp_live", "1");
options.put("rtmp_pageurl", "");*/
mVideoView.setVideoPath(path); //mVideoView.setVideoURI(Uri.parse(path), options);
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.setPlaybackSpeed(1.0f);
}
});
}
}041424344454647
虽然上面代码很清晰明了,但需要指出的是请修改你播放RTMP流的路径。在android上,有时可能使用带报头路径来播放RTMP流。幸运的是,Vitamio RTMP播放器也支持这种方式。因此,所有类型的RTMP流可以使用Vitamio库。上面的例子会是这个样子:
Android Vitamio 直播视频播放功能的实现
Android RTSP流媒体
实时流协议(RTSP)通过多媒体服务器传输内容,例如YouTube使用RTSP流发布内容。关于RTSP流比较容易的部分是,它可以通过android标准的VideoView来完成,想了解更多,请参考我的VideoView例子。
但是如果你使用Vitamio库,可以更好的播放RTSP流。事实上Vitamio也支持RTSP流的回播。和上面过程是一样的,包括Vitamio的VideoView在布局文件,并使用路径变量指定的RTSP url
mVideoView = (VideoView) findViewById(R.id.vitamio_videoView);
path = "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov";
mVideoView.setVideoPath(path);
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.setPlaybackSpeed(1.0f);
}
});12345678910111213
Android m3u8 流媒体
“如何在android上播放m3u8视频”是android开发者最常见的问题之一。通过Http 协议进行视频流直播最简单的办法就是使用标准的 VideoView. 但只能在android3.0以上的设备上播放m3u8流。因为在Android 3.0引入HTTP/ HTTPS直播和HTTP/ HTTPS渐进式流媒体协议,在android3.1完全支持HTTPS。
如果你希望在早期的版本上实现支持android m3u8流的HTTP实时流媒体 (HLS)。应该考虑使用Vitamio库,这个库支持在android API7以上播放m3u8。使用方式,同样的在布局文件中使用Vitamio的VideoView,并指定的HTTP实时流媒体URL。
mVideoView = (VideoView) findViewById(R.id.vitamio_videoView);
path = "http://93.184.221.133/00573D/236/236-0.m3u8";
mVideoView.setVideoPath(path);
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.setPlaybackSpeed(1.0f);
}
});12345678910111213
Playing m3u8 stream on Android with Vitamio would look something like this:
在androi上使用Vitamio播放m3u8流效果如下:
Android Vitamio 直播视频播放功能的实现
Android MMS 流
Vitamio库是一个强大的库,还支持Microsoft媒体服务器(MMS)流中的播放。 MMS是网络流媒体协议,主要用于网络广播和电台直播。使用Vitamio用于在anroid的MMS流和其他协议没有什么不同。所有你需要做的只是更换路径变量指向一个MMS url:
mVideoView = (VideoView) findViewById(R.id.vitamio_videoView);
path = "mms://beotelmedia.beotel.net/studiob";
mVideoView.setVideoPath(path);
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.setPlaybackSpeed(1.0f);
}
});123456789101112
结论
通过上面的讨论,可以确定地说,Vitamio是一个强大的多平台库(ios and android)。通过使用Vitamio库 能播放多种类型的视频格式和协议如RTMP, RTSP, HTTP Live, and HTTP渐进式流协议。另外一个很好的功能是,vitamio支持字幕和多音轨的播放。Vitamio的唯一的缺点是,它不是完全的开源。
阅读全文
9. android流媒体开发有开源库吗
开源的没有 不开源好用的倒是有一个,叫:
Vitamio
用过,很好使。
http://www.cnblogs.com/over140/archive/2012/08/31/2665299.html
---------------------------------------------------------
是一款Android与iOS平台上的全能多媒体开发框架
项目地址:https://github.com/yixia/VitamioBundle
网站介绍:http://www.vitamio.org/docs/
特点:(1) 全面支持硬件解码与GPU渲染
(2) 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频
(3) 在Android与iOS上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8)等常见的多种视频流媒体协议,包括点播与直播。
10. mms流媒体的真实地址怎样获得
MMS:是微软的流媒体协议。是在网络上传输的地址,不一定是上传后获得的原始地址。通常只能在线播放,听说用Moles
Downloader
可以捕捉mms流媒体的真实地址。也不知道是不是这样,你有兴趣可以试试。