您的位置:首页 > 移动开发 > Android开发

android 视频播放器Vitamio踩坑之路

2018-02-26 14:45 134 查看
一、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);
}
效果:



像一个正常的播放器了~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息