导航:首页 > 操作系统 > androidvlcdemo

androidvlcdemo

发布时间:2023-06-30 00:46:05

‘壹’ vlc-android要怎么用

一.认识android的架构
Android其本质就是在标准的linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。

二.搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了, 国内开发者访问(androiddevtools) 上面已经有了所有你要的资源,同时可以下载到我们的主角framework

但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。

搭建源码编译环境
http://www.cnblogs.com/bluestorm/p/4419135.html
https://source.android.com/source/downloading.html(这里详细的介绍了如何下载编译)
三.开始主题

在一开始写c程序的时候都有一个运行的入口,比如
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

//这里的main就是应用的入口
int main(int argc, const char * argv[]){
return 0;
}

在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")

#include <stdio.h>
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
//加载套接字库,如果失败返回
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}

//判断高低字节是不是2,如果不是2.2的版本则退出
if (LOBYTE(wsaData.wVersion) != 2 ||

HIBYTE(wsaData.wVersion) != 2)

{
return;
}

//创建流式套接字,基于TCP(SOCK_STREAM)

SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);

//Socket地址结构体的创建

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换

//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行

listen(socSrv, 5);

SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体

int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof

//循环等待接受客户端发送请求

while (1)
{
//等待客户请求到来;当请求到来后,接受连接请求,

//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞

SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);

char sendBuf[100];

sprintf(sendBuf, "Welcome %s to JoyChou",

inet_ntoa(addrClient.sin_addr));//格式化输出

//用返回的套接字和客户端进行通信

send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节

//接收数据

char recvBuf[100];

recv(sockConn, recvBuf, 100, 0);

printf("%s\\n", recvBuf);
closesocket(sockConn);

}
}

他采用了一个while死循环去监听客户端的请求。
在一遍啰嗦之后,主角终于闪亮的登场了。

先上源代码
public final class ActivityThread {

public static void main(String[] args) {
SamplingProfilerIntegration.start();

CloseGuard.setEnabled(false);

Environment.initForCurrentUser();

EventLogger.setReporter(new EventLoggingReporter());

Security.addProvider(new AndroidKeyStoreProvider());

final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);

Process.setArgV0("<pre-initialized>");

Looper.prepareMainLooper();

//从中可以看到为app开辟了一个线程进入了looper之中

ActivityThread thread = new ActivityThread();
thread.attach(false);

if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}

AsyncTask.init();

if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}

Looper.loop();

throw new RuntimeException("Main thread loop unexpectedly exited");
}

}

看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
Looper.prepareMainLooper();

Looper.loop();

进一步深入代码
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;

Binder.clearCallingIdentity();
final long ident = Binder.clearCallingIdentity();

// 在这里看到了一个循环监听消息

for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}

Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}

msg.target.dispatchMessage(msg);

if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}

// Make sure that ring the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity();
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what);
}

msg.recycleUnchecked();
}
}

‘贰’ vlc for android 源码能不能在windows环境下编译

1. 准备编译环境

基本上按照这篇wiki的介绍就足够了,为了顺利完成编译,建议首先保证相关的软件或者依赖库都已经下载好了,我再强调一下几个重点注意事项。

(1) Android SDK:必须使用SDK Platform Android 5.0, API 21,因为VLC-for-android用到了Android 5.0 的一些API。

(2) 最好通过apt-get install 把下面这些依赖的软件都安装一遍,或更新到最新版

git,apache-ant (or ant), autoconf, automake, autopoint, cmake,
gawk (or nawk), gcc, g++, libtool, m4, patch, pkg-config, ragel,
subversion, unzip.

2. 下载源码包

直接通过git下载VLC-for-android最新的源码即可:

git clone git://git.videolan.org/vlc-ports/android.git

3. 编译VLC源码和VLC Android工程

(1) 配置编译环境变量

具体参考wiki的介绍,你可以写个shell脚本来执行,避免每次编译都要配置,下面是我的环境变量,可以根据你的路径修改:

#! /bin/sh

export ANDROID_SDK=/opt/android/sdk/

export ANDROID_NDK=/opt/android/android-ndk-r10/

export ANT_DIR=/opt/android/ant/

export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools:$ANT_DIR

export ANDROID_ABI=armeabi-v7a

(2) 执行编译

sh compile.sh

VLC不愧是使用这么广泛的播放器,它的编译脚本写得非常强大和智能,直接通过执行compile.sh,它会自动check所有的依赖,并通过网络去下载缺失的库。

首先,它会下载vlc的源码,并存放在当前目录下。然后去下载依赖的第三方库文件。

当然,由于GFW的存在,有的时候下载会失败,这个时候,就需要你手动去Google搜索它正在下载的依赖文件,手动下载好了之后放到 vlc/contrib/tarballs目录下,然后再回到命令行重新执行 sh compile.sh

它依赖的全部第三方库文件如图所示:

(3) 编译问题

编译过程还算顺利,只出现过一个大问题,如下:

google/protobuf/unittest.proto:853:21: Missing field number.

google/protobuf/unittest.proto:862:1: Reached end of input in message definition (missing '}').

make[3]: *** [unittest_proto_middleman] Error 1

网上也搜不到解决方案,我看了下GitHub上Protobuf的Readme,然后下载了最新的protobuf放到vlc/contrib
/tarballs/contrib-android-arm-linux-androideabi/protobuf目录下,执行.
/configure --disable-shared,再编译,没想到就直接过了。

4. 加载VLC-For-Android的Java工程

编译通过后,就可以直接在vlc-android/bin目录下看到debug版的apk了,下面简单说说在Eclipse中加载vlc-android的整个工程。

打开Eclipse,选择Import,把vlc-for-android目录下所有的工程到导入到Eclipse中(我去掉了TV工程),如图所
示,有5个必须的工程,其中,VLC是主工程,其他四个都是Lib工程。没有什么意外的话,直接运行VLC工程,就可以在Android手机上看到VLC
播放器应用了!

‘叁’ 解决Android Vlc编译报错couldn't find "libcompat.7.so

在build.gradle的defaultConfig下面添卜让困加

ndk{

    abiFilters"armeabi","armeabi-v7a","x86","mips"

}

重新编译即可。。

具体什么原因。。低级错误就型念不解释滑基了

‘肆’ 如何用 Android 手机远程控制 Linux 桌面 VLC 播放器

准备条件

Android 手机和桌面 Linux 位于同一无线网络,是否可以访问互联网不重要。
Android 手机上安装免费开源的 Remote for VLC(Code 首页)
已经在 Linux 桌面环境下安装好 VLC 2.0 播放器。

下文将以 Fedora 17 为例介绍这一过程。
启用 VLC http 远程控制支持
启动 VLC,在主界面上依次点击“工具”-“首选项”-左下角选择“全部”-左侧列表中选择“主界面”-在右侧勾选“Web”。如下图所示:




保存并关闭 VLC。
之后需要编辑 VLC 的 Lua 主机配置文件,允许可以访问的网络段。比如可以用以下命令以 root 用户身份打开配置文件:
su -c 'vim /usr/share/vlc/lua/http/.hosts'
一般正常的人会仅希望局域网内的 Android 手机可以访问并控制桌面上的 VLC,于是取消 # private addresses下面几行开头的注释即可。
保存更改并退出编辑器。
设置防火墙策略
找到系统设置中的防火墙,或者通过在终端输入 system-config-firewall 的方式启动。
VLC 的远程控制默认通过 8080 端口实现,所以在左侧选择“其他端口”,然后通过右侧依次添加 TCP/UDP 8080 端口。
(可选)Android 手机支持通过 Avahi 的方式自动寻找查找网络中的可用主机,如果需要这个功能的话在左侧选择“可信的服务”,然后在右侧勾选“多点广播 DNS (mDNS)”。如果不用启用该项的话就需要在 Remote for VLC 手动输入 IP 地址和端口。
完成之后点击工具栏上的“应用”保存防火墙配置。
开始使用
再次启动 VLC 播放器,在主界面上选择“视图”-“添加界面”-选择“Web”。
在 Android 手机上启动 Remote for VLC,稍等一下应该就会显示在网络中找到的所有 VLC 实例,轻触即可链接。
此时你就可以远离键盘和鼠标,坐在沙发上享受 VLC 带来的影音体验了:

支持音量、音轨、字幕轨、全屏模式的调整,显示媒体信息。
支持创建播放列表。
支持浏览桌面 Linux 上的文件系统(知道为何不建议通过互联网访问了吧……)
试验性的支持 DVD 菜单。
可以在有来电时自动暂停媒体播放。

阅读全文

与androidvlcdemo相关的资料

热点内容
图库的文件夹是哪个 浏览:503
程序员为什么药学日语 浏览:421
熟悉linux常用命令 浏览:857
印度外卖小哥是程序员 浏览:411
绍兴程序员开发驻场流程 浏览:541
索纳塔8的压缩比 浏览:14
私有云主要服务器 浏览:939
为什么主题解压那么慢 浏览:860
怎么下载扫描二维码的手机app 浏览:727
云服务器创建私有镜像的时候一定要关机吗 浏览:115
php开发学习门户 浏览:385
传奇游戏服务器怎么设置 浏览:823
敲击东西解压完整版 浏览:401
刺络学pdf 浏览:868
怎么给手机文件夹设置封面 浏览:931
汽车保养app怎么用 浏览:62
线程javalock 浏览:897
c语言编译运行结果查看器 浏览:114
androidpx转dip 浏览:843
西藏编译局是什么级别 浏览:1003