VLC学习(1) Linux 下编译 VLC for Android

最近在研究VLC播放器,主要目的是使用Android平台VLC播放器进行RTMP直播,研究目的是为了降低RTMP直播的延迟,目标将延迟降到1s以内。

首先需要在Linux(本人使用Ubuntu 14)下编译VLC for Android的源码,根据官方的Wiki,以及自己实际操作的步骤,总结为如下:

1. 安装及更新系统工具

#apt-get install ant autoconf automake autopoint cmake gawk gcc g++ libtool m4 patch pkg-config ragel subversion unzip

2. 安装VLC相关依赖库

#apt-get build-dep vlc

3. 安装配置JDK
从Oracle官网下载JDK,VLC官方推荐使用JAVA 6版本,我解压的目录是"/usr/lib/jvm".
下载后解压,并根据解压目录设置环境变量如下:

#vi /etc/profile
   export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45
   export PATH=$JAVA_HOME/bin:$PATH
   export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#source /etc/profile

4. 下载Android sdk及ndk并设置环境变量
从官方网站下载,并解压。国内源(http://mirrors.neusoft.edu.cn/android/repository/

#vi /etc/profile
   export ANDROID_SDK=/path/to/android-sdk
   export ANDROID_NDK=/path/to/android-ndk
   export PATH=$PATH:$ANDROID_SDK/platform-tools:$ANDROID_SDK/tools
#source /etc/profile

另外,编译是可能需要不止一个版本的SDK,我在编译时下载的SDK 20版本,但是还需要19和21版本,这里只需要在Android SDK的目录下的platforms下新建“Android-19”和“Android-21”目录,并下载对应的SDK放置其中即可。




- 阅读剩余部分 -

关于利用WaitForMultipleObjects实现Reactor模型中各事件的触发条件

0x00
最近研究ACE中Reactor模型在windows平台中的实现,在ACE的源码中,使用了WaitForMultipleObjects()来实现同步事件分离程序,该模型中主要涉及的事件有:

FD_CONNECT
FD_ACCEPT
FD_WRITE
FD_READ
FD_CLOSE

当然还有其他一些事件,这里主要讨论这五类事件的触发条件。

0x01
FD_CONNECT

  1. 调用了connect(ConnectEx, WSAConnect, WSAConnectByList, or WSAConnectByName),并且连接建立后。

FD_ACCPET

  1. 初始阶段,当有请求建立连接时。[初始阶段:之前没有任何一次连接请求]
  2. 有连接请求,并且前一个连接请求已经调用accept()之后。

FD_WRITE

  1. 客户端socket首次调用connect(其他类connect API)连接服务器。
  2. 服务器阻塞在accept(其他类accept API)中socket成功返回。
  3. 调用send返回WSAEWOULDBLOCK,并且直到发送缓冲区准备好(为空)后。

注:3的含义其实就是当发送缓冲区满了之后,调用send会返回一个WSAEWOULDBLOCK错误,接着当发送缓冲区将数据全部发送之后,会触发FD_WRITE消息,告知上层可以继续调用send了。



- 阅读剩余部分 -

Windows代码注入的那些事儿

最近一直在研究关于代码注入的问题,看到最经典的文章应该就是《Three Ways to Inject Your Code into Another Process》,如果想看细节可以直接去看这篇文章。本文主要讨论关于在Win Vista/7等系统中将代码注入系统进程的方法,在WinXP以及之前的版本中,利用CreateRemoteThread就可以不受限制地注入进程,然而到了WinVista/7系统中,在注入系统进程的时候会失败,查看失败代码为8,进一步查MSDN的描述为:ERROR_NOT_ENOUGH_MEMORY。实际意思就是没有足够的存储可用来处理此命令,可以这和线程注入有什么关系呢,因为之前已经使用了VirtualAllocEx来申请了内存,怎么会没有足够的存储呢?想不通的时候只能仔细去看MSDN,果然看到了关键性的一句话:

Terminal Services isolates each terminal session by design. Therefore, CreateRemoteThread fails if the target process is in a different session than the calling process.

- 阅读剩余部分 -