虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式、性能等各方面都十分有限,但是Vitamio的确强大到没朋友!

Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。

Vitamio 功能强大,能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 与 iOS 上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。

接下来就从sdk原生的VideoView开始,过度到vitamio框架。

1、原生的VideoView

android sdk对音频视频的支持

  • 音频:mp3 wma
  • 视频:3gp mp4

Demo:

布局:

<VideoView
android:id="@+id/vv"
android:layout_width="match_parent"
android:layout_height="match_parent" />

活动代码:

package com.example.videoviewdemo;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView; public class MainActivity extends Activity implements OnPreparedListener, OnErrorListener, OnCompletionListener { private VideoView mVv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.实例化videoView
mVv = (VideoView) findViewById(R.id.vv);
//设置相关的监听
mVv.setOnPreparedListener(this);
mVv.setOnErrorListener(this);
mVv.setOnCompletionListener(this);
/**测试支持格式
//1.flv
//2.3gp 、.mp4 可以
//3.avi 有声音无图像
//4.rmvb
//5.mkv
//storage/emulated/0/Download/5.mkv
*/
//2.设置视频的地址
// mVv.setVideoPath("/storage/emulated/0/Download/video_test.mp4");
mVv.setVideoPath("http://192.168.1.100:8080/1.mp4");
// mVv.setVideoPath("http://192.168.1.100:8080/2.3gp");
// mVv.setVideoURI(Uri.parse("http://192.168.1.100:8080/2.3gp")); //3.设置控制条
mVv.setMediaController(new MediaController(this));
//4.开始播放
mVv.start(); } @Override
public void onCompletion(MediaPlayer mp) {
// TODO
Toast.makeText(getApplicationContext(), "播放完了", 0).show(); } @Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Toast.makeText(getApplicationContext(), "资源有问题", 0).show();
return false;
} @Override
public void onPrepared(MediaPlayer mp) {
Toast.makeText(getApplicationContext(), "准备好了", 0).show();
} }

播放网络视频,记得加上权限:<uses-permission android:name="android.permission.INTERNET" />

运行:

可以看到非常清晰的播放。但是美中不足的是,它支持的格式有限。而接下来介绍的vitamio,解决了这个问题,当然,也更强大。

2、vitamio介绍

vitamio运行demo总结

  • 本地:支持所有格式
  • 网络:支持所有格式
  • 流媒体:支持mms rtsp(官方说支持.但是运行的时候.直接crash) m3u8支持

Demo:

首先看看它是怎么用,再演示完整的Demo。

ViewView的集成过程:

  1. 下载lib包.demo:https://github.com/yixia/VitamioBundle
  2. 新建工程,引入lib包
  3. 是否修改androidmanifest.xml

    1. 权限

      <uses-permission android:name="android.permission.INTERNET" />
    2. 添加activity

      <!-- vitamio add -->
      <activity
      android:name="io.vov.vitamio.activity.InitActivity"
      android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
      android:launchMode="singleTop"
      android:theme="@android:style/Theme.NoTitleBar"
      android:windowSoftInputMode="stateAlwaysHidden" />
  4. 写代码

    //使用vitamio需要初始化引擎,引擎的检查
    /**---------------需要注意 begin---------------**/
    if (!LibsChecker.checkVitamioLibs(this))
    return;
    /**---------------需要注意 end---------------**/ mVitamio_vv = (VideoView) findViewById(R.id.vitamio_vv);
    /**---------------设置监听---------------**/
    mVitamio_vv.setOnPreparedListener(this);
    mVitamio_vv.setOnErrorListener(this);
    mVitamio_vv.setOnCompletionListener(this);
    //设置路径
    mVitamio_vv.setVideoPath("storage/emulated/0/Download/5.mkv");
    //设置控制条
    mVitamio_vv.setMediaController(new MediaController(this));
    //开始播放
    mVitamio_vv.start();

完整Demo:

布局:

<io.vov.vitamio.widget.VideoView
android:id="@+id/vitamio_vv"
android:layout_width="match_parent"
android:layout_height="match_parent" />

主活动代码:

package com.example.vitamiodemo59;

import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.MediaPlayer.OnCompletionListener;
import io.vov.vitamio.MediaPlayer.OnErrorListener;
import io.vov.vitamio.MediaPlayer.OnPreparedListener;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast; public class MainActivity extends Activity implements OnPreparedListener, OnErrorListener, OnCompletionListener { private VideoView mVitamio_vv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //使用vitamio需要初始化引擎,引擎的检查
/**---------------需要注意 begin---------------**/
if (!LibsChecker.checkVitamioLibs(this))
return;
/**---------------需要注意 end---------------**/ mVitamio_vv = (VideoView) findViewById(R.id.vitamio_vv);
/**---------------设置监听---------------**/
mVitamio_vv.setOnPreparedListener(this);
mVitamio_vv.setOnErrorListener(this);
mVitamio_vv.setOnCompletionListener(this);
//设置路径
//本地视频
//网络视频
//流媒体
mVitamio_vv.setVideoPath("storage/emulated/0/Download/5.mkv");
//设置控制条
mVitamio_vv.setMediaController(new MediaController(this));
//开始播放
mVitamio_vv.start();
} @Override
public void onCompletion(MediaPlayer mp) {
// TODO
Toast.makeText(getApplicationContext(), "播放完了", 0).show();
} @Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Toast.makeText(getApplicationContext(), "资源有问题", 0).show();
// TODO
return false;
} @Override
public void onPrepared(MediaPlayer mp) {
Toast.makeText(getApplicationContext(), "准备好了", 0).show();
// TODO } }

运行效果如下:

需要注意引入lib库,否则是无法使用的

基本介绍就到这里,更多学习可以参见官方文档。

喜欢的朋友可以关注我!谢谢

Android视频媒体相关,VideoView和开源框架vitamio的更多相关文章

  1. Android图片加载与缓存开源框架:Android Glide

    <Android图片加载与缓存开源框架:Android Glide> Android Glide是一个开源的图片加载和缓存处理的第三方框架.和Android的Picasso库类似,个人感觉 ...

  2. Android 的媒体路由功能应用与框架解析

    一.功能描述 Android 的媒体路由API被设计用来允许多种媒体(视频.音乐.图片)在与ANDROID设备连接(无线或有线)的辅助设备(如电视.立体声.家庭戏院系统.音乐播放机)上显示和播放,使用 ...

  3. android视频处理相关资料

    <开源>基于Android的点对点视频通信/RTSP/RTP/H.264 http://blog.csdn.net/cazicaquw/article/details/8650543 历经 ...

  4. android值得珍藏的6个开源框架技术

    1.volley  项目地址 https://github.com/smanikandan14/Volley-demo JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的 ...

  5. 029 Android 轮播图广告Banner开源框架使用

    1.Banner介绍 现在的绝大数app都有banner界面,实现循环播放多个广告图片和手动滑动循环等功能. 2.使用环境配置(具体可见github开源项目) (1)添加依赖 在build.gradl ...

  6. Android开发之最火的开源框架之一Xutils2详解(摘自开源作者官方介绍详解)

    此框架说实话还是挺不错的,挺好用的,功能多,所以我也用过. 由于CSDN博客写的字数有限制,所以全文的用法打包成了markdown 文件,因为markdown真的太还用了. 全文下载地址为: http ...

  7. Android 文件上传 使用AsyncHttpClient开源框架

    public void upload(View view) { AsyncHttpClient client = new AsyncHttpClient(); RequestParams reques ...

  8. Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager

    action来实现tab标签 并跟fragment结合 因为要写新闻客户端这个tab导航是必须的 这里我写几个小练习,希望大家融会贯通. 1actionbar设置tab +fragment 布局是个l ...

  9. 25类Android常用开源框架

    1.图片加载,缓存,处理 框架名称 功能描述 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库,已过时 Picasso 一个强大的图片下载与缓存的库 F ...

随机推荐

  1. 用js来实现那些数据结构(栈01)

    其实说到底,在js中栈更像是一种变种的数组,只是没有数组那么多的方法,也没有数组那么灵活.但是栈和队列这两种数据结构比数组更加的高效和可控.而在js中要想模拟栈,依据的主要形式也是数组. 从这篇文章开 ...

  2. C++因继承引发的隐藏与重写

    在区分隐藏和重写之前,先来理一理关于继承的东西... [继承] 继承是面向对象复用的重要手段.通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西.简单的说,继承就是指 ...

  3. 高并发下,log4j日志打印行数导致的内存溢出问题

    log4j日志打印时,如果将行数打印出来,在调用量极大的情况下,会出现内存溢出问题. log4j打印日志,打印行数时,行数是通过一个一个exception抛出,再极高调用量的情况下,内存会因为exce ...

  4. jQuery中的for循环var与let的区别

    今天在写jQuery请求接口中发现一个问题: 在用AJAX发送请求中又嵌套了一个AJAX请求,发现在内层请求的success中对第一次success中的循环变量 i 无法获取,具体代码如下: $.aj ...

  5. 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池)

    一.本文产生原由: 之前文章<总结消息队列RabbitMQ的基本用法>已对RabbitMQ的安装.用法都做了详细说明,而本文主要是针对在高并发且单次从RabbitMQ中消费消息时,出现了连 ...

  6. 第一届“百度杯”信息安全攻防总决赛_Upload

    题目见i春秋ctf训练营 看到fast,就想抓个包看看,以前有道题是打开链接直接来了个跳转,当然这题不是 查看返回包,发现一个好东西 拿去base64解码看看 感觉给出的字符串能继续解码,果然解码后得 ...

  7. windows版本的phantomjs-2.1.1-windows安装

    windows版本的phantomjs-2.1.1-windows安装 1.下载 链接:http://pan.baidu.com/s/1dEUl6dN 密码:oij8 2.安装 下载好之后解压放到某个 ...

  8. codevs 2622 数字序列

    2622 数字序列 提交地址:http://codevs.cn/problem/2622/  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold     题目描述 De ...

  9. [SDOI 2014]数表

    Description 有一张N×m的数表,其第i行第j列(1 < =i < =N,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...

  10. 【bzoj4572 scoi2016】围棋

    题目描述 近日,谷歌研发的围棋AI—AlphaGo以4:1的比分战胜了曾经的世界冠军李世石,这是人工智能领域的又一里程碑. 与传统的搜索式AI不同,AlphaGo使用了最近十分流行的卷积神经网络模型. ...