VLC优化(2)修改VLC读缓冲机制

0x00 前置信息

为进一步降低延迟,采用极端方法修改VLC读缓冲机制。

0x01 VLC读缓冲机制

对于一个rtmp流的读取,发起端在Demux module中,具体在该模块的Demux方法中调用ffmepg的接口av_read_frame读取每一帧数据。但是这个read的接口实在不清晰,经过了多个抽象层的封装,最后真正指向了rtmp_read接口。还是通过一个图来看会比较清晰:

vlc_demux_read_analysis.png

上图描述了read指针的指向,由read的指向可以看出VLC中抽象层次的关系。
Demux layer 开始调用av_read_frame接口,在ffmpeg中经过层层调用,s->read_packet实际指向了Demux layer中IORead接口,然后再进一步指向Stream layer;Stream layer的AReadStream指向了Access layer的Read接口,最终Read接口调用了ffmpeg的接口avio_read,至进一步指向了rtmp_read接口。

- 阅读剩余部分 -

VLC优化(1) avformat_find_stream_info接口延迟降低

0x00 前置信息

版本:ffmpeg2.2.0
文件:vlc src/module/demux/avformat/demux.c
函数:OpenDemux

0x01 研究背景

ffmpeg的两个接口avformat_open_input和avformat_find_stream_info分别用于打开一个流和分析流信息。在初始信息不足的情况下,avformat_find_stream_info接口需要在内部调用read_frame_internal接口读取流数据,然后再分析后,设置核心数据结构AVFormatContext。由于需要读取数据包,avformat_find_stream_info接口会带来很大的延迟,那么有几种方案可以降低该接口的延迟,具体如下:

- 阅读剩余部分 -

VLC学习(2) VLC架构及流程分析

0x00 前置信息

VLC是一个非常庞大的工程,我从它的架构及流程入手进行分析,涉及到一些很细的概念先搁置一边,日后详细分析。

0x01 源码结构(Android Java相关的暂未分析)

# build-android-arm-linux-androideabi/:第三方库。
# modules/:模块代码。
# modules/demux:      解复用模块代码。
# modules/codec:       解码模块相关代码。
# modules/access:    访问模块相关代码。
# 其他:未详细分析。
# src/: VLC架构核心代码。
# src/config/:           从命令行和配置文件加载配置,提供功能模块的读取和写入配置。
# src/control/:            提供动作控制功能,如播放/暂停,音量管理,全屏,日志等。
# src/extras/:             平台特殊性相关代码。
# src/modules/:          模块管理。
# src/network/:           提供网络接口。
# src/posix/:               多线程相关。
# src/osd/:                 显示屏幕上的操作。
# src/interface/ :         提供代码中可以调用的接口中,如按键后硬件作出反应。
# src/playlist/:            管理播放功能,如停止,播放,下一首,随机播放等。
# src/text/:                 字符集。
# src/input/:               输入流相关代码。
# src/video_output/ :   初始化视频播放器,把从解码器获得的数据处理后播放。
# src/audio_output/ :   初始化音频混合器,把从解码器获得的数据处理后播放。
# src/stream_output/:  输出音频流和视频流到网络。
# src/test/:                  libvlc测试模块。
# src/misc/:                libvlc使用的其他部分功能,如线程系统,消息队列,CPU的检测,对象查找系统,或平台的特定代码。
# 其他:未详细分析。

0x02 基础概念

对于一个视频的播放,播放器的执行步骤大致如下:

  1. 读取原始数据
  2. 解复用
  3. 解码
  4. 显示

- 阅读剩余部分 -

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放置其中即可。

- 阅读剩余部分 -