注明

转载请注明出处:http://blog.csdn.net/cuiran/article/details/35987853

正文

继《第一篇、vlc-android之开篇介绍

http://blog.csdn.net/cuiran/article/details/30054835

本篇介绍一下vlc-android的源码


如图所示,libvlc是对应vlc jni的class
自己可以写个简单的Activity
/**
 * DemoActivity.java
 * Copyright(C) 2014
 * creator:cuiran 2014-6-11 下午3:34:58
 */
package org.videolan.vlc.gui;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import org.videolan.libvlc.LibVlcException;
import org.videolan.libvlc.LibVlcUtil;
import org.videolan.vlc.AudioServiceController;
import org.videolan.vlc.Util;
import org.videolan.vlc.gui.audio.AudioPlayer;
import org.videolan.vlc.gui.video.VideoPlayerActivity;
import org.videolan.vlc.widget.SlidingPaneLayout;

import com.actionbarsherlock.app.ActionBar;
import com.slidingmenu.lib.SlidingMenu;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * TODO
 * @author cuiran
 * @version 1.0.0
 */
public class DemoActivity extends Activity {
	public final static String TAG = "VLC/DemoActivity";
	 protected static final String ACTION_SHOW_PROGRESSBAR = "org.videolan.vlc.gui.ShowProgressBar";
	    protected static final String ACTION_HIDE_PROGRESSBAR = "org.videolan.vlc.gui.HideProgressBar";
	    protected static final String ACTION_SHOW_TEXTINFO = "org.videolan.vlc.gui.ShowTextInfo";
	    public static final String ACTION_SHOW_PLAYER = "org.videolan.vlc.gui.ShowPlayer";

	    private static final String PREF_SHOW_INFO = "show_info";
	    private static final String PREF_FIRST_RUN = "first_run";

	    private static final int ACTIVITY_RESULT_PREFERENCES = 1;
	    private static final int ACTIVITY_SHOW_INFOLAYOUT = 2;

	    private ActionBar mActionBar;
	    private SlidingMenu mMenu;
	    private SidebarAdapter mSidebarAdapter;
	    private AudioPlayer mAudioPlayer;
	    private AudioServiceController mAudioController;
	    private SlidingPaneLayout mSlidingPane;

	    private View mInfoLayout;
	    private ProgressBar mInfoProgress;
	    private TextView mInfoText;
	    private View mAudioPlayerFilling;
	    private String mCurrentFragment;
	    private String mPreviousFragment;
	    private List<String> secondaryFragments = Arrays.asList("albumsSongs", "equalizer",
	                                                            "about", "search", "mediaInfo",
	                                                            "videoGroupList");
	    private HashMap<String, Fragment> mSecondaryFragments = new HashMap<String, Fragment>();

	    private SharedPreferences mSettings;

	    private int mVersionNumber = -1;
	    private boolean mFirstRun = false;
	    private boolean mScanNeeded = true;

	 @Override
	public void onCreate(Bundle savedInstanceState) {

		 if (!LibVlcUtil.hasCompatibleCPU(this)) {
	            Log.e(TAG, LibVlcUtil.getErrorMsg());
	            Intent i = new Intent(this, CompatErrorActivity.class);
	            startActivity(i);
	            finish();
	            super.onCreate(savedInstanceState);
	            return;
	        }

		   /* Get the current version from package */
	        PackageInfo pinfo = null;
	        try {
	            pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
	        } catch (NameNotFoundException e) {
	            Log.e(TAG, "package info not found.");
	        }
	        if (pinfo != null)
	            mVersionNumber = pinfo.versionCode;

	        /* Get settings */
	        mSettings = PreferenceManager.getDefaultSharedPreferences(this);

	        /* Check if it's the first run */
	        mFirstRun = mSettings.getInt(PREF_FIRST_RUN, -1) != mVersionNumber;
	        if (mFirstRun) {
	            Editor editor = mSettings.edit();
	            editor.putInt(PREF_FIRST_RUN, mVersionNumber);
	            editor.commit();
	        }

	        try {
	            // Start LibVLC
	            Util.getLibVlcInstance();
	        } catch (LibVlcException e) {
	            e.printStackTrace();
	            Intent i = new Intent(this, CompatErrorActivity.class);
	            i.putExtra("runtimeError", true);
	            i.putExtra("message", "LibVLC failed to initialize (LibVlcException)");
	            startActivity(i);
	            finish();
	            super.onCreate(savedInstanceState);
	            return;
	        }

	        super.onCreate(savedInstanceState);
	        /* Set up the audio player */
	        mAudioPlayer = new AudioPlayer();
	        mAudioController = AudioServiceController.getInstance();
	        mAudioController.addAudioPlayer(mAudioPlayer);
	        AudioServiceController.getInstance().bindAudioService(this);
	        //http://192.168.1.196/video/hao.mpg
	        String filepath="udp://@239.1.1.0:1234";

		   mAudioController.load(filepath, false);
		   mAudioController.play();
		   VideoPlayerActivity.start(this, filepath);
	}

}

重点要阅读类VideoPlayerActivity,里面给出了一些方法等!
所需要的so文件我们可以把apk解压后获得,


在此也很感谢vlc团队将代码开源出来,我们可以根据自己需要进行修改。


第二篇、vlc-android之源码介绍的更多相关文章

  1. 第二篇:白话tornado源码之待请求阶段

    上篇<白话tornado源码之一个脚本引发的血案>用上帝视角多整个框架做了一个概述,同时也看清了web框架的的本质,下面我们从tornado程序的起始来分析其源码. 概述 上图是torna ...

  2. 【转】Android LruCache源码介绍

    本文来源:转载自: http://blog.csdn.net/linghu_java/article/details/8574102 package android.util; import java ...

  3. Android lifecyle 源码解剖 - gdutxiaoxu的博客(微信公众号 stormjun94)

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/gdutxiaoxu/article/det ...

  4. Java中常用的七个阻塞队列第二篇DelayQueue源码介绍

    Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...

  5. 【安卓本卓】Android系统源码篇之(一)源码获取、源码目录结构及源码阅读工具简介

    前言        古人常说,“熟读唐诗三百首,不会作诗也会吟”,说明了大量阅读诗歌名篇对学习作诗有非常大的帮助.做开发也一样,Android源码是全世界最优秀的Android工程师编写的代码,也是A ...

  6. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  7. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  8. 【转】编译Android系统源码和内核源码

    原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...

  9. Android -- AsyncTask源码解析

    1,前段时间换工作的时候,关于AsyncTask源码这个点基本上大一点的公司都会问,所以今天就和大家一起来总结总结.本来早就想写这篇文章的,当时写<Android -- 从源码解析Handle+ ...

随机推荐

  1. kafka Centos7.2 单机集群搭建

    前提是已经安装好了zk集群 1.下载  kafka_2.11-1.0.0.tgz  下载网址 http://kafka.apache.org/documentation.html 2.解压  tar ...

  2. FJUT寒假作业第三周数蚂蚁(记录第一道并查集)

    http://210.34.193.66:8080/vj/Contest.jsp?cid=162#P7 思路:用并查集合并集合,最后遍历,找到集合的根的个数. 并查集是森林,森林中的每一颗树是一个集合 ...

  3. 利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...

  4. python笔记十(列表生成式、字典生成式、生成器、生成器的并行)

    一.列表生成式 列表生成式就是python设置的可以用来可以生成列表的. 如要生成一个0-9的列表我们可以通过以下代码实现: >>> list(range(10)) [0, 1, 2 ...

  5. PHP 高级过滤器

    PHP 高级过滤器 检测一个数字是否在一个范围内 以下实例使用了 filter_var() 函数来检测一个 INT 型的变量是否在  1 到 200 内: 实例 <?php$int = 122; ...

  6. Programming In Scala笔记-第四章、类和对象

    类似于Java,Scala中也有类和对象的概念. 一.类.属性和方法 1.类 类是对一类事物的抽象,当一个类被定义后,就可以以该定义为模板,定义该类的一系列对象.比如说有以下一个模板 人类: 有姓名: ...

  7. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  8. 【Unity Shader】Unity Chan的卡通材质

    写在前面 时隔两个月我终于来更新博客了,之前一直在学东西,做一些项目,感觉没什么可以分享的就一直没写.本来之前打算写云彩渲染或是Compute Shader的,觉得时间比较长所以打算先写个简单的. 今 ...

  9. iOS网络基础

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51376048 本文出自:[openXu的博客] 常用类 get请求 post请求 NSURL ...

  10. Xcode无法安装基于ruby的插件问题的解决

    Xcode有时需要安装一些第三方插件,很多插件是基于ruby的,确切的说是基于ruby gem的! 但是在国内有一个很尴尬的情况,就是官方的gems网站:https://rubygems.org 的安 ...