安卓vitamio 安卓sdk怎么更新用

8718人阅读
Android/OMS(322)
  虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式、性能等各方面都十分有限,这里与大家一起利用开源项目Vitamio来打造属于自己的Android万能播放器!
请下载新发布的SDK():
  欢迎转载,但请保留文章原始出处:)
    博客园:
    农民伯伯:
  一、实现目标
    1.1  支持格式
      支持主流的视音频格式:mp3/mp4/mkv/avi/3gp/rmvb/mov/flv等。
    1.2  支持功能
      1.2.1  当然最重要的是播放功能,含播放控制(播放、暂停,声音、亮度调整等)
      1.2.2  可以扫描SDcard,用列表展现出来,可以搜索
      1.2.3  可以播放网络视音频(http、rtsp、mms)   
  二、Vitamio项目简介
    Vitamio是一个支持所有Android设备的多媒体框架。Vitamio与Android默认的MediaPlayer工作方式相似,但包含更加强大的功能,并且它是完全免费的!
    2.1  网址
官方微博:
官方网址:
    2.2  成功案例
      国内:、、等
      国外:、等
    2.3   网络协议
       支持以下协议的音频和视频播放:
      *& MMS
      *& RTSP (RTP, SDP)
      *& HTTP流式传输(progressive streaming)
      *& HTTP Live Streaming (M3U8), Android 2.1+
    2.4   媒体格式
      Vitamio集成了许多音频和视频的解码包,相比Android内置默认的媒体格式,这里列出其中的一些:
      *&& divx/xvid
      *&& wmv
      *&& flv
      *&& ts
      *&& rmvb
      *&& mkv
      *&& mov
      *&& m4v
      *&& avi
      *&& mp4
      *&& 3gp
    2.5   字幕
      Vitamio支持显示一些内置或外挂字幕格式:
      * SubRip(.srt)
      * Sub Station Alpha(.ssa) / Advanced Sub Station  移步
      * Alpha(.ass)
      * SAMI(.smi/.sami)
      * MicroDVD(.sub/.txt)
      * SubViewer2.0(.sub)
      * MPL2(.mpl/.txt)
      * Matroska (.mkv) 字幕轨迹
    2.6   其他功能
      * 后台播放
      * 多音轨支持
      * 多字幕支持,包括内部或外挂的
      * 多平台处理器优化
      * 可调长宽比
      * 文字编码自动检测
    2.7  许可/授权(Lisences)
      Vitamio使用了sevral开源项目,感谢他们。
      2.7.1  FFmpeg
        FFmpeg提供软件解码器和多路输出(demuxers)。Vitamio使用许可下的代码,代码可以从下载。
      2.7.2  Universalchardet (是Mozilla的一个自动检测页面文字编码的程序)
         Universalchardet是Mozilla的编码检测库。Vitamio使用MPL许可下Universalchardet的代码来检测字母文本编码。
    以上主要是对官方介绍进行了简单翻译。
  三、示例代码
    3.1  下载Vitamio的SDK
       含javadoc文档和vitamio.jar。
    3.2   下载Demo代码
       这是一个使用vitamio.jar的Demo工程。
    3.2   运行Demo代码
      3.2.1  下载上面的Demo包后,补充工程文件.project、.classpath等,后面有重新打包下载。
      3.2.2  运行工程,见如下图:
        
        需要安装Vitamio插件来播放视频,这里选择Vitamio Website,下载安装重新运行,发现一抹黑,看看代码,发现没有视频,修改视频路径,并且上传视频到SD卡,这里提供一个测试视频下载,再次运行即可。
      3.2.3  成功截图
        
      3.2.4  修改后的Demo工程下载
        
        注意把上面的测试视频解压后拷贝到SD卡的根目录。
  四、相关文章
    开发者指南
  五、文章维护
     新版SDK第一个内测版已发布,点。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2592169次
积分:23451
积分:23451
排名:第177名
原创:20篇
转载:969篇
评论:318条
(2)(10)(1)(7)(13)(6)(4)(3)(9)(10)(3)(13)(6)(22)(14)(13)(19)(26)(50)(9)(12)(13)(47)(22)(31)(29)(18)(26)(12)(6)(23)(5)(12)(4)(10)(12)(79)(44)(86)(12)(9)(7)(21)(6)(10)(14)(23)(30)(4)(1)(3)(5)(3)(9)(2)(16)(3)(17)(5)(5)(8)(2)(3)(3)(20)(10)(14)(3)下次自动登录
关注移动互联网和移动APP开发工具、开发框架、测试工具、微信开发、Android源码、Android开源类库以及各种开源组件的IT科技网站
现在的位置:
Android网络收音机–使用Vitamio解码(一)
前面讲到Vitamio可以支持一些流媒体,在这里就用Vitamio来播放网络上的一些流媒体,如:mms、rtsp、http,参考前辈的一些文章来写一个网络收音机程序,对于界面的要求不高,要求实现一些实用的功能
程序目录结构
初期界面,左边是用开源项目SlidingMenu,不清楚的可以参考:Android开源项目SlidingMenu的学习笔记
电台信息是通过XML来保存channel.xml,这里只添加一部分,更详细的可以参考文章最后的链接,自行添加
读取XML数据放在NetRadioApp.java,使用两个全局的变量来保存,方便其它类的使用
package com.dzt.
import java.io.InputS
import java.util.ArrayL
import com.dzt.netradio.constant.GlobalC
import com.dzt.netradio.domain.RadioChannelD
import com.dzt.netradio.utils.XmlPullParserU
import android.app.A
public class NetRadioApp extends Application {
public static ArrayList ChannelTypeList = new ArrayList();
public static ArrayList<arraylist& finalChanneldata = new ArrayList<arraylist&();
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
InputStream is =
is = getResources().getAssets().open(channel.xml);
XmlPullParserUtils.getRadioListData(is, ChannelTypeList,
finalChanneldata);
} catch (Exception e) {
// TODO Auto-generated catch block
GlobalConstants.print_i(NetRadioApp,
onCreate Exception =
+ e.toString());
e.printStackTrace();
public void onLowMemory() {
// TODO Auto-generated method stub
super.onLowMemory();
System.gc();
</arraylist</arraylist
在左侧菜单中使用观察者模式监听点击事件
public void setOnMenuListOnItemClickListener(
OnMenuListOnItemClickListener listener) {
mListener =
public interface OnMenuListOnItemClickListener {
public void onSelectItem(int groupPosition, int childPosition);
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
// TODO Auto-generated method stub
if (mListener != null) {
mListener.onSelectItem(groupPosition, childPosition);
在MainActivity.java类中设置监听器,和设置Handler与Service通信
* 选择对应的Item
public void onSelectItem(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
RadioChannelData channelData = NetRadioApp.finalChanneldata.get(
groupPosition).get(childPosition);
mName.setText(channelData.getChannelName());
for (int i = 0; i & mUpdateHandler.size(); i++) {
Handler h = mUpdateHandler.get(i);
Message msg = h.obtainMessage();
msg.what = GlobalConstants.SELECT_ITEM;
Bundle data = new Bundle();
data.putInt(groupPosition, groupPosition);
data.putInt(childPosition, childPosition);
msg.setData(data);
h.sendMessage(msg);
public static void addUpdateHandler(Handler handler) {
mUpdateHandler.add(handler);
public static void removeUpdateHandler(Handler handler) {
mUpdateHandler.remove(handler);
在Service中处理播放PlayService.java
package com.dzt.netradio.
import java.io.IOE
import io.vov.vitamio.MediaP
import io.vov.vitamio.MediaPlayer.OnBufferingUpdateL
import io.vov.vitamio.MediaPlayer.OnCompletionL
import io.vov.vitamio.MediaPlayer.OnPreparedL
import android.app.S
import android.content.I
import android.os.B
import android.os.B
import android.os.H
import android.os.IB
import android.os.M
import com.dzt.netradio.MainA
import com.dzt.netradio.NetRadioA
import com.dzt.netradio.WeakH
import com.dzt.netradio.constant.GlobalC
import com.dzt.netradio.domain.RadioChannelD
public class PlayService extends Service implements OnBufferingUpdateListener,
OnCompletionListener, OnPreparedListener {
private MediaPlayer mP
public void MyMethod() {
GlobalConstants.print_i(PlayService, MyMethod called);
public PlayService() {
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return myB
public class MyBinder extends Binder {
public PlayService getService() {
return PlayService.
private MyBinder myBinder = new MyBinder();
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
MainActivity.addUpdateHandler(selectItemHandler);
GlobalConstants.print_i(PlayService, onCreate called);
public void onDestroy() {
// TODO Auto-generated method stub
MainActivity.removeUpdateHandler(selectItemHandler);
if (mPlayer != null) {
mPlayer.release();
super.onDestroy();
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
GlobalConstants.print_i(PlayService, onPrepared called);
if (mPlayer != null)
mPlayer.start();// 开始播放
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
GlobalConstants.print_i(PlayService, onCompletion called);
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// TODO Auto-generated method stub
// GlobalConstants.print_i(PlayService, onBufferingUpdate called);
private void playSelectItem(String url) {
if (mPlayer == null) {
mPlayer = new MediaPlayer(this);// 播放流媒体的对象
mPlayer.setDataSource(url);// 设置流媒体的数据源
mPlayer.prepare();
mPlayer.setOnBufferingUpdateListener(this);
mPlayer.setOnCompletionListener(this);
mPlayer.setOnPreparedListener(this);
} catch (Exception e) {
GlobalConstants.print_i(PlayService, onCreate Exception =
+ e.toString());
e.printStackTrace();
mPlayer.setDataSource(url);// 设置流媒体的数据源
} catch (Exception e) {
GlobalConstants.print_i(PlayService, onCreate Exception =
+ e.toString());
e.printStackTrace();
GlobalConstants.print_i(PlayService, playSelectItem url =
private Handler selectItemHandler = new SelectItemHandler(this);
private static class SelectItemHandler extends WeakHandler {
public SelectItemHandler(PlayService owner) {
super(owner);
// TODO Auto-generated constructor stub
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
PlayService owner = getOwner();
if (owner == null)
switch (msg.what) {
case GlobalConstants.SELECT_ITEM:
Bundle data = msg.getData();
int groupPosition = data.getInt(groupPosition);
int childPosition = data.getInt(childPosition);
RadioChannelData channelData = NetRadioApp.finalChanneldata
.get(groupPosition).get(childPosition);
owner.playSelectItem(channelData.getChannelURL());
但只能播放一次,再点击Item就不能播放或自动退出,还没找到是什么原因,在后续再解决这个问题Vitamio中的MediaPlayer与系统中的MediaPlayer非常相似,用起来也方便,比VLC要方便
相关代码:http://download.csdn.net/detail/deng0zhaotai/7905367
参考文档:
1、网络电台地址(一)
2、网络电台地址(二)
3、/mythou/p/3231184.
【上篇】【下篇】

我要回帖

更多关于 安卓sdk 的文章

 

随机推荐