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

xiaoxiao2021-02-28  154

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位的工具存放特定目录来编译。

转载请注明原文地址: https://www.6miu.com/read-47705.html

最新回复(0)