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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值