android 视频播放器Vitamio踩坑之路

一、Vitamio底层音视频解码原理基于FFmpeg开发,vitamio的优点:

(1)Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,

(2)可以在 Android 上支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。

支持 ARMv6 和 ARMv7 两种 ARM CPU,同时对 VFP, VFPv3, NEON 等指令集都做相应优化。

二、使用:

(1)集成:

1.github下载vitamio资源 https://github.com/yixia/VitamioBundle

2.解压文件,将其中的vitamio导入到as中 ,打开AS,File -> New -> Import Moudle,选择刚才解压文件夹下的 vitamio 文件. 并且在app的gradle中添加该包的依赖

3.按照app目录下的build.gradle配置vitamio目录下的build.gradle(注意不是vitamio文件夹下app下的)

(2)使用

1.mainfest文件


    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在自己的AndroidManifest.xm 中添加
<!-- 必须初始化 -->
 <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" />

2.使用Vitamio库

在视频播放的Activity onCreate中 setContentView()之前添加解码监听判断,

//检查vitamio框架是否可用

if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this))
    return;

1.布局中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.gbf.livingdemo.VitamioActivity"
    android:orientation="vertical">
<io.vov.vitamio.widget.VideoView
    android:id="@+id/vitamio_videoview"
    android:layout_width="match_parent"
    android:layout_height="200dp"/>
</LinearLayout>

2.activity

public class VitamioActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener{
    private VideoView mVideoView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //检查vitamio框架是否可用
        if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this))
            return;
        setContentView(R.layout.activity_vitamio);
        //一定要初始化
        Vitamio.initialize(this);
        initView();
        initData();
    }

    private void initData() {
        mVideoView.setVideoURI(Uri.parse("http://qiubai-video.qiushibaike.com/91B2TEYP9D300XXH_3g.mp4"));
//        mVideoView.setVideoURI(Uri.parse("http://alcdn.hls.xiaoka.tv/2017427/14b/7b3/Jzq08Sl8BbyELNTo/index.m3u8"));
        mVideoView.setMediaController(new MediaController(this));

        //设置监听
        mVideoView.setOnPreparedListener(this);
        mVideoView.setOnErrorListener(this);
        mVideoView.setOnCompletionListener(this);
    }

    private void initView() {
        mVideoView=findViewById(R.id.vitamio_videoview);
    }



    @Override
    public void onPrepared(MediaPlayer mp) {
        Toast.makeText(this,"准备好了", Toast.LENGTH_LONG).show();
        mVideoView.start();
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        Toast.makeText(this,"播放完成", Toast.LENGTH_LONG).show();
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        Toast.makeText(this,"Error", Toast.LENGTH_LONG).show();
//          返回 true
        return true;
    }
}

别忘记

@Override
protected void onDestroy() {
    mVideoView.stopPlayback();
    super.onDestroy();
}

效果如下:

竖屏:

正常情况下来,进度条应该是在视频的底部,而不是在手机屏幕的底部

修改如下:(1)xml布局,在videoview外面添加一层布局如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.gbf.livingdemo.VitamioActivity"
    android:orientation="vertical">
    <RelativeLayout
        android:id="@+id/rela"
        android:layout_width="match_parent"
        android:layout_height="260dp">
<io.vov.vitamio.widget.VideoView
    android:id="@+id/vitamio_videoview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
    </RelativeLayout>
</LinearLayout>

(2)MediaController添加构造函数

public MediaController(Context context, boolean isFromXml, View container) {
  super(context);
  initController(context);
  mFromXml = isFromXml;
  mRoot = makeControllerView();
  if(container instanceof RelativeLayout)
  {
    RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.WRAP_CONTENT);
    p.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    mRoot.setLayoutParams(p);
    ((RelativeLayout)container).addView(mRoot);
  }
}  public MediaController(Context context) {
  super(context);
  if (!mFromXml && initController(context))
    initFloatingWindow();
}

(3)activity中实例化MediaController

//        mVideoView.setMediaController(new MediaController(this));
        mVideoView.setMediaController(new MediaController(this,true,mRelatviLayout));
效果如下:

竖屏显示正常~~

横屏幕:



解决办法:

(1)清单文件中当前activity

设置如下:

android:configChanges="orientation|keyboardHidden|screenLayout|screenSize"

(2)判断屏幕是否是横屏或者竖屏

@Override
public void onConfigurationChanged(Configuration newConfig) {
    //屏幕切换时,设置全屏
    if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        Log.d("haha","切换横屏");
        setFullScreen();
    }
    else
    {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                600);
        mRelatviLayout.setLayoutParams(layoutParams);
        RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.MATCH_PARENT);
        mVideoView.setLayoutParams(layoutParams1);
    }
    super.onConfigurationChanged(newConfig);
}

private void setFullScreen() {
    Log.d("haha","调用设置全屏");

    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT);
    mRelatviLayout.setLayoutParams(layoutParams);
    RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.MATCH_PARENT,
            RelativeLayout.LayoutParams.MATCH_PARENT);
    mVideoView.setLayoutParams(layoutParams1);
}

效果:



像一个正常的播放器了~~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Vitamio是一个开源的跨平台多媒体播放框架,它支持播放多种音频格式,包括WAV格式。要在Android Vitamio播放WAV文件,可以按以下步骤进行: 第一步:添加Vitamio库文件到项目中。在build.gradle文件中添加Vitamio库的依赖项。 第二步:在代码中初始化Vitamio库。在App的入口处(如MainActivity的onCreate方法中),调用Vitamio库的初始化方法,确保Vitamio库已经正确初始化。 第三步:创建一个MediaPlayer对象,用于播放音频文件。可以使用VitamioVitamio.createPlayer方法创建一个MediaPlayer对象。 第四步:设置音频文件的路径。使用MediaPlayer对象的setDataSource方法,传入要播放的WAV文件的路径。 第五步:准备MediaPlayer对象。调用MediaPlayer对象的prepareAsync方法,准备音频文件的播放。 第六步:设置MediaPlayer的监听器。可以注册一个MediaPlayer.OnPreparedListener监听器,用于在音频准备完成后播放音频。 第七步:开始播放音频。调用MediaPlayer对象的start方法,开始播放音频。 第八步:在适当的时机释放MediaPlayer对象。当音频播放完成或不再需要播放时,调用MediaPlayer对象的release方法,释放资源。 通过上述步骤,就可以使用Android Vitamio播放WAV文件了。需要注意的是,确保WAV文件的路径正确,并且要在AndroidManifest.xml文件中添加适当的权限,以允许访问存储器中的音频文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值