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

VLC android 3.0解码器使用及移植TV项目调研

2017-07-10 23:00 399 查看
1.是什么
VLC  Media Player (VideoLAN) 为 Windows、Linux、OS X、Android、iOS、Windows Phone 等平台提供一个视频播放器、解码器。它可以播放来自网络、摄像头、磁盘、光驱的文件,支持包括MPEG 1/2/4, H264, VC-1, DivX, WMV, Vorbis, AC3, AAC等格式的解码。VideoLAN 代码开源,可以使用自行修改、编译解码库嵌入到Android应用app中作为解码器使用。

2.为什么
2.1 众多开源库中选择VLC
   当前音视频解码器开源中有:vitamio、mxplayer 、vlc等,其中前两者解码处理都比较强大,但是商业上使用是收费,而vlc可以支持众多视频格式,并且当前处于一直开发和维护状态,可以免费商业使用;
2.2 优先使用VLC,而不是android SDK自带的 MediaPlayer+SurfaceView
android SDK自带的 MediaPlayer+SurfaceView 简单,但是支持的视频格式有限,且依赖于底层厂商提供的能力;VLC自带解码库,不依赖底层厂商能力。

3.怎么用
3.1 编译环境搭建
3.1.1 搭建虚拟机安装Ubuntu最新版本
使用虚拟机安装Ubuntu最新版本,android sdk及ndk,最新vlc Android需要的ndk只有64位版本,因此,Ubuntu也需要使用64位,剩下的参考videolan的wiki编译步骤编译: https://wiki.videolan.org/AndroidCompile/
 3.2  vlc 3.0嵌入到Android应用
 3.2.1 集成vlc Android工程里的libvlc及解码动态so集成到现有的工程,封装并配libvlc.MediaPlayer的参数即可以;
其中最新的配置参数改变了:
a.使用“--android-display-chroma”而不是之前版本的“--androidwindow-chroma”;
                b.surface callback也需要调整下。
可以参考以下具备正常输出的参数配置
final Context context = mContext;

ArrayList<String> options = new ArrayList<String>(50);

final boolean frameSkip = false;
String chroma = "RV16";
if (chroma.equals("YV12"))
chroma = "";
final boolean verboseMode = true;

int deblocking = -1;
try {
deblocking = getDeblocking(-1);;
} catch (NumberFormatException ignored) {}

int networkCaching = 1500;

final boolean freetypeBackground = false;
final int opengl = 0;

/* CPU intensive plugin, setting for slow devices */options.add("--audio-time-stretch");
options.add("--avcodec-skiploopfilter");
options.add("" + deblocking);
options.add("--avcodec-skip-frame");
options.add(frameSkip ? "2" : "0");
options.add("--avcodec-skip-idct");
options.add(frameSkip ? "2" : "0");
// options.add("--subsdec-encoding");
// options.add("--stats");
/* XXX: why can't the default be fine ? #7792 */
if (networkCaching > 0)
options.add("--network-caching=" + networkCaching);
options.add("--android-display-chroma");

options.add(chroma);
options.add("--audio-resampler");
options.add("--sout-mux-caching="+networkCaching);//输出缓存

options.add("--codec=mediacodec,iomx,all");

if (freetypeBackground)
options.add("--freetype-background-opacity=128");
else
options.add("--freetype-background-opacity=0");
if (opengl == 1){
options.add("--vout=gles2,android_display");
options.add("--aout=opensles");
} else if (opengl == 0)
options.add("--vout=android_display,none");

/* Configure keystore */
options.add("--keystore");
options.add("--keystore-file");
options.add(new File(context.getDir("keystore", Context.MODE_PRIVATE), "file").getAbsolutePath());

options.add("-vvv");

4.优缺点
4.1 优点
不需要后台提供专门的播放url地址及服务,只需要复用下载的url即可,节省服务端资源且避免转码延迟的问题导致不能播放的。
4.2 不足及补救
   因为集成解码库,并且不同类型的CPU(arm-v7a、x86、mips),需要编译不同的编译库,因此相对封装使用android 自带的 MediaPlayer会大很多;解决的思路是预置最多使用cpu类型如arm-v7a ,其他类型的cpu从后台下载完成后加载,再使用。

5.FAQ
Q:使用封装好的vlc播放器播放天翼云的资源url总是失败?
A:因为云资源的url返回支持ETag,但是不支持客户端使用If-Match访问而返回错误,修改vlc解码库中的文件file.c,去掉If-Match参数。

Q:下载vlc android工程编译工具时报gcc错误
A:注意使用最新的vlc android工程,因为旧的Android版本在64位机子上,当编译工具时需要32位的辅助编译工具时,找不到对应的gcc;最新的vlc Android工程在编译时会提取32位的工具存放特定目录来编译。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: