vlc源码分析(1)--vlm.c 添加简单推流器逻辑

参照源码分析之前博客中使用libvlc推流的demo 的细节。

之前使用libvlc推流的demo,只调用了三个关键函数

vlc = libvlc_new(0, NULL);

int libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance,
                              const char *psz_name,
                              const char *psz_input,
                              const char *psz_output, int i_options,
                              const char * const *ppsz_options,
                              int b_enabled, int b_loop );

int libvlc_vlm_play_media( libvlc_instance_t *p_instance,
                           const char *psz_name );

创建vlc,添加broadcast, 播放。

查看linux版本的vlc执行逻辑,是没有看到vlm相关调用的,也就是说vlc-linux 客户端是没有用到vlm,但是一样的功能,简单的分析了下,vlc主要的循环体(执行读数据解码到输出的线程)在 input.c文件中,input部分。上面通过不同的方式创建input线程并设置好input的参数(输入输出),就有了vlc的主要功能。可以全工程搜索一下input_Create这个函数,真正调用的,只有三处地方:

1: playlist/thread.c

2: src/input/vlm.c

3: lib/media_player.c

这三个地方的调用,对应vlc三种使用方法: 1: linux客户端执行程序调用 2:vlm 即我们demo使用的这种方法 3:供android 播放器 (jni层)调用的。(可以在android app 源码下面的jni中找到对mediaplayer 的封装)估计也是这个原因,在编译vlc-android 源码的时候得到的 aar包里面的libvlc默认是没有开启 vlm模块的。

这里主要来分析下 vlm.c这个文件(这个文件有两个,一个是/lib 目录下,主要是一个外部的封装,一个是 /src/input 目录下,是具体和 input进行相关控制实现的内容。)

调用的vlm的接口 libvlc_vlm_add_broadcast,libvlc_vlm_play_media,libvlc_vlm_pause_media,libvlc_vlm_stop_media都在 /lib/vlm.c中。

/src/input/vlm.c

一张ppt解释下,文字码多了没耐心看。 借用某本书的一句比喻,函数即剧情,数据结构为人物。所以下面的图主要列了"人物",剧情以文字部分简单介绍,"人物"之间的关系,左边的罩着右边的,头部对齐,太拥挤的就用同样的着色表示从属关系

调用libvlc_vlm_add_broadcast ,创建了vlm,设置了相关参数到vlm_media_sys_t(一个media对应一个)中的 ppsz_input;ppsz_option. 即在外面传入的 文件路径,sout输出参数。

调用libvlc_vlm_play_media ,创建 vlm_media_instance_sys_t,使用上面的两个输入和输出的参数 设置到 input_item;

然后用盖input_item创建一个 input,启动input线程,剩下的事情都交给了input线程处理数据了。

猜你喜欢

转载自blog.csdn.net/u012459903/article/details/88844133
今日推荐