vlc源碼分析(1)--vlm.c 添加簡單推流器邏輯

/*********vlc rtsp廣播推流mp4文件 源碼流程分析***********/

vlc源碼分析(1)--vlm.c 添加簡單推流器邏輯

vlc源碼分析(2)--input.c mp4文件解複用,mp4模塊加載

vlc源碼分析(3)-decoder.c 使用vlm rtsp方式輸出流過程

vlc源碼分析(4)-stream_out/rtsp.c vlc中rtsp服務端

參照源碼分析之前博客中使用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線程處理數據了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章