之前学习了MediaPlayer
https://blog.csdn.net/nishigesb123/article/details/89479084
但MediaPlayer支持的媒体格式其实是有限的,在开头也提到,安卓多媒体其实也涉及了很多第三方框架。
这篇文章就是关于安卓的多媒体播放的一个第三方框架——Vitamio框架,它几乎支持所有的媒体格式。
官网地址:https://www.vitamio.org/
英文官网地址(?):https://www.vitamio.org/en/项目地址:https://github.com/yixia/VitamioBundle
建从下面地址下载!!理由参考:https://blog.csdn.net/nishigesb123/article/details/89576962
新项目地址(?):https://github.com/yixia/VitamioBundleStudio
?是摘自官网的介绍
Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。到目前,全球已经有超过 一万 种应用在使用 Vitamio,覆盖用户超过 5亿 。
Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 与 iOS 上跨平台支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。
流媒体支持
Vitamio 支持各种常见的流媒体协议,可以点播或者直播音频和视频,例如如下常见协议均能无缝支持:
- MMS
- RTSP (RTP, SDP), RTMP
- HTTP progressive streaming
- HLS - HTTP live streaming (M3U8)
音频和视频格式
Vitamio 使用了 FFmpeg 做为媒体解析器和最主要的解码器,同时开发了针对不同移动平台的硬解码方案,能够完美支持 H.264/AVC、H.263、 MPEG4 等常见的视频编码,覆盖上百种多媒体格式。下表只是一些最常见的视频格式支持,除特殊标明,全部支持硬件加速:
- DivX/Xvid
- WMV (一般只有软解码)
- FLV
- TS/TP
- RMVB (只有软解码)
- MKV
- MOV
- M4V
- AVI
- MP4
- 3GP
字幕支持
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) 内置字幕
更多特性
除了上面列出的常见功能之外,Vitamio 还做了相当多人性化的工作:
- 多音轨与字幕支持
- 细致的 CPU 与 GPU 优化
- 支持手机到平板各种设备
- 流媒体播放缓冲支持
- 播放画面比例大小随手调节
- 自动文字编码检测,拒绝乱码
还有更多新特性没有被列出,请参考开发文档。
?下面是官方的导入介绍
导入使用
1、导入。下载回来后大家可能发现没有.project工程文件,可以通过File -> Import -> Android -> Existing Android Code Into Workspace来导入工程,然后改一下工程名称即可。
2、将VitamioBundle工程作为Android Library引入Demo工程使用即可。
注意:
如果是Windows用户,请将VitamioBundle与Demo工程放在同一个文件夹下,否则添加Android Library可能失败,其他问题一般clean一下重新编译一下就好了。其他问题请参考错误大全。
在官网或Github下载完整Vitamio项目后
在自己的项目右键
New一个Module
选择Liberary
点击Next,进行配置
配置说明:看我们下载好的vitamio项目,观察src文件夹,可以得出包名其实是io.vov.vitamio的结论,所以?也填这个
完毕后将图示文件复制到我们的vitamio即可
切换到project视图,或者直接在项目目录操作
把下载的vitamio项目的libs文件夹里的四个子文件夹内容复制
把下载的vitamio项目的libs文件夹里的三个子文件夹内容选中,拷贝。
在项目app/src/main目录创建jniLibs文件夹,并把?复制进来
一开始都不知道As原来只认这个目录 搞了好久
https://blog.csdn.net/nishigesb123/article/details/89576962
最后grade加一下这句话,这么不智能,这种竟然不是自动帮我补上的吗。。。
至此已经导入完毕
然后还是遇到了点什么错误,说raw里啥啥没有,后来索性把res文件夹里的东西也复制了一份到自己的项目
?下面就是敲代码咯
可以参考下载的源码项目的配置文件,需要以下权限。
需要的申明
布局文件
MainActivity
package com.example.a4_26vitamio;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.io.File;
import java.io.IOException;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.LibsChecker;
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {
//注意导包import io.vov.vitamio.MediaPlayer;别错了
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载so类库(通常使用C、C++编写类库)
if (!LibsChecker.checkVitamioLibs(this))
return;
setContentView(R.layout.activity_main);
//初始化播放器
initMediaPlay();
}
private void initMediaPlay() {
mediaPlayer = new MediaPlayer(this);
}
public void play(View v) {
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + File.separator +"a1.mp3";
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(path);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
public void pause(View v) {
mediaPlayer.pause();
}
public void stop(View v) {
mediaPlayer.stop();
mediaPlayer.release();
}
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
}
效果的话是看不出啥效果了, 声音确实是有哒
控制台倒是输出了一堆日志,非常完整
点击暂停
点击停止
新建一个Activity
之前学习了surfaceView可以播放视频,也了解到videoView也可以播放视频,但性能较差
在Vitamio框架重写了videoView,使得其不仅性能大幅提升,而且支持的格式也有了翻天覆地的变化。
首先是布局,按照?的描述,我们加入一个VideoView,注意是io.vov.vitamio.widget下的
样式已经
?是代码部分
package com.example.a4_26vitamio;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.File;
import io.vov.vitamio.LibsChecker;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;
public class Main2Activity extends AppCompatActivity {
//注意导包别导错
private VideoView vv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载so类库(通常使用C、C++编写类库)
if (!LibsChecker.checkVitamioLibs(this))
return;
setContentView(R.layout.activity_main2);
setContentView(R.layout.activity_main2);
vv = findViewById(R.id.surface_view);
MediaController mc = new MediaController(this);
vv.setMediaController(mc);
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + File.separator + "test.mp4";
//路径
vv.setVideoPath(path);
//获取焦点
vv.requestFocus();
vv.start();
}
}
效果如?
框架已经设计好了UI部分才对,点击应该可以换出控制条,如果显示不出来,如左,可能是没有导入res的相关文件,实际效果如右图。
如果对UI的控制台不满意,可以手动去修改源码的布局文件。