zoukankan      html  css  js  c++  java
  • VLC祥解

    功能部份:
     
    VLC媒體播放器的核心是libvlc ,它提供了界面,應用處理功能,如播放列表管理,音頻和視頻解碼和輸出,線程系統。所有libvlc源文件設在的/src目錄及其子目錄:
     
    # config/ :從命令行和配置文件加載配置,提供功能模塊的讀取和寫入配置
    # control/: 提供動作控制功能,如播放/暫停,音量管理,全屏,日誌等。
    # extras/: 大多是平台的特殊代碼
    # modules/: 模塊管理
    # network/: 提供網絡接口(socket管理,網絡錯誤等)
    # osd/: 顯示屏幕上的操作
    # test/: libvlc測試模塊
    # text/: 字符集
    # interface/ : 提供代碼中可以調用的接口中,如按鍵後硬件作出反應。
    # playlist/: 管理播放功能,如停止,播放,下一首,隨機播放等
    # input/: 建立並讀取一個輸入流,並且分離其中的音頻和視頻,然後把分離好的音頻流和視頻流發送給解碼器.
    # video_output/ : 初始化視頻播放器,把從解碼器得到的視頻畫面轉化格式(從YUV 轉為 RGB)然後播放它們
    # audio_output/ : 初始化音頻混合器,即設置正確的同步頻率,並對從解碼器傳來的音頻流重新取樣
    # stream_output/: 輸出音頻流和視頻流到網絡
    # misc/: libvlc使用的其他部分功能 ,如線程系統,消息隊列, CPU的檢測,對像查找系統,或平台的特定代碼。
     
    模塊部份:
     
    VLC媒體播放器的模塊部份,在/modules的子目錄下(詳細說明可以參考其下的List文件),這些模塊只在程序載入它們時有效.每一個模塊,可提 供不同的功能,它們會適合的特定文件或某一特定的環境.此外,audio_output/video_output/interface 模塊都寫成了可跨平台的代碼,方便支持新的平台(如beos或服務Mac OS X ) 。
     
    插件模塊可以在 src/modules.c 和 include/vlc_modules*.h 提供函數中,動態加載和卸載
     
    LibVLC可以將模塊直接插入到應用程序中,例如不支持動態加載代碼的操作系統.模塊靜態插入到應用程序叫內建.
     
     
    1.vlc.c 只是入口程序
    2.Libvlc.c 是各個模塊的結合點,這要是對接口編程
    Vlc_Create(): 兩個重要的數據結構:libvlc_t & vlc_t , 所有的參數傳遞都在這裡面
    Vlc_Init(): 初始化參數, module_bank
    Vlc_AddInf(): 添加module
    3./src/misc/configure.c 命令行參數和參數文件分析
    參數文件是~/.vnc/vlcrc。其中可以設置log文件的位置
    4./include/ 所有頭文件的集合
    5./src/interface/Interface.h 所有module的集合
    6./src/misc/Modules.c
    其中module_t * __module_Need( vlc_object_t *p_this, const char *psz_capability,
    const char *psz_name, vlc_bool_t b_strict ) 方法是尋找合適的interface
    如果找到合適的,就調用AllocatePlugin()動態的分配一個。
    7.how to link to different modules without OOP
     
     
    對VLC源代碼閱讀的計劃是從其程序的框架開始,先對其主要的文件進行整理:
    1.include/main.h 文件: access to all program variables,主要定義了2個結構體:libvlc_t,vlc_t。
    a. struct libvlc_t 根據程序註釋:該結構體只有一個實例,在main函數中被分配,而且只能在main中訪問。它用來存儲一些只能初始化一次的數據,比如說cpu容量或者global lock.
    b. struct vlc_t 註釋稱:This structure is a LibVLC instance
    libvlc_t,vlc_t在VLC_COMMON_MEMBERS宏中出現,分別定義了 libvlc_t * p_libvlc; vlc_t * p_vlc; 對象,註釋稱為 root of the evil,可見其結構體的重要性.所有的參數傳遞都在這裡面(具體尚不清楚)。
     
    2.include/Vlc_common.h 文件:common definitions,Collection of useful common types and macros definitions,通用類型和宏定義的集合
    主要作用是為了將不同的操作系統中的變量定義統一起來,比如說根據將unit_8來統一代表unsiged char類型.
    該文件中還定義了VLC_COMMON_MEMBERS宏,該宏中包括了所有VLC基本對象的通用成員變量:these members are common for all vlc objects。
    定義導出函數
    #ifndef __PLUGIN__ 
    # define VLC_EXPORT( type, name, args ) type name args
    #else
    # define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_
    extern module_symbols_t* p_symbols;
    #endif
    定義回調函數
    typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */
    char const *, /* variable name */
    vlc_value_t, /* old value */
    vlc_value_t, /* new value */
    void * ); /* callback data */
     
    3.include/vlc_objects.h 文件:vlc_object_t definition and manipulation methods,vlc_object_t的定義和處理函數
    struct vlc_object_t
    {
    VLC_COMMON_MEMBERS 
    }; //定義一個結構來使用宏定義的公共成員
     
     
    VLC中vlm介紹
    代碼從兩大部分入手,一個telnet 的deamon。還有就是rtsp的實現部分 。結果發現,他們通過了一個橋樑vlm的media進行溝通。
    當受到new MEDIANAME vod enabled 就建立一個media。
    如果受到setup MEDIANAME input filename.mpg 就讀入流準備分析,建立input流
    當受到rtsp的請求後,就建立這個output流
    這樣,vod就和別的模塊一致了。rtsp只是一種output流的module。
    代碼分析
     
    1. /modules/control/telnet.c
    /*****************************************************************************
    * Run: main loop
    *****************************************************************************/
    static void Run( intf_thread_t *p_intf ){
    vlm_ExecuteCommand( p_sys->mediatheque, cl->buffer_read,
    &message );
    }
    2. /src/Misc/vlm.c
    /*****************************************************************************
    * vlm_ExecuteCommand:
    *****************************************************************************/
    int vlm_ExecuteCommand( vlm_t *p_vlm, const char *psz_command,
    vlm_message_t **pp_message)
    {
    }
    vlm_MediaNew( vlm_t *vlm, const char *psz_name, int i_type ){
    vlm_media_t *media = malloc( sizeof( vlm_media_t ) );
    }
    *****************************************************
    struct vlm_t
    {
    VLC_COMMON_MEMBERS
    vlc_mutex_t lock;
    int i_media;
    vlm_media_t **media;
    int i_vod;
    vod_t *vod;
    int i_schedule;
    vlm_schedule_t **schedule;
    };
    *****************************************************
    int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, const char *psz_cmd,
    const char *psz_value ){
     
    if( (p_input = input_CreateThread2( vlm, &media->item, psz_header
    ) ) )
    {
    while( !p_input->b_eof && !p_input->b_error ) msleep( 100000 );
     
    input_StopThread( p_input );
    input_DestroyThread( p_input );
    vlc_object_detach( p_input );
    vlc_object_destroy( p_input );
    }
    }
    3. /src/Input/input.c
    input_thread_t *__input_CreateThread2( vlc_object_t *p_parent,
    input_item_t *p_item,
    char *psz_header )
    {
    input_thread_t *p_input = NULL; /* thread descriptor */ 
    p_input = Create( p_parent, p_item, psz_header, VLC_FALSE );
    /* Now we can attach our new input */
    vlc_object_attach( p_input, p_parent );
     
    /* Create thread and wait for its readiness. */
    if( vlc_thread_create( p_input, "input", Run,
    VLC_THREAD_PRIORITY_INPUT, VLC_TRUE ) )
    {
    msg_Err( p_input, "cannot create input thread" );
    vlc_object_detach( p_input );
    vlc_object_destroy( p_input );
    return NULL;
    }
    }
    static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
    char *psz_header, vlc_bool_t b_quick )
    {
    }
     
    /*****************************************************************************
    * Run: main thread loop
    * This is the "normal" thread that spawns the input processing chain,
    * reads the stream, cleans up and waits
    *****************************************************************************/
    static int Run( input_thread_t *p_input )
    {
    }
     
    =====================================================================================
    4. modulesmisc tsp.c
    static vod_media_t *MediaNew( vod_t *p_vod, const char *psz_name,
    input_item_t *p_item )
    {
    vod_sys_t *p_sys = p_vod->p_sys;
    vod_media_t *p_media = malloc( sizeof(vod_media_t) );
    int i;
    if( !p_media )
    {
    msg_Err( p_vod, "not enough memory" );
    return NULL;
    }
    memset( p_media, 0, sizeof(vod_media_t) );
    p_media->es = 0;
    p_media->psz_mux = 0;
    p_media->rtsp = 0;
    p_media->b_raw = VLC_FALSE;
    asprintf( &p_media->psz_rtsp_path, "%s%s", p_sys->psz_path, psz_name );
    p_media->p_rtsp_url =
    httpd_UrlNewUnique( p_sys->p_rtsp_host, p_media->psz_rtsp_path, NULL,
    NULL, NULL );
    if( !p_media->p_rtsp_url )
    {
    msg_Err( p_vod, "cannot create RTSP url (%s)", p_media->psz_rtsp_path);
    free( p_media->psz_rtsp_path );
    free( p_media );
    return NULL;
    }
    msg_Dbg( p_vod, "created RTSP url: %s", p_media->psz_rtsp_path );
    asprintf( &p_media->psz_rtsp_control_v4,
    "a=control:rtsp://%%s:%d%s/trackID=%%d ",
    p_sys->i_port, p_media->psz_rtsp_path );
    asprintf( &p_media->psz_rtsp_control_v6,
    "a=control:rtsp://[%%s]:%d%s/trackID=%%d ",
    p_sys->i_port, p_media->psz_rtsp_path );
    httpd_UrlCatch( p_media->p_rtsp_url, HTTPD_MSG_SETUP,
    RtspCallback, (void*)p_media );
    httpd_UrlCatch( p_media->p_rtsp_url, HTTPD_MSG_DESCRIBE,
    RtspCallback, (void*)p_media );
    httpd_UrlCatch( p_media->p_rtsp_url, HTTPD_MSG_PLAY,
    RtspCallback, (void*)p_media );
    httpd_UrlCatch( p_media->p_rtsp_url, HTTPD_MSG_PAUSE,
    RtspCallback, (void*)p_media );
    httpd_UrlCatch( p_media->p_rtsp_url, HTTPD_MSG_TEARDOWN,
    RtspCallback, (void*)p_media );
    }
    static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
    httpd_message_t *answer, httpd_message_t *query )
    {
    switch( query->i_type )
    {
    case HTTPD_MSG_SETUP:
    {
    }
    case HTTPD_MSG_PLAY:
    {
    p_rtsp = RtspClientGet( p_media, psz_session );
    vod_MediaControl( p_vod, p_media, psz_session, VOD_MEDIA_PLAY,
    psz_output );
     
    }
    }
     
    }
    5. vlc_vod.h
    static inline int vod_MediaControl( vod_t *p_vod, vod_media_t *p_media,
    char *psz_id, int i_query, ... )
    {
    i_result = p_vod->pf_media_control( p_vod->p_data, p_media, psz_id,
    i_query, args );
    }
     
     
     
    libvlc外部api的簡單整理
     
    libvlc.h
     
     
    定義了libvlc的外部api,引用這個頭文件就可以把VLC嵌入到我們的程序裡面了。
    libvlc的對象必須先被初始化之後才能被使用。
    libvlc core
     
    libvlc_new() 用於初始化一個libvlc的實例,argc表示參數的個數,argv表示參數,返回創建的實例若當發生錯誤時返回NULL
    libvlc_release()用於銷毀一個libvlc的實例
      libvlc error handling
    libvlc_errmsg()返回的是在idaoyong線程中產生的最新的libvlc錯誤,這個錯誤信息至少在另外一個錯誤發生之前(至少再調用一次libvlc)都是有效的,當沒有任何錯誤的時候返回的是NULL
    libvlc_clearerr()用於清除當前線程的libvlc的錯誤狀態.此操作是可選的,默認情況下,錯誤狀態是會在新的錯誤發生時被覆蓋.
    libvlc_vprinterr()用於設置當前線程的libvlc的錯誤狀態和消息.無論何時都返回一個nul字符
    libvlc_printerr() /源碼裡的註釋和上一個一模一樣
    libvlc_retain()增加libvlc的引用計數,任何新的libvlc實例的引用計數為1
    libvlc_add_intf():嘗試啟動libvlc實例的用戶接口,p_instance表示要啟動的實例,name為接口名,NULL表示默認,返回0表示成功-1表示發生錯誤
    libvlc_set_exits_handler():此函數用於為一個已存在的libvlc事件註冊一個回調.此方法在你用 libvlc_add_intf()開啟了至少一個接口時非常有用.典型的,這個函數將喚醒你的程序主循環(從其他線程).參數p_instance 表示libvlc實例,cb表示當libvlc要退出時要調用的回調.opaque表示回調的數據指針.警告:此函數不能同libvlc_wait()同 時調用.
    libvlc_wait():等待到有一個接口引發實例的推出動作.必須先用libvlc_add_intf()開啟至少一個接口.
    libvlc_set_user_agent(): 設置應用程序名,當有協議要求的時候,libvlc將把這個名字作為用戶代理串傳遞給它.參數name應該是一個可讀的應用程序名,例如"FooBar player 1.2.3",http參數為HTTP User Agent。例如"FooBar/1.2.3 Python/2.6.0。
    libvlc_get_Version():返回libvlc的版本號
    libvlc_get_compiler():返回編譯libvlc的編譯器的版本。
    libvlc_get_changeset() :返回libvlc的 changeset?
    libvlc asynchronous events
    libvlc 發出不同步事件
    許多libvlc對象,如libvlc_instance_t libvlc_media_player_t不同步的產生時間,它們中的每一個都提供了libvlc_event_manager_t事件管理器。你可以 通過libvlc_event_attach()來訂閱這些事件以及用libvlc_event_detach()來退訂事件。
    libvlc_event_manager_t是屬於libvlc對象的事件管理器
    libvlc_event_type_t:表示libvlc的事件
    libvlc_callback_t():回調函數通知(call back function notification翻譯不準確),參數p_event為觸發回調的時間.
    libvlc_event_attach():註冊一個event notification。參數p_event_manager 想要綁定的事件管理器.通常來說它是由vlc_my_object_event_manager()處獲得的,此處的my_object是你想要監聽的對 象,i_event_type是想要監聽的事件,f_callback是當i_event_type發生時要調用的函數。user_data是用戶提供的 伴隨事件而傳遞的數據。成功時此函數返回0,發生錯誤時返回ENOMEM
    libvlc_event_detach()退訂一個event notification
    libvlc_event_type_name():獲得一個事件的類型名
    libvlc_log LibVLC logging
    libvlc_log系列函數提供了訪問libvlc消息日誌的方法.這些函數僅用於高級用戶或調試之用.
    libvlc_get_log_verbosity():獲得VLC消息的詳細級別
    libvlc_set_log_verbosity():設置VLC消息的詳細級別
    libvlc_log_open():開啟VLC消息日誌實例(從一個libvlc實例中獲得其消息日誌實例)
    libvlc_log_close():關閉VLC消息日誌實例
    libvlc_log_count():返回日誌中消息條數
    libvlc_log_clear():清除日誌實例.將把實例中的所有消息刪除,為了防止消息阻塞,應該經常清除.
    libvlc_log_get_iterator():定位並返回一個日誌中記錄的iterator
    libvlc_log_iterator_free():釋放一個先前定位好的iterator
    libvlc_log_iterator_next():返回下一條日誌消息,當接下來為空的時候返回NULL,否則返回下一個消息對像
    libvlc_media.h
    libvlc_media_t是一個可播放的媒體的抽像表達.它包含了這個媒體的位置以及各種可選的元數據.
    libvlc_state_t:此枚舉類型的循序必須嚴格保證和源碼一致,同時可參考 mediacontrol_PlayerStatus,input_state_e枚舉類型以及VideoLan.LibVLC.State(在 bindings/cil/src/media.cs)
    libvlc_media_stats_t:Libvlc的媒體統計信息
    libvlc_media_track_info_t:沒有註釋,主要是fourcc和docec的其他信息。
    libvlc_media_new_location():使用一個給定的媒體資源路徑來建立一個libvlc_media對像.參數psz_mrl為要讀取的MRL(Media Resource Location).此函數返回新建的對象或NULL.
    libvlc_media_new_path():從本地文件系統路徑新建,其他參照上一條
    libvlc_media_new_as_node():使用給定的名稱創建一個libvlc_media_t並將其作為一個空的節點
    libvlc_media_add_option():添加一個選項到已有的libvlc_media_t,這個選項將被用於決定media_player如何讀取媒體。這樣一來就可以在每個媒體上指定各自的VLC的高級reading/streaming選項。
    libvlc_media_add_option_flag():減價一個帶有可配置標記的選賢到已有的libvlc_media_t.其他同上一條.
    libvlc_media_retain():保留一個引用到一個媒體描述對像(libvlc_media_t.使用libvlc_media_release()來減少一個媒體描述對象的引用計數
    libvlc_media_release():減少一個libvlc_media_t的引用計數,如果減少到0時,此此函數將釋放此對像(銷毀).它將 發送一個libvlc_MediaFreed事件到所有的監聽者那裡。如果一個libvlc_media_t被釋放了,它就再也不能使用了。
    libvlc_media_get_mrl():從一個媒體描述對像處獲得它的mrl
    libvlc_media_duplicate():鏡像一份媒體描述對像
    libvlc_media_get_meta():讀取媒體的元數據。如果媒體還沒被解析,則返回NULL,這個方法會自動調用 libvlc_media_parse_async(),因此,在調用此方法以後,你可以接收到一個libvlc_MediaMetaChanged事 件。如果你希望使用一個同步的版本,請確保你在調用get_meta()之前調用了libvlc_media_parse();
    libvlc_media_set_meta():設置媒體的元數據,此方法不會保存數據,還需要調用libvlc_media_save_meta()來保存.
    libvlc_media_get_state():獲取當前媒體描述對象的狀態.可能的狀態被定義在livblc_structures.c中.
    libvlc_media_subitems():獲得一個媒體描述對象的子項目.此方法將增加媒體描述對象的引用計數,使用libvlc_media_list_release()減少引用計數.
    libvlc_media_event_manager():獲得一個媒體描述對象的事件管理器.
    libvlc_media_get_duration():獲得一個媒體描述對象的持續時間.發生錯誤時返回-1.
    libvlc_media_parse():解析一個本地媒體的元數據和軌道信息,此方法是同步的.
    libvlc_media_parse_async():同上,此方法不同步,你可以監聽libvlc_MediaParsedChanged事件來追蹤他,如果已經被解析過了則此事件不會被觸發。
    libvlc_media_is_parsed():獲得一個媒體描述對象的分析狀態。當分析過了返回true。
    libvlc_media_set_user_data():設置媒體描述符的用戶數據,此數據僅被host程序訪問,VLC.framework將它作為一個指向一個引用了一個libvlc_media_t指針的本地對象的指針來使用
    libvle_media_get_tracks_info():獲得媒體描述符的基本流信息.注意你必須使用--sout="#description"播放媒體恰好一次,否則將得到一個空的數組。而多次播放則會導致多個重複數據。
     
    VLC API集合:http://www.videolan.org/developers/vlc/doc/doxygen/html/group__libvlc.html#_details
     
     
     
    VLC簡介及使用說明
     
     
    一、簡介
    VLC的全名是Video Lan Client,是一個開源的、跨平台的視頻播放器。VLC支持大量的音視頻傳輸、封裝和編碼格式,完整的功能特性列表可以在這裡獲得 http://www.videolan.org/vlc/features.html,下面給出一個簡要的不完整的列表:
    操作系統:Windows、WinCE、Linux、MacOSX、BEOS、BSD
    訪問形式:文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP組播、IPv6、rtsp
    編碼格式:MPEG*、DIVX、WMV、MOV、3GP、FLV、H.263、H.264、FLAC
    視頻字幕:DVD、DVB、Text、Vobsub
    視頻輸出:DirectX、X11、XVideo、SDL、FrameBuffer、ASCII
    控制界面:WxWidgets、QT4、Web、Telnet、Command line
    瀏覽器插件:ActiveX、Mozilla(firefox)
    實際上為了更清晰一點,我們可以反過來說說VLC不支持哪些常見的。首先是RealVideo(Real的Audio部分支持),因為Real的 Video加碼器存在版權的問題。實際上VLC 0.9.0已經加入了RealVideo的支持,但是需要額外的解碼器(類似MPlayer)。另外,VLC不支持3GP的音頻格式AMR。
     
    VLC原先是幾個法國的大學生做的項目,後來他們把VLC作為了一個開源的項目,吸引了來自世界各國的很多優秀程序員來共同編寫和維護VLC,才逐漸變成了現在這個樣子。
    至於為什麼叫VideoLan Client,是因為以前還有一個VideoLan Server的項目(簡稱VLS),而目前VLS的功能已經合併到VLC中來,所以VLC不僅僅是一個視頻播放器,它也可以作為小型的視頻服務器,更可以 一邊播放一邊轉碼,把視頻流發送到網絡上。VLC最為突出的就是網絡流的播放功能,例如MPEG2的UDP TS流的播放和轉發,幾乎是無可替代的。
    對普通用戶來說,VLC還有一個好處是不影響Windows中的解碼器。VLC通常不影響也不依賴於系統中自帶的解碼器(除了realvideo和quicktime的類型),很綠色很環保;更不用擔心流氓軟件、廣告插件之類的噁心的玩意兒。
    從程序結構來看,VLC的可擴展性是相當優秀的。VLC絕大部分用高效的C代碼來編寫(少量的C++和彙編),但是實現了完全動態的模塊化,所有功能包括 程序框架本身都是module,可以在運行時載入,這使得VLC可以輕易的擴展多種功能並且容易維護。它的架構有一點類似於DirectShow的技術。
    VLC也很注重版權方面的問題,你可以放心的自由的使用而不需要為版權的問題擔心——VLC只包括免費的、自由的庫。VLC基於GPL,因此也可以用於商業應用,只需要保留GPL,以及公開源代碼,如果你修改了VLC的話。
    下面是VLC相關的一些鏈接
    VLC官方網站:http://www.videolan.org/
    VLC下載頁面:http://www.videolan.org/vlc/
    VLC下載目錄(源碼和安裝包):http://download.videolan.org/pub/videolan/vlc/
    VLC Nightly Builds:http://nightlies.videolan.org/
    VLC 開發Wiki:http://wiki.videolan.org/Developers_Corner
    VLC Win32第三方庫預編譯包下載目錄:http://download.videolan.org/pub/testing/win32/
    VLC 官方論壇:http://forum.videolan.org/
    VLC 郵件列表:http://www.videolan.org/developers/lists.html
     
    二、Windows平台編譯
    第一步,要創建編譯VLC的環境。VLC在Windows下可以用Msys+MingW 或者Cygwin的方式來編譯,二者大同小異,這裡主要介紹Cygwin。
    Cygwin是一個在Windows下面模擬Linux環境的東西。它提供了很多庫和應用程序,讓你可以像在Linux上一樣來使用Windows。你需 要在http://www.cygwin.com/下載一個cygwin的安裝程序setup.exe。然後選擇一個cygwin的源來下載所需要的庫, 國內的話到ftp://ftp.sjtu.edu.cn/cygwin/和http://www.cygwin.cn/pub相對來說會快一點。第一次安 裝,除了默認的庫以外,我們還需要加入一些庫來支持VLC的編譯,包括
    Archive (目錄)
    unzip
    zip
    Devel
    autoconf
    automake
    binutils
    cvs
    expat
    gcc
    gcc-core
    gcc-g++
    gcc-mingw
    gcc-mingw-core
    gcc-mingw-g++
    gdb (如果你需要調試的話)
    gettext
    gettext-devel
    git (不一定需要)
    libiconv
    libtool
    make
    mingw-runtime
    nasm
    patchutils
    pkg-config
    subversion
    Editor
    vim (有了它方便點)
    Libs
    libgcrypt
    Web //這兩個可以不要,如果你不想編譯第三方庫
    curl (optional: for building extras/contrib)
    wget (optional: for building extras/contrib)
     
    然後是下載所需要版本的VLC的源代碼。對於Release版本,可以從這裡下載:http://download.videolan.org/pub /videolan/vlc/,如果你需要下載實時最新的庫,就要從VLC的源碼庫上取下來了。現在VLC改用git了,使用命令: git clone git://git.videolan.org/vlc.git
     
    VLC還需要很多第三方的庫,你可以取得源碼來編譯,這部分可以參考Linux上的VLC編譯的文章。在Windows上VLC做了一個編譯好的 win32第三方庫的包,可以從http://download.videolan.org/pub/testing/win32/下載。包需要解壓到根 目錄 『/』,事實上這些庫都位於』/usr/win32-branch』裡邊。
     
    在cygwin中進入vlc的主目錄,運行bootstrap,』./bootstrap』。在等待它結束之前,我們先來看一下如何配置VLC的編譯。運 行 『./configure -h >cfg_opt.txt』就可以把配置的選項信息都輸出到 cfg_opt.txt中,然後慢慢來研究。裡面大多是啟用、禁用某些特性和功能模塊,或者配置某些模塊需要的庫的路徑等信息。為了方便可以寫一個簡單的 腳本來做這件事,當然這個不是必需的。
    PATH=/usr/win32-branch/bin:$PATH
    PKG_CONFIG_PATH=/usr/win32-branch/lib/pkgconfig
    CPPFLAGS=」-I/usr/win32-branch/include -I/usr/win32-branch/include/ebml」
    LDFLAGS=-L/usr/win32-branch/lib
    CC=」gcc -mno-cygwin」 CXX=」g++ -mno-cygwin」
    ./configure
    –host=i686-pc-mingw32
    –disable-gtk
    –enable-nls –enable-sdl –with-sdl-config-path=/usr/win32-branch/bin
    –enable-ffmpeg –with-ffmpeg-mp3lame –with-ffmpeg-faac
    –with-ffmpeg-zlib –enable-faad –enable-flac –enable-theora
    –with-wx-config-path=/usr/win32-branch/bin
    –with-freetype-config-path=/usr/win32-branch/bin
    –with-fribidi-config-path=/usr/win32-branch/bin
    –enable-live555 –with-live555-tree=/usr/win32-branch/live.com
    –enable-caca –with-caca-config-path=/usr/win32-branch/bin
    –with-xml2-config-path=/usr/win32-branch/bin
    –with-dvdnav-config-path=/usr/win32-branch/bin
    –disable-cddax –disable-vcdx –enable-goom
    –enable-twolame –enable-dvdread
    –enable-release –enable-dca
    –enable-mkv
    –enable-quicktime –enable-mozilla
    –with-mozilla-sdk-path=/usr/win32-branch/gecko-sdk
    –enable-mostly-builtin
    && make
     
    例如把這個文件保存為 『mybuild』,等bootstrp運行結束之後,我們只需要運行一下 mybuild就會開始配置和編譯了。這通常需要挺長的時間,如果運氣好,在漫長的等待之後make運行成功,vlc就編譯好了。直接雙擊主目錄裡邊的 vlc.exe應該就可以運行了。
    為了方便可以把它打包,最簡單的是 『make package-win32-base』,它將創建一個子目錄來存放所有運行所需的東西,這個目錄就是一個綠色版的VLC啦。
    當然如果你運氣沒那麼棒,可能會碰到各種各樣的錯誤,例如在boottrap或者configure中出錯,通常是因為沒安裝某個庫或者庫的版本不合適;也可能碰到編譯的錯誤,嘗試去google一下。
     
    本文參考http://wiki.videolan.org/Win32CompileCygwinNew
     
    三、Linux平台編譯
    先下載源代碼,把源代碼解壓之後也是先運行一下bootstrap,看看缺什麼工具沒有,例如gcc、make、libtool、automake、autoconfig等是否有合適的版本。如果不合適的話就用你喜歡的方式去升級或者安裝。
    下面最麻煩的一步來了。VLC在Linux上沒有給出和Windows上類似的第三方庫的預編譯包,你必須去自己獲得並編譯這些庫。這些庫的數量取決於你 的配置選項。VLC給出了一個自動化的解決方案,關注一下主目錄extrascontrib,裡邊有一些工具來幫助你自動下載、patch和編譯所有 可能用到的第三方庫。先運行一下那個目錄下的bootstrap,如果缺少***.mak的話可以到VLC的代碼庫中找一下,是一個系統相關的文件,然後 簡單的一句make就可以了。如果你對這些庫比較熟悉的話最好先手動篩選一下,有一些可能不是你所需要的,而下載他們可能需要很長的時間。
    在漫長的等待之後,如果一切順利(我幾乎不相信會這樣),這一步就算完成了。可能遇到的問題有:下載實在太慢,可以用其他下載工具把庫的代碼包下下來放到extrascontribsrc裡邊;如果下載一半斷掉,可以把那個不完整的文件刪掉重新再運行make。
    這一步做完之後和windows上的編譯就幾乎一樣了。寫一個配置腳本然後運行它。例如一個配置腳本:
    ./configure
    –enable-release
    –disable-skins2
    –disable-wxwidgets
    –enable-mozilla
    –with-mozilla-sdk-path=./gecko-sdk
    –disable-sout
    –disable-httpd
    –enable-live555
    –disable-dvdnav
    –disable-libcdio
    –disable-libcddb
    –disable-cdda
    –disable-vcd
    –disable-dvdread
    –disable-smb
    –disable-cmml
    –disable-alsa
    –disable-opengl
    –disable-png
    –disable-screen
    –disable-mkv
    –disable-mod
    –disable-mpc
    –disable-libtar
    –disable-speex
    –disable-visual
    –disable-daap
    –disable-bonjour
    –disable-gnutls
    –enable-faad
    –enable-mostly-builtin
    配置完之後再運行make就可以了。
    參考:http://wiki.videolan.org/UnixCompile
     
    四、使用
    VLC的功能很強大,它不僅僅是一個視頻播放器,也可作為小型的視頻服務器,更可以一邊播放一邊轉碼,把視頻流發送到網絡上。
    最簡單的,從界面打開一個文件播放,也可以在命令行下使用,如C:Program FilesVideoLANVLC>vlc.exe test.ts
    獲取內置的幫助,會寫到vlc-help.txt:C:Program FilesVideoLANVLC>vlc.exe -h
    獲取更詳細的幫助,有大量的選項介紹:C:Program FilesVideoLANVLC>vlc.exe -H
     
    在線使用幫助
    http://www.videolan.org/doc/play-howto/en/play-howto-en.html
    http://www.videolan.org/doc/streaming-howto/en/streaming-howto-en.html
     
    搜索並顯示可用的模塊列表:C:Program FilesVideoLANVLC>vlc.exe -l
     
    Windows下,默認情況,VLC的配置文件在 %APPDATA%vlcvlcrc,%APPDATA%在XP下通常是 C:Documents and Settings用戶名Application Data
    Linux下,在用戶home目錄的/.vlc/中
     
    vlc的選項完全可以通過修改vlcrc來設置,界面只是略微方便一點
    重置所有選項到默認狀態:C:Program FilesVideoLANVLC>vlc.exe –reset-config
    VLC從vlcrc中指定的plugin-path,以及當前目錄的modules和plugins目錄來遞歸查找plugin,VLC的大部分功能都是 通過plugin來實現的。VLC默認有大量的動態插件,為了加快啟動速度,vlc會在%APPDATA%vlccache中緩存plugin的列 表,選項plugins-cache=0可以禁止緩存plugin
     
    打開一個UDP組播流,組播組 239.255.1.1,端口 4567,默認端口1234,對於rtp協議,VLC會自動識別,寫udp還是rtp都沒問題
    C:Program FilesVideoLANVLC>vlc.exe udp://@239.255.1.1:4567
     
    在本地UDP端口 888 接收流, 「@」表示綁定一個地址,而不是連接該地址
    C:Program FilesVideoLANVLC>vlc.exe udp://@888
     
    串流輸出,就是在播放的時候,以某種方式向外傳送視頻,在打開界面的串流/保存 中設置會比較方便。
    例如,循環播放test.ts, 以rtp方式傳送到224.1.1.1端口1234, 同時顯示視頻
    vlc.exe test.ts –loop :sout=#duplicate{dst=std{access=rtp,mux=ts,dst=224.1.1.1:1234},dst=display}
     
    例如,接收UDP端口888,數據全部保存到C:dump.ts
    vlc.exe udp://@888 :demux=dump :demuxdump-file=」C:dump.ts」
     
    關於Windows下視頻輸出模塊
    Direct3D :效果比DirectX差一點,但是方便截圖,也可以在圖像上實現alpha
    DirectX:效果最好,利用DirectX的顯示加速
    OpenGL:在不同的硬件上表現不太一樣
    WinGDI:最慢的一種,不需要顯卡加速
    caca:用彩色的Assic字符來顯示
     
    臨時啟用某個視頻輸出,可以這樣:C:Program FilesVideoLANVLC-0.8.6e>vlc test.ts –vout=caca
     
    ActiveX控件
    官方發佈的VLC自帶ActiveX控件 axvlc.dll,註冊之後可以方便的在應用程序和網頁中使用VLC,註冊的辦法是
    C:Program FilesVideoLANVLC-0.8.6e>regsvr32 axvlc.dll
    ActiveX VLC的使用方法可以參考源代碼中ActiveX目錄的README.TXT和test.html,ActiveX控件的接口有第一版和第二版,第一版簡單,功能少,已經不再維護建議用第二版本,功能多一點
     
    Mozilla Plugin
    你還可以在Windows和Linux的Firefox中使用VLC。Windows下可以在安裝VLC的時候選上Mozilla plugin,事實上它做的就是在HKLM_Software_MozillaPlugin鍵下添加一個VLC的子鍵。Linux下可以把 libvlcplugin.so(或者叫npvlc.so)和插件目錄放到Firefox的plugins目錄,來使之生效。
    同樣這適用於基於Xulrunner的應用程序,事實上像 Miro、SongBird等xul應用都是用的這個插件。與ActiveX類似的,VLC的Mozilla Plugin也有兩套接口,建議用新的第二版。
     
    註冊表
    在Windows下VLC只使用很少量的註冊表的信息,最重要的一條是HKLM_Software_VLC鍵下的InstallDir項,VLC的 Mozilla Plugin和ActiveX控件通過這一項來定位其插件的目錄。Telnet、Http控制對VLC來說,控制界面都是Interface類的模塊,你 可以使用各種控制模塊。Windows下默認使用的是wxwidgets圖形界面,還可以使用http、telnet等界面,來遠程控制VLC,如果用 VLC在服務器上專門作視頻流轉發一類的事情,這種遠程界面可以幫上大忙。
     
    視頻過濾器
    0.8系列中有多達13種視頻過濾器,為視頻添加各種效果和特殊處理。
     
    Skin2界面
    一個漂亮一點的,可以換膚的界面。
     
    其他的
    播放DVD、VCD光盤,打開DirectShow設備,播放當前屏幕…
     
    一些問題
    目前的VLC無法播放Real視頻,如rm、rmvb。其實從0.9版本的VLC開始可以依賴其他解碼器播放。但就目前測試的情況來看,順序播放沒問題,但是拖動則效果很差。RTSP的播放,拖動有問題,在獲取播放位置時有缺陷。例如和達爾文服務器的配合。
     
    五、視頻播放的基本原理
    幾乎所有的視頻播放器,如VLC、MPlayer、Xine,包括DirectShow,在播放視頻的原理和架構上都是非常相似的,理解這個對理解VLC的源碼會有事半功倍的效果。
    大致的來說,播放一個視頻分為4個步驟:
    1. acess 訪問,或者理解為接收、獲取、得到
    2. demux 解復用,就是把通常合在一起的音頻和視頻分離(還有可能的字幕)
    3. decode 解碼,包括音頻和視頻的解碼
    4. output 輸出,也分為音頻和視頻的輸出(aout和vout)
    拿播放一個UDP組播的MPEG TS流來說吧,access部分負責從網絡接收組播流,放到VLC的內存緩衝區中,access模塊關注IP協議,如是否IPv6、組播地址、組播協議、 端口等信息;如果檢測出來是RTP協議(RTP協議在UDP頭部簡單得加上了固定12個字節的信息),還要分析RTP頭部信息。這部分可以參看VLC源碼 /modules/access/udp.c。在同目錄下還可以看到大量的access模塊,如file、http、dvd、ftp、smb、tcp、 dshow、mms、v4l…等等
    而demux部分首先要解析TS流的信息。TS格式是MPEG2協議的一部分,概括地說,TS通常是固定188字節的一個packet,一個TS流可以包 含多個program(節目),一個program又可以包含多個視頻、音頻、和文字信息的ES流;每個ES流會有不同的PID標示。而又為了可以分析這 些ES流,TS有一些固定的PID用來間隔發送program和es流信息的表格:PAT和PMT表。關於TS格式的詳細信息可以去google一下。 VLC專門做了一個獨立的庫libdvbpsi來解析和編碼TS流,而調用它的代碼可以參見VLC源碼 /modules/demux/ts.c。
    其實之所以需要demux,是因為音視頻在製作的時候實際上都是獨立編碼的,得到的是分開的數據,為了傳輸方便必須要用某種方式合起來,這就有了各種封裝 格式也就有了demux。demux分解出來的音頻和視頻流分別送往音頻解碼器和視頻解碼器。因為原始的音視頻都是佔用大量空間,而且冗余度較高的數據, 通常在製作的時候就會進行某種壓縮。這就是我們熟知的音視頻編碼格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、H.264、 rmvb等等。音視頻解碼器的作用就是把這些壓縮了的數據還原成原始的音視頻數據。VLC解碼MPEG2使用了一個獨立的庫libmpeg2,調用它的源 文件是 /modules/codec/libmpeg2.c。VLC關於編解碼的模塊都放在/modules/codec目錄下,其中包括著名的龐大的 ffmpeg。
    解碼器,例如視頻解碼器輸出的是一張一張的類似位圖格式的圖像,但是要讓人從屏幕看得到,還需要一個視頻輸出的模塊。當然可以像一個Win32窗口程序那 樣直接把圖像畫到窗口DC上——VLC的一個輸出模塊WinGDI就是這麼幹的,但是通常這太慢了,而且消耗大量的CPU。在Windows下比較好的辦 法是用DirectX的接口,會自動調用顯卡的加速功能。
    這樣的功能分解使得模塊化更容易一點,每個模塊住需要專注於自己的事;從整體來說功能強大而且靈活。
    但是事情總是不會那麼簡單。就拿access來說,媒體的訪問是分層的,如RTSP就涉及到IPv4、TCP、UDP、RTCP、RTSP等多個層次的協 議。有些視頻格式包括了傳輸、封裝格式和編輯碼格式如MPEG系列,有些封裝格式是獨立的容器,但是很多人會誤解它是編解碼格式,如mkv、avi這些。
    音頻和視頻在demux之後就是獨立的,但是需要有一套機制把它們同步起來。同時我們需要有一套機制來控制速度、暫停、停止、跳進,獲取各種媒體信息,這些都是很複雜而又很重要的事情。
    另外也許需要在某個地方插入一些修改,來實現某種效果。如音頻的EQ,視頻的亮度調整之類的,VLC專門設計了access_filter、audio_filter和video_filter類型的模塊來做這一類事情。
    VLC比較獨特的地方是集成了原來的VLS的功能,這依賴於VLC中stream_output類型的模塊,它們可以把正在播放的視頻以某種方式重新轉碼和發送出去,如http、UDP、文件等等。
    MPlayer的結構與此是類似的,如/stream目錄對應的是access的功能,/mpdemux對應的demux功能,/libmpcodecs是解碼器,/libvo和/libao2分別是視頻和音頻的輸出。
    DirectShow也是類似的,不過分類更多一些更複雜一點。DirectShow裡面的模塊叫做「filter」,filter之間通過」pin」來 連接。access的模塊對應於DirectShow中的SourceFIlter,這一類Filter只有輸出pin沒有輸入pin。demux模塊對 應於splitter filter,這種filter有一個輸入pin,多個輸出pin。解碼模塊是一類transform filter,有一個輸入pin、一個輸出pin,輸出模塊對應於readering filter,有一個輸入pin,沒有輸出pin。當然transform filter不一定是解碼器,也可能是某種其他的處理。
    另外給出一個VLC的API Document,參見:http://rogerfd.cn/doc/vlcapi.htm
     
    六、精簡
    VLC默認包含了大量的功能,超過2百個插件;Windows下安裝包大小接近10MB,安裝之後超過35MB。有時候如果我們只需要部分的功能,應該如何精簡它呢?
    精簡VLC的第一步是重新配置編譯選項,將不需要的功能去掉。一個精簡配置腳本如下:
    PATH=/usr/win32-branch/bin:$PATH
    PKG_CONFIG_PATH=/usr/win32-branch/lib/pkgconfig
    CPPFLAGS=」-I/usr/win32-branch/include -I/usr/win32-branch/include/ebml」
    LDFLAGS=-L/usr/win32-branch/lib
    CC=」gcc -mno-cygwin」 CXX=」g++ -mno-cygwin」
    ./configure
    –with-freetype-config-path=/usr/win32-branch/bin
    –with-fribidi-config-path=/usr/win32-branch/bin
    –disable-ffmpeg
    –disable-live555
    –disable-cddax
    –disable-vcdx
    –disable-skins2
    –disable-wxwidgets
    –disable-mozilla
    –disable-httpd
    –disable-dvdnav
    –disable-libcdio
    –disable-libcddb
    –disable-cdda
    –disable-sdl
    –disable-sdl-image
    –disable-vcd
    –disable-dvdread
    –disable-smb
    –disable-cmml
    –disable-alsa
    –disable-opengl
    –disable-png
    –disable-screen
    –disable-mkv
    –disable-mod
    –disable-mpc
    –disable-libtar
    –disable-speex
    –disable-visual
    –disable-daap
    –disable-bonjour
    –disable-gnutls
    –disable-vorbis
    –disable-real
    –disable-xml
    –disable-x264
    –enable-sout
    –enable-activex
    –enable-release
     
    從這個腳本可見,主要是禁用了大量的功能。運行 ./configure -h 可以顯示每一個配置項的意義;如果還不清楚可以再去搜一下選項對應的庫的位置。ffmpeg是一個龐大的編解碼庫,但是MPEG2的解碼可以利用另一個庫 libmpeg2,所以在這裡不需要它。
    注意make完之後要用make package-win32-base來打一下包,打包時會用strip工具來壓縮每一個可執行文件。
    但是這樣還沒有結束。配置項並不是很全面的,而且還會有一些小問題,例如xml禁用了還會有。。。於是還需要手動的清理一下plugins目錄裡面的插 件,挑出沒有用處的,這也需要對VLC模塊的熟悉。或者使用Roger的笨方法,一個一個試,對功能沒有影響的就拿掉。SImpleTV0.4所使用的 plugin如以下所示:
    liba52sys_plugin.dll liba52 用於AC3格式的音頻解碼,CCTV高清頻道需要
    liba52tofloat32_plugin.dll
    liba52tospdif_plugin.dll
    liba52_plugin.dll
    libaccess_file_plugin.dll 文件訪問,播放文件需要
    libaccess_http_plugin.dll HTTP訪問模塊
    libaccess_output_file_plugin.dll sout的文件模塊,用於錄製
    libaccess_udp_plugin.dll UDP訪問模塊
    libaout_directx_plugin.dll DirectX的聲音輸出,默認的聲音輸出模塊
    libdeinterlace_plugin.dll 解交錯的vout-filter模塊
    libdirect3d_plugin.dll Direct3D視頻輸出模塊,在上面可以半透明。。。
    libfixed32tofloat32_plugin.dll 一些數據轉換模塊
    libfixed32tos16_plugin.dll
    libfloat32tos16_plugin.dll
    libfloat32tos8_plugin.dll
    libfloat32tou16_plugin.dll
    libfloat32tou8_plugin.dll
    libfloat32_mixer_plugin.dll
    libglwin32_plugin.dll OpenGL視頻輸出模塊
    libi420_ymga_plugin.dll
    libi422_yuy2_plugin.dll
    libipv4_plugin.dll IPv4網絡模塊
    libipv6_plugin.dll IPv6網絡模塊
    liblibmpeg2_plugin.dll libmpeg2,解碼全靠它
    liblogger_plugin.dll 日誌模塊,調試必備
    libmemcpy_plugin.dll 好像是利用各種CPU指令加速內存拷貝的
    libmpeg_audio_plugin.dll MPEG音頻的解碼模塊
    libmpgatofixed32_plugin.dll
    libmpga_plugin.dll
    libmux_dummy_plugin.dll
    libpacketizer_mpegvideo_plugin.dll
    libs16tofixed32_plugin.dll
    libs16tofloat32swab_plugin.dll
    libs16tofloat32_plugin.dll
    libs8tofloat32_plugin.dll
    libsimple_channel_mixer_plugin.dll
    libstream_out_display_plugin.dll sout的模塊 。。。
    libstream_out_duplicate_plugin.dll
    libstream_out_standard_plugin.dll
    libtrivial_channel_mixer_plugin.dll
    libtrivial_mixer_plugin.dll
    libtrivial_resampler_plugin.dll
    libts_plugin.dll TS流的解復用模塊
    libu8tofixed32_plugin.dll
    libu8tofloat32_plugin.dll
    libugly_resampler_plugin.dll
    libvout_directx_plugin.dll DirectX視頻輸出模塊
    libwingdi_plugin.dll GDI視頻輸出模塊
    作為ActiveX控件的VLC,只需要這些模塊和axvlc.dll就足夠了。當然如果使用了libvlc.dll還要帶上。
     
    VLC 0.9.2 正式發佈 && VLC播放Rm Rmvb的插件
    新的VLC加入了RealVideo的demux和codec module,已經可以播放rm、rmvb格式的real視頻,但是需要下載以下兩個附件:
    pncrt.dll 拷貝到 C:Program FilesVideoLANVLC
    drv43260.dll 拷貝到 C:Program FilesVideoLANVLCplugins
    這兩個文件也可以從MPlayer的win32 codec中拷貝出來。從測試的情況來看,順序播放沒有什麼問題,但是跳轉的時候比較慢,圖像不太穩定
    這裡有對VLC新特性的介紹http://wiki.videolan.org/What_is_cool_in_0.9
    Release Note:http://www.videolan.org/developers/vlc/NEWS
    下載目錄:http://download.videolan.org/pub/vlc/0.9.2/win32/
    下載鏈接(exe):http://download.videolan.org/pub/vlc/0.9.2/win32/vlc-0.9.2-win32.exe
     
    七、將VLC嵌入自己的應用
    總的來說把VLC內嵌入自己的應用有4種途徑:
    ‧直接調用VLC進程
    ‧VLC的plugin for Mozilla
    ‧VLC的ActiveX插件
    ‧調用libvlc
    當然,理論上也可以把VLC的源碼直接扣出一部分來放到自己的程序中,不過這種方法難度太大沒多大意義。
    先說第一種辦法,別懷疑,這是非常有用的一種解決方案,特別是對於轉碼、流轉發等應用,通常直接調用VLC就可以了。VLC有HTTP和Telnet的 Interface模塊(就是和用戶交互的界面),也很方便和遠程交互。而且跨平台應用也非常方便,只需要安裝不同平台的VLC就行了。直接調用VLC的 話最重要的就是參數,可以從 vlc.exe -H 中獲取比較詳細的命令行參數介紹。對於轉碼、轉發的,命令行參數會比較複雜,可以用GUI先試一下,然後把界面上的Generated stream output string拷下來。
    VLC的Mozilla plugin除了用於Firefox的web頁之外,還可以用於任何XUL-base的應用,這種應用通常使用xulrunner來啟動。XUL是一種用 XML來寫界面的語言,有點像HTML而且也兼容大部分HTML標記,Firefox就是用XUL來寫的。VLC的Mozilla插件通常用 Javascript來控制,詳細的接口文檔可以參考這裡:http://www.videolan.org/doc/play-howto/en /ch04.html#id310965這個接口有比較老的第一版和比較新的第二版,建議用新的,功能多一些。用VLC的Mozilla插件的應用並不 少,例如比較出名的Miro、Songbird。因為這個好處是顯而易見的:跨平台、可控性強、使用簡單;限制也很明顯:專為Mozilla設計,應用的 範圍很窄。
    VLC的ActiveX插件只能用於Windows平台,當然這是因為ActiveX只是微軟的東西。但是不得不說這個還是很好用的。無論是C++、 C#、VB還是網頁,都可以輕鬆地將這個ActiveX利用起來。關於這個的VLC官方文檔在這裡http://wiki.videolan.org /ActiveX_Controls開發、使用之前別忘了先要註冊ActiveX控件,方法是運行 regsvr32 axvlc.dll。Roger 之前寫的 SimpleTV 就是調用了VLC的ActiveX控件,所以這也可以作為一個示例的代碼,可以主要看看怎麼調用這個控件來做串流的代碼:
    //Create Option for the plugin
    bool bIPv6 = false;
    if (strstr (szMRL, 「::」))
    {
    bIPv6 = true;
    }
     
    tagVARIANT opt,var,ip6;
    CString sout, ipv6 = 「ipv6=1〞;
    SAFEARRAY *psa;
    long index;
    SAFEARRAYBOUND bound[1] = {0};
    bound[0].cElements = bIPv6 ? 2 : 1;
     
    if (m_cfg.bDisplayWhenRecording)
    {
    sout.Format(」sout=#duplicate{dst=display,dst=std{access=file,mux=ts,dst=」%s」}}」,
    strName);
    }
    else
    {
    sout.Format(」sout=#duplicate{dst=std{access=file,mux=ts,dst=」%s」}}」, strName);
    }
     
    var.vt = VT_BSTR;
    var.bstrVal = sout.AllocSysString();
    psa = SafeArrayCreate (VT_VARIANT, 1, bound);
    index = 0;
    SafeArrayPutElement (psa, &index, &var);
    if (bIPv6)
    {
    ip6.vt = VT_BSTR;
    ip6.bstrVal = ipv6.AllocSysString();
    index = 1;
    SafeArrayPutElement (psa, &index, &ip6);
    }
    opt.vt = VT_ARRAY | VT_BSTR;
    opt.parray = psa;
     
    tagVARIANT nul;
    nul.vt = VT_NULL;
    m_vlc.GetPlaylist ().add (szMRL, nul, opt);
    m_vlc.GetPlaylist ().next ();
    m_vlc.GetPlaylist ().play ();
     
    很多人調用VLC的ActiveX控件都會遇到一個問提就是,播放沒有反應。大部分的原因都是因為plugins的問題。VLC作為exe運行時會遞歸搜 索當前目錄下的modules和plugins目錄來尋找plugin,但是當以ActiveX控件運行時,默認只會檢查註冊表的 HKLM_Software_VideoLan_VLC_InstallDir,並添上plugins作為模塊搜索路徑,如果這個路徑沒有設置或者設置不 對,VLC將找不到大部分的模塊,導致大部分功能缺失而無法運行。如果需要修改這一特性可以修改 activexplugin.cpp (0.8.6i)中的 VLCPlugin::getVLC函數。在SimpleTV中,Roger修改的一個片段是
     
    char p_pluginpath[MAX_PATH+1];
    int iTmp = 0;
    /* 得到SimpleTV.exe的全路徑 */
    DWORD dwLen = GetModuleFileNameA (NULL, p_pluginpath, MAX_PATH);
    for (iTmp = strlen(p_pluginpath) – 1; iTmp >= 0; — iTmp)
    {
    if (p_pluginpath[iTmp] == 『\』)
    {
    p_pluginpath[iTmp] = 0;
    break;
    }
    }
    /* 將模塊路徑設為SimpleTV下的 playermodules */
    strcat (p_pluginpath, 「\player\modules「);
    ppsz_argv[ppsz_argc++] = 「–plugin-path」;
    ppsz_argv[ppsz_argc++] = p_pluginpath;
     
    還有一點是配置文件vlcrc的路徑,如果需要修改的話,可以修改 src/misc/configuration.c 中的 GetDir 函數, 在Windows下這個目錄默認返回 %APPDATA% ,以上兩步做好的話其實就可以做出一個Portable的綠色版VLC了。
    和其他ActiveX的播放器,例如WMP、QuickTime、RealPlayer相比,VLC的優點也很明顯:自帶所需解碼器、開源、功能強大。
    當然ActiveX方式和Mozilla 插件的方式也是有局限性的,這樣的方式功能還不夠強大,例如沒有截屏的接口…如果需要更多完整的功能,可以考慮直接調用libvlc的接口,
     
    VLC官方提供了一些文檔和例子http://wiki.videolan.org/Libvlc。這裡還有一個用C#調用libvlc的例子http://jeremiah.blog.51cto.com/539865/116981
    在Windows下libvlc可能默認是不編譯的(0.8.6i),可以在configure中開啟這一選項 –enable-shared-libvlc
    完整的VLC體積還是不小的,如果只需要VLC一部分功能的話,可以最後做一下精簡。
     
    VLC簡介及使用說明
     
     
    一、簡介
    VLC的全名是Video Lan Client,是一個開源的、跨平台的視頻播放器。VLC支持大量的音視頻傳輸、封裝和編碼格式,完整的功能特性列表可以在這裡獲得 http://www.videolan.org/vlc/features.html,下面給出一個簡要的不完整的列表:
    操作系統:Windows、WinCE、Linux、MacOSX、BEOS、BSD
    訪問形式:文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP組播、IPv6、rtsp
    編碼格式:MPEG*、DIVX、WMV、MOV、3GP、FLV、H.263、H.264、FLAC
    視頻字幕:DVD、DVB、Text、Vobsub
    視頻輸出:DirectX、X11、XVideo、SDL、FrameBuffer、ASCII
    控制界面:WxWidgets、QT4、Web、Telnet、Command line
    瀏覽器插件:ActiveX、Mozilla(firefox)
    實際上為了更清晰一點,我們可以反過來說說VLC不支持哪些常見的。首先是RealVideo(Real的Audio部分支持),因為Real的 Video加碼器存在版權的問題。實際上VLC 0.9.0已經加入了RealVideo的支持,但是需要額外的解碼器(類似MPlayer)。另外,VLC不支持3GP的音頻格式AMR。
     
    VLC原先是幾個法國的大學生做的項目,後來他們把VLC作為了一個開源的項目,吸引了來自世界各國的很多優秀程序員來共同編寫和維護VLC,才逐漸變成了現在這個樣子。
    至於為什麼叫VideoLan Client,是因為以前還有一個VideoLan Server的項目(簡稱VLS),而目前VLS的功能已經合併到VLC中來,所以VLC不僅僅是一個視頻播放器,它也可以作為小型的視頻服務器,更可以 一邊播放一邊轉碼,把視頻流發送到網絡上。VLC最為突出的就是網絡流的播放功能,例如MPEG2的UDP TS流的播放和轉發,幾乎是無可替代的。
    對普通用戶來說,VLC還有一個好處是不影響Windows中的解碼器。VLC通常不影響也不依賴於系統中自帶的解碼器(除了realvideo和quicktime的類型),很綠色很環保;更不用擔心流氓軟件、廣告插件之類的噁心的玩意兒。
    從程序結構來看,VLC的可擴展性是相當優秀的。VLC絕大部分用高效的C代碼來編寫(少量的C++和彙編),但是實現了完全動態的模塊化,所有功能包括 程序框架本身都是module,可以在運行時載入,這使得VLC可以輕易的擴展多種功能並且容易維護。它的架構有一點類似於DirectShow的技術。
    VLC也很注重版權方面的問題,你可以放心的自由的使用而不需要為版權的問題擔心——VLC只包括免費的、自由的庫。VLC基於GPL,因此也可以用於商業應用,只需要保留GPL,以及公開源代碼,如果你修改了VLC的話。
    下面是VLC相關的一些鏈接
    VLC官方網站:http://www.videolan.org/
    VLC下載頁面:http://www.videolan.org/vlc/
    VLC下載目錄(源碼和安裝包):http://download.videolan.org/pub/videolan/vlc/
    VLC Nightly Builds:http://nightlies.videolan.org/
    VLC 開發Wiki:http://wiki.videolan.org/Developers_Corner
    VLC Win32第三方庫預編譯包下載目錄:http://download.videolan.org/pub/testing/win32/
    VLC 官方論壇:http://forum.videolan.org/
    VLC 郵件列表:http://www.videolan.org/developers/lists.html
     
    二、Windows平台編譯
    第一步,要創建編譯VLC的環境。VLC在Windows下可以用Msys+MingW 或者Cygwin的方式來編譯,二者大同小異,這裡主要介紹Cygwin。
    Cygwin是一個在Windows下面模擬Linux環境的東西。它提供了很多庫和應用程序,讓你可以像在Linux上一樣來使用Windows。你需 要在http://www.cygwin.com/下載一個cygwin的安裝程序setup.exe。然後選擇一個cygwin的源來下載所需要的庫, 國內的話到ftp://ftp.sjtu.edu.cn/cygwin/和http://www.cygwin.cn/pub相對來說會快一點。第一次安 裝,除了默認的庫以外,我們還需要加入一些庫來支持VLC的編譯,包括
    Archive (目錄)
    unzip
    zip
    Devel
    autoconf
    automake
    binutils
    cvs
    expat
    gcc
    gcc-core
    gcc-g++
    gcc-mingw
    gcc-mingw-core
    gcc-mingw-g++
    gdb (如果你需要調試的話)
    gettext
    gettext-devel
    git (不一定需要)
    libiconv
    libtool
    make
    mingw-runtime
    nasm
    patchutils
    pkg-config
    subversion
    Editor
    vim (有了它方便點)
    Libs
    libgcrypt
    Web //這兩個可以不要,如果你不想編譯第三方庫
    curl (optional: for building extras/contrib)
    wget (optional: for building extras/contrib)
     
    然後是下載所需要版本的VLC的源代碼。對於Release版本,可以從這裡下載:http://download.videolan.org/pub /videolan/vlc/,如果你需要下載實時最新的庫,就要從VLC的源碼庫上取下來了。現在VLC改用git了,使用命令: git clone git://git.videolan.org/vlc.git
     
    VLC還需要很多第三方的庫,你可以取得源碼來編譯,這部分可以參考Linux上的VLC編譯的文章。在Windows上VLC做了一個編譯好的 win32第三方庫的包,可以從http://download.videolan.org/pub/testing/win32/下載。包需要解壓到根 目錄 『/』,事實上這些庫都位於』/usr/win32-branch』裡邊。
     
    在cygwin中進入vlc的主目錄,運行bootstrap,』./bootstrap』。在等待它結束之前,我們先來看一下如何配置VLC的編譯。運 行 『./configure -h >cfg_opt.txt』就可以把配置的選項信息都輸出到 cfg_opt.txt中,然後慢慢來研究。裡面大多是啟用、禁用某些特性和功能模塊,或者配置某些模塊需要的庫的路徑等信息。為了方便可以寫一個簡單的 腳本來做這件事,當然這個不是必需的。
    PATH=/usr/win32-branch/bin:$PATH
    PKG_CONFIG_PATH=/usr/win32-branch/lib/pkgconfig
    CPPFLAGS=」-I/usr/win32-branch/include -I/usr/win32-branch/include/ebml」
    LDFLAGS=-L/usr/win32-branch/lib
    CC=」gcc -mno-cygwin」 CXX=」g++ -mno-cygwin」
    ./configure
    –host=i686-pc-mingw32
    –disable-gtk
    –enable-nls –enable-sdl –with-sdl-config-path=/usr/win32-branch/bin
    –enable-ffmpeg –with-ffmpeg-mp3lame –with-ffmpeg-faac
    –with-ffmpeg-zlib –enable-faad –enable-flac –enable-theora
    –with-wx-config-path=/usr/win32-branch/bin
    –with-freetype-config-path=/usr/win32-branch/bin
    –with-fribidi-config-path=/usr/win32-branch/bin
    –enable-live555 –with-live555-tree=/usr/win32-branch/live.com
    –enable-caca –with-caca-config-path=/usr/win32-branch/bin
    –with-xml2-config-path=/usr/win32-branch/bin
    –with-dvdnav-config-path=/usr/win32-branch/bin
    –disable-cddax –disable-vcdx –enable-goom
    –enable-twolame –enable-dvdread
    –enable-release –enable-dca
    –enable-mkv
    –enable-quicktime –enable-mozilla
    –with-mozilla-sdk-path=/usr/win32-branch/gecko-sdk
    –enable-mostly-builtin
    && make
     
    例如把這個文件保存為 『mybuild』,等bootstrp運行結束之後,我們只需要運行一下 mybuild就會開始配置和編譯了。這通常需要挺長的時間,如果運氣好,在漫長的等待之後make運行成功,vlc就編譯好了。直接雙擊主目錄裡邊的 vlc.exe應該就可以運行了。
    為了方便可以把它打包,最簡單的是 『make package-win32-base』,它將創建一個子目錄來存放所有運行所需的東西,這個目錄就是一個綠色版的VLC啦。
    當然如果你運氣沒那麼棒,可能會碰到各種各樣的錯誤,例如在boottrap或者configure中出錯,通常是因為沒安裝某個庫或者庫的版本不合適;也可能碰到編譯的錯誤,嘗試去google一下。
     
    本文參考http://wiki.videolan.org/Win32CompileCygwinNew
     
    三、Linux平台編譯
    先下載源代碼,把源代碼解壓之後也是先運行一下bootstrap,看看缺什麼工具沒有,例如gcc、make、libtool、automake、autoconfig等是否有合適的版本。如果不合適的話就用你喜歡的方式去升級或者安裝。
    下面最麻煩的一步來了。VLC在Linux上沒有給出和Windows上類似的第三方庫的預編譯包,你必須去自己獲得並編譯這些庫。這些庫的數量取決於你 的配置選項。VLC給出了一個自動化的解決方案,關注一下主目錄extrascontrib,裡邊有一些工具來幫助你自動下載、patch和編譯所有 可能用到的第三方庫。先運行一下那個目錄下的bootstrap,如果缺少***.mak的話可以到VLC的代碼庫中找一下,是一個系統相關的文件,然後 簡單的一句make就可以了。如果你對這些庫比較熟悉的話最好先手動篩選一下,有一些可能不是你所需要的,而下載他們可能需要很長的時間。
    在漫長的等待之後,如果一切順利(我幾乎不相信會這樣),這一步就算完成了。可能遇到的問題有:下載實在太慢,可以用其他下載工具把庫的代碼包下下來放到extrascontribsrc裡邊;如果下載一半斷掉,可以把那個不完整的文件刪掉重新再運行make。
    這一步做完之後和windows上的編譯就幾乎一樣了。寫一個配置腳本然後運行它。例如一個配置腳本:
    ./configure
    –enable-release
    –disable-skins2
    –disable-wxwidgets
    –enable-mozilla
    –with-mozilla-sdk-path=./gecko-sdk
    –disable-sout
    –disable-httpd
    –enable-live555
    –disable-dvdnav
    –disable-libcdio
    –disable-libcddb
    –disable-cdda
    –disable-vcd
    –disable-dvdread
    –disable-smb
    –disable-cmml
    –disable-alsa
    –disable-opengl
    –disable-png
    –disable-screen
    –disable-mkv
    –disable-mod
    –disable-mpc
    –disable-libtar
    –disable-speex
    –disable-visual
    –disable-daap
    –disable-bonjour
    –disable-gnutls
    –enable-faad
    –enable-mostly-builtin
    配置完之後再運行make就可以了。
    參考:http://wiki.videolan.org/UnixCompile
     
    四、使用
    VLC的功能很強大,它不僅僅是一個視頻播放器,也可作為小型的視頻服務器,更可以一邊播放一邊轉碼,把視頻流發送到網絡上。
    最簡單的,從界面打開一個文件播放,也可以在命令行下使用,如C:Program FilesVideoLANVLC>vlc.exe test.ts
    獲取內置的幫助,會寫到vlc-help.txt:C:Program FilesVideoLANVLC>vlc.exe -h
    獲取更詳細的幫助,有大量的選項介紹:C:Program FilesVideoLANVLC>vlc.exe -H
     
    在線使用幫助
    http://www.videolan.org/doc/play-howto/en/play-howto-en.html
    http://www.videolan.org/doc/streaming-howto/en/streaming-howto-en.html
     
    搜索並顯示可用的模塊列表:C:Program FilesVideoLANVLC>vlc.exe -l
     
    Windows下,默認情況,VLC的配置文件在 %APPDATA%vlcvlcrc,%APPDATA%在XP下通常是 C:Documents and Settings用戶名Application Data
    Linux下,在用戶home目錄的/.vlc/中
     
    vlc的選項完全可以通過修改vlcrc來設置,界面只是略微方便一點
    重置所有選項到默認狀態:C:Program FilesVideoLANVLC>vlc.exe –reset-config
    VLC從vlcrc中指定的plugin-path,以及當前目錄的modules和plugins目錄來遞歸查找plugin,VLC的大部分功能都是 通過plugin來實現的。VLC默認有大量的動態插件,為了加快啟動速度,vlc會在%APPDATA%vlccache中緩存plugin的列 表,選項plugins-cache=0可以禁止緩存plugin
     
    打開一個UDP組播流,組播組 239.255.1.1,端口 4567,默認端口1234,對於rtp協議,VLC會自動識別,寫udp還是rtp都沒問題
    C:Program FilesVideoLANVLC>vlc.exe udp://@239.255.1.1:4567
     
    在本地UDP端口 888 接收流, 「@」表示綁定一個地址,而不是連接該地址
    C:Program FilesVideoLANVLC>vlc.exe udp://@888
     
    串流輸出,就是在播放的時候,以某種方式向外傳送視頻,在打開界面的串流/保存 中設置會比較方便。
    例如,循環播放test.ts, 以rtp方式傳送到224.1.1.1端口1234, 同時顯示視頻
    vlc.exe test.ts –loop :sout=#duplicate{dst=std{access=rtp,mux=ts,dst=224.1.1.1:1234},dst=display}
     
    例如,接收UDP端口888,數據全部保存到C:dump.ts
    vlc.exe udp://@888 :demux=dump :demuxdump-file=」C:dump.ts」
     
    關於Windows下視頻輸出模塊
    Direct3D :效果比DirectX差一點,但是方便截圖,也可以在圖像上實現alpha
    DirectX:效果最好,利用DirectX的顯示加速
    OpenGL:在不同的硬件上表現不太一樣
    WinGDI:最慢的一種,不需要顯卡加速
    caca:用彩色的Assic字符來顯示
     
    臨時啟用某個視頻輸出,可以這樣:C:Program FilesVideoLANVLC-0.8.6e>vlc test.ts –vout=caca
     
    ActiveX控件
    官方發佈的VLC自帶ActiveX控件 axvlc.dll,註冊之後可以方便的在應用程序和網頁中使用VLC,註冊的辦法是
    C:Program FilesVideoLANVLC-0.8.6e>regsvr32 axvlc.dll
    ActiveX VLC的使用方法可以參考源代碼中ActiveX目錄的README.TXT和test.html,ActiveX控件的接口有第一版和第二版,第一版簡單,功能少,已經不再維護建議用第二版本,功能多一點
     
    Mozilla Plugin
    你還可以在Windows和Linux的Firefox中使用VLC。Windows下可以在安裝VLC的時候選上Mozilla plugin,事實上它做的就是在HKLM_Software_MozillaPlugin鍵下添加一個VLC的子鍵。Linux下可以把 libvlcplugin.so(或者叫npvlc.so)和插件目錄放到Firefox的plugins目錄,來使之生效。
    同樣這適用於基於Xulrunner的應用程序,事實上像 Miro、SongBird等xul應用都是用的這個插件。與ActiveX類似的,VLC的Mozilla Plugin也有兩套接口,建議用新的第二版。
     
    註冊表
    在Windows下VLC只使用很少量的註冊表的信息,最重要的一條是HKLM_Software_VLC鍵下的InstallDir項,VLC的 Mozilla Plugin和ActiveX控件通過這一項來定位其插件的目錄。Telnet、Http控制對VLC來說,控制界面都是Interface類的模塊,你 可以使用各種控制模塊。Windows下默認使用的是wxwidgets圖形界面,還可以使用http、telnet等界面,來遠程控制VLC,如果用 VLC在服務器上專門作視頻流轉發一類的事情,這種遠程界面可以幫上大忙。
     
    視頻過濾器
    0.8系列中有多達13種視頻過濾器,為視頻添加各種效果和特殊處理。
     
    Skin2界面
    一個漂亮一點的,可以換膚的界面。
     
    其他的
    播放DVD、VCD光盤,打開DirectShow設備,播放當前屏幕…
     
    一些問題
    目前的VLC無法播放Real視頻,如rm、rmvb。其實從0.9版本的VLC開始可以依賴其他解碼器播放。但就目前測試的情況來看,順序播放沒問題,但是拖動則效果很差。RTSP的播放,拖動有問題,在獲取播放位置時有缺陷。例如和達爾文服務器的配合。
     
    五、視頻播放的基本原理
    幾乎所有的視頻播放器,如VLC、MPlayer、Xine,包括DirectShow,在播放視頻的原理和架構上都是非常相似的,理解這個對理解VLC的源碼會有事半功倍的效果。
    大致的來說,播放一個視頻分為4個步驟:
    1. acess 訪問,或者理解為接收、獲取、得到
    2. demux 解復用,就是把通常合在一起的音頻和視頻分離(還有可能的字幕)
    3. decode 解碼,包括音頻和視頻的解碼
    4. output 輸出,也分為音頻和視頻的輸出(aout和vout)
    拿播放一個UDP組播的MPEG TS流來說吧,access部分負責從網絡接收組播流,放到VLC的內存緩衝區中,access模塊關注IP協議,如是否IPv6、組播地址、組播協議、 端口等信息;如果檢測出來是RTP協議(RTP協議在UDP頭部簡單得加上了固定12個字節的信息),還要分析RTP頭部信息。這部分可以參看VLC源碼 /modules/access/udp.c。在同目錄下還可以看到大量的access模塊,如file、http、dvd、ftp、smb、tcp、 dshow、mms、v4l…等等
    而demux部分首先要解析TS流的信息。TS格式是MPEG2協議的一部分,概括地說,TS通常是固定188字節的一個packet,一個TS流可以包 含多個program(節目),一個program又可以包含多個視頻、音頻、和文字信息的ES流;每個ES流會有不同的PID標示。而又為了可以分析這 些ES流,TS有一些固定的PID用來間隔發送program和es流信息的表格:PAT和PMT表。關於TS格式的詳細信息可以去google一下。 VLC專門做了一個獨立的庫libdvbpsi來解析和編碼TS流,而調用它的代碼可以參見VLC源碼 /modules/demux/ts.c。
    其實之所以需要demux,是因為音視頻在製作的時候實際上都是獨立編碼的,得到的是分開的數據,為了傳輸方便必須要用某種方式合起來,這就有了各種封裝 格式也就有了demux。demux分解出來的音頻和視頻流分別送往音頻解碼器和視頻解碼器。因為原始的音視頻都是佔用大量空間,而且冗余度較高的數據, 通常在製作的時候就會進行某種壓縮。這就是我們熟知的音視頻編碼格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、H.264、 rmvb等等。音視頻解碼器的作用就是把這些壓縮了的數據還原成原始的音視頻數據。VLC解碼MPEG2使用了一個獨立的庫libmpeg2,調用它的源 文件是 /modules/codec/libmpeg2.c。VLC關於編解碼的模塊都放在/modules/codec目錄下,其中包括著名的龐大的 ffmpeg。
    解碼器,例如視頻解碼器輸出的是一張一張的類似位圖格式的圖像,但是要讓人從屏幕看得到,還需要一個視頻輸出的模塊。當然可以像一個Win32窗口程序那 樣直接把圖像畫到窗口DC上——VLC的一個輸出模塊WinGDI就是這麼幹的,但是通常這太慢了,而且消耗大量的CPU。在Windows下比較好的辦 法是用DirectX的接口,會自動調用顯卡的加速功能。
    這樣的功能分解使得模塊化更容易一點,每個模塊住需要專注於自己的事;從整體來說功能強大而且靈活。
    但是事情總是不會那麼簡單。就拿access來說,媒體的訪問是分層的,如RTSP就涉及到IPv4、TCP、UDP、RTCP、RTSP等多個層次的協 議。有些視頻格式包括了傳輸、封裝格式和編輯碼格式如MPEG系列,有些封裝格式是獨立的容器,但是很多人會誤解它是編解碼格式,如mkv、avi這些。
    音頻和視頻在demux之後就是獨立的,但是需要有一套機制把它們同步起來。同時我們需要有一套機制來控制速度、暫停、停止、跳進,獲取各種媒體信息,這些都是很複雜而又很重要的事情。
    另外也許需要在某個地方插入一些修改,來實現某種效果。如音頻的EQ,視頻的亮度調整之類的,VLC專門設計了access_filter、audio_filter和video_filter類型的模塊來做這一類事情。
    VLC比較獨特的地方是集成了原來的VLS的功能,這依賴於VLC中stream_output類型的模塊,它們可以把正在播放的視頻以某種方式重新轉碼和發送出去,如http、UDP、文件等等。
    MPlayer的結構與此是類似的,如/stream目錄對應的是access的功能,/mpdemux對應的demux功能,/libmpcodecs是解碼器,/libvo和/libao2分別是視頻和音頻的輸出。
    DirectShow也是類似的,不過分類更多一些更複雜一點。DirectShow裡面的模塊叫做「filter」,filter之間通過」pin」來 連接。access的模塊對應於DirectShow中的SourceFIlter,這一類Filter只有輸出pin沒有輸入pin。demux模塊對 應於splitter filter,這種filter有一個輸入pin,多個輸出pin。解碼模塊是一類transform filter,有一個輸入pin、一個輸出pin,輸出模塊對應於readering filter,有一個輸入pin,沒有輸出pin。當然transform filter不一定是解碼器,也可能是某種其他的處理。
    另外給出一個VLC的API Document,參見:http://rogerfd.cn/doc/vlcapi.htm
     
    六、精簡
    VLC默認包含了大量的功能,超過2百個插件;Windows下安裝包大小接近10MB,安裝之後超過35MB。有時候如果我們只需要部分的功能,應該如何精簡它呢?
    精簡VLC的第一步是重新配置編譯選項,將不需要的功能去掉。一個精簡配置腳本如下:
    PATH=/usr/win32-branch/bin:$PATH
    PKG_CONFIG_PATH=/usr/win32-branch/lib/pkgconfig
    CPPFLAGS=」-I/usr/win32-branch/include -I/usr/win32-branch/include/ebml」
    LDFLAGS=-L/usr/win32-branch/lib
    CC=」gcc -mno-cygwin」 CXX=」g++ -mno-cygwin」
    ./configure
    –with-freetype-config-path=/usr/win32-branch/bin
    –with-fribidi-config-path=/usr/win32-branch/bin
    –disable-ffmpeg
    –disable-live555
    –disable-cddax
    –disable-vcdx
    –disable-skins2
    –disable-wxwidgets
    –disable-mozilla
    –disable-httpd
    –disable-dvdnav
    –disable-libcdio
    –disable-libcddb
    –disable-cdda
    –disable-sdl
    –disable-sdl-image
    –disable-vcd
    –disable-dvdread
    –disable-smb
    –disable-cmml
    –disable-alsa
    –disable-opengl
    –disable-png
    –disable-screen
    –disable-mkv
    –disable-mod
    –disable-mpc
    –disable-libtar
    –disable-speex
    –disable-visual
    –disable-daap
    –disable-bonjour
    –disable-gnutls
    –disable-vorbis
    –disable-real
    –disable-xml
    –disable-x264
    –enable-sout
    –enable-activex
    –enable-release
     
    從這個腳本可見,主要是禁用了大量的功能。運行 ./configure -h 可以顯示每一個配置項的意義;如果還不清楚可以再去搜一下選項對應的庫的位置。ffmpeg是一個龐大的編解碼庫,但是MPEG2的解碼可以利用另一個庫 libmpeg2,所以在這裡不需要它。
    注意make完之後要用make package-win32-base來打一下包,打包時會用strip工具來壓縮每一個可執行文件。
    但是這樣還沒有結束。配置項並不是很全面的,而且還會有一些小問題,例如xml禁用了還會有。。。於是還需要手動的清理一下plugins目錄裡面的插 件,挑出沒有用處的,這也需要對VLC模塊的熟悉。或者使用Roger的笨方法,一個一個試,對功能沒有影響的就拿掉。SImpleTV0.4所使用的 plugin如以下所示:
    liba52sys_plugin.dll liba52 用於AC3格式的音頻解碼,CCTV高清頻道需要
    liba52tofloat32_plugin.dll
    liba52tospdif_plugin.dll
    liba52_plugin.dll
    libaccess_file_plugin.dll 文件訪問,播放文件需要
    libaccess_http_plugin.dll HTTP訪問模塊
    libaccess_output_file_plugin.dll sout的文件模塊,用於錄製
    libaccess_udp_plugin.dll UDP訪問模塊
    libaout_directx_plugin.dll DirectX的聲音輸出,默認的聲音輸出模塊
    libdeinterlace_plugin.dll 解交錯的vout-filter模塊
    libdirect3d_plugin.dll Direct3D視頻輸出模塊,在上面可以半透明。。。
    libfixed32tofloat32_plugin.dll 一些數據轉換模塊
    libfixed32tos16_plugin.dll
    libfloat32tos16_plugin.dll
    libfloat32tos8_plugin.dll
    libfloat32tou16_plugin.dll
    libfloat32tou8_plugin.dll
    libfloat32_mixer_plugin.dll
    libglwin32_plugin.dll OpenGL視頻輸出模塊
    libi420_ymga_plugin.dll
    libi422_yuy2_plugin.dll
    libipv4_plugin.dll IPv4網絡模塊
    libipv6_plugin.dll IPv6網絡模塊
    liblibmpeg2_plugin.dll libmpeg2,解碼全靠它
    liblogger_plugin.dll 日誌模塊,調試必備
    libmemcpy_plugin.dll 好像是利用各種CPU指令加速內存拷貝的
    libmpeg_audio_plugin.dll MPEG音頻的解碼模塊
    libmpgatofixed32_plugin.dll
    libmpga_plugin.dll
    libmux_dummy_plugin.dll
    libpacketizer_mpegvideo_plugin.dll
    libs16tofixed32_plugin.dll
    libs16tofloat32swab_plugin.dll
    libs16tofloat32_plugin.dll
    libs8tofloat32_plugin.dll
    libsimple_channel_mixer_plugin.dll
    libstream_out_display_plugin.dll sout的模塊 。。。
    libstream_out_duplicate_plugin.dll
    libstream_out_standard_plugin.dll
    libtrivial_channel_mixer_plugin.dll
    libtrivial_mixer_plugin.dll
    libtrivial_resampler_plugin.dll
    libts_plugin.dll TS流的解復用模塊
    libu8tofixed32_plugin.dll
    libu8tofloat32_plugin.dll
    libugly_resampler_plugin.dll
    libvout_directx_plugin.dll DirectX視頻輸出模塊
    libwingdi_plugin.dll GDI視頻輸出模塊
    作為ActiveX控件的VLC,只需要這些模塊和axvlc.dll就足夠了。當然如果使用了libvlc.dll還要帶上。
     
    VLC 0.9.2 正式發佈 && VLC播放Rm Rmvb的插件
    新的VLC加入了RealVideo的demux和codec module,已經可以播放rm、rmvb格式的real視頻,但是需要下載以下兩個附件:
    pncrt.dll 拷貝到 C:Program FilesVideoLANVLC
    drv43260.dll 拷貝到 C:Program FilesVideoLANVLCplugins
    這兩個文件也可以從MPlayer的win32 codec中拷貝出來。從測試的情況來看,順序播放沒有什麼問題,但是跳轉的時候比較慢,圖像不太穩定
    這裡有對VLC新特性的介紹http://wiki.videolan.org/What_is_cool_in_0.9
    Release Note:http://www.videolan.org/developers/vlc/NEWS
    下載目錄:http://download.videolan.org/pub/vlc/0.9.2/win32/
    下載鏈接(exe):http://download.videolan.org/pub/vlc/0.9.2/win32/vlc-0.9.2-win32.exe
     
    七、將VLC嵌入自己的應用
    總的來說把VLC內嵌入自己的應用有4種途徑:
    ‧直接調用VLC進程
    ‧VLC的plugin for Mozilla
    ‧VLC的ActiveX插件
    ‧調用libvlc
    當然,理論上也可以把VLC的源碼直接扣出一部分來放到自己的程序中,不過這種方法難度太大沒多大意義。
    先說第一種辦法,別懷疑,這是非常有用的一種解決方案,特別是對於轉碼、流轉發等應用,通常直接調用VLC就可以了。VLC有HTTP和Telnet的 Interface模塊(就是和用戶交互的界面),也很方便和遠程交互。而且跨平台應用也非常方便,只需要安裝不同平台的VLC就行了。直接調用VLC的 話最重要的就是參數,可以從 vlc.exe -H 中獲取比較詳細的命令行參數介紹。對於轉碼、轉發的,命令行參數會比較複雜,可以用GUI先試一下,然後把界面上的Generated stream output string拷下來。
    VLC的Mozilla plugin除了用於Firefox的web頁之外,還可以用於任何XUL-base的應用,這種應用通常使用xulrunner來啟動。XUL是一種用 XML來寫界面的語言,有點像HTML而且也兼容大部分HTML標記,Firefox就是用XUL來寫的。VLC的Mozilla插件通常用 Javascript來控制,詳細的接口文檔可以參考這裡:http://www.videolan.org/doc/play-howto/en /ch04.html#id310965這個接口有比較老的第一版和比較新的第二版,建議用新的,功能多一些。用VLC的Mozilla插件的應用並不 少,例如比較出名的Miro、Songbird。因為這個好處是顯而易見的:跨平台、可控性強、使用簡單;限制也很明顯:專為Mozilla設計,應用的 範圍很窄。
    VLC的ActiveX插件只能用於Windows平台,當然這是因為ActiveX只是微軟的東西。但是不得不說這個還是很好用的。無論是C++、 C#、VB還是網頁,都可以輕鬆地將這個ActiveX利用起來。關於這個的VLC官方文檔在這裡http://wiki.videolan.org /ActiveX_Controls開發、使用之前別忘了先要註冊ActiveX控件,方法是運行 regsvr32 axvlc.dll。Roger 之前寫的 SimpleTV 就是調用了VLC的ActiveX控件,所以這也可以作為一個示例的代碼,可以主要看看怎麼調用這個控件來做串流的代碼:
    //Create Option for the plugin
    bool bIPv6 = false;
    if (strstr (szMRL, 「::」))
    {
    bIPv6 = true;
    }
     
    tagVARIANT opt,var,ip6;
    CString sout, ipv6 = 「ipv6=1〞;
    SAFEARRAY *psa;
    long index;
    SAFEARRAYBOUND bound[1] = {0};
    bound[0].cElements = bIPv6 ? 2 : 1;
     
    if (m_cfg.bDisplayWhenRecording)
    {
    sout.Format(」sout=#duplicate{dst=display,dst=std{access=file,mux=ts,dst=」%s」}}」,
    strName);
    }
    else
    {
    sout.Format(」sout=#duplicate{dst=std{access=file,mux=ts,dst=」%s」}}」, strName);
    }
     
    var.vt = VT_BSTR;
    var.bstrVal = sout.AllocSysString();
    psa = SafeArrayCreate (VT_VARIANT, 1, bound);
    index = 0;
    SafeArrayPutElement (psa, &index, &var);
    if (bIPv6)
    {
    ip6.vt = VT_BSTR;
    ip6.bstrVal = ipv6.AllocSysString();
    index = 1;
    SafeArrayPutElement (psa, &index, &ip6);
    }
    opt.vt = VT_ARRAY | VT_BSTR;
    opt.parray = psa;
     
    tagVARIANT nul;
    nul.vt = VT_NULL;
    m_vlc.GetPlaylist ().add (szMRL, nul, opt);
    m_vlc.GetPlaylist ().next ();
    m_vlc.GetPlaylist ().play ();
     
    很多人調用VLC的ActiveX控件都會遇到一個問提就是,播放沒有反應。大部分的原因都是因為plugins的問題。VLC作為exe運行時會遞歸搜 索當前目錄下的modules和plugins目錄來尋找plugin,但是當以ActiveX控件運行時,默認只會檢查註冊表的 HKLM_Software_VideoLan_VLC_InstallDir,並添上plugins作為模塊搜索路徑,如果這個路徑沒有設置或者設置不 對,VLC將找不到大部分的模塊,導致大部分功能缺失而無法運行。如果需要修改這一特性可以修改 activexplugin.cpp (0.8.6i)中的 VLCPlugin::getVLC函數。在SimpleTV中,Roger修改的一個片段是
     
    char p_pluginpath[MAX_PATH+1];
    int iTmp = 0;
    /* 得到SimpleTV.exe的全路徑 */
    DWORD dwLen = GetModuleFileNameA (NULL, p_pluginpath, MAX_PATH);
    for (iTmp = strlen(p_pluginpath) – 1; iTmp >= 0; — iTmp)
    {
    if (p_pluginpath[iTmp] == 『\』)
    {
    p_pluginpath[iTmp] = 0;
    break;
    }
    }
    /* 將模塊路徑設為SimpleTV下的 playermodules */
    strcat (p_pluginpath, 「\player\modules「);
    ppsz_argv[ppsz_argc++] = 「–plugin-path」;
    ppsz_argv[ppsz_argc++] = p_pluginpath;
     
    還有一點是配置文件vlcrc的路徑,如果需要修改的話,可以修改 src/misc/configuration.c 中的 GetDir 函數, 在Windows下這個目錄默認返回 %APPDATA% ,以上兩步做好的話其實就可以做出一個Portable的綠色版VLC了。
    和其他ActiveX的播放器,例如WMP、QuickTime、RealPlayer相比,VLC的優點也很明顯:自帶所需解碼器、開源、功能強大。
    當然ActiveX方式和Mozilla 插件的方式也是有局限性的,這樣的方式功能還不夠強大,例如沒有截屏的接口…如果需要更多完整的功能,可以考慮直接調用libvlc的接口,
     
    VLC官方提供了一些文檔和例子http://wiki.videolan.org/Libvlc。這裡還有一個用C#調用libvlc的例子http://jeremiah.blog.51cto.com/539865/116981
    在Windows下libvlc可能默認是不編譯的(0.8.6i),可以在configure中開啟這一選項 –enable-shared-libvlc
    完整的VLC體積還是不小的,如果只需要VLC一部分功能的話,可以最後做一下精簡。
     
    VLC問題及解決
     
     
     
    編譯VLC 1.1.4 出現一大堆libtool的錯誤,類似如下的:
    ../libtool: line 2253: X-g: command not found
    ../libtool: line 2253: X-O2: command not found
     
    解決方法:./myvlc.sh 後 cp /usr/bin/libtool ./ 
     
     
    在windows xp下編譯ffmpeg
     
     
    1.安裝MSys
    到http://sourceforge.net/project/showfiles.php?group_id=2435下載文件:
      bash-3.1-MSYS-1.0.11-tar.bz2
      msysCORE-1.0.11-2007.01.19-1.tar.bz2
    msysCORE-1.0.11-2007.01.19-1.tar.bz2下載鏈接:
    http://sourceforge.net/project/downloading.php?group_id=2435&use_mirror=nchc&filename=msysCORE-1.0.11-2007.01.19-1.tar.bz2&39247800
    bash-3.1-MSYS-1.0.11-tar.bz2下載鏈接:
    http://sourceforge.net/project/downloading.php?group_id=2435&use_mirror=nchc&filename=bash-3.1-MSYS-1.0.11-1.tar.bz2&93684193
     
      解壓msysCORE-1.0.11-2007.01.19-1.tar.bz2,比如解壓到D:msys(以下內容都使用該路徑描述)。
      解壓bash-3.1-MSYS-1.0.11-tar.bz2,產生一個名為bash-3.1的目錄,在該目錄下有一個子目錄名為bin,其他 的目錄不需要關心。複製bin目錄中的所有文件到D:msysin,提示是否要覆蓋sh.exe的時候,選擇是。
      到「D:msyspostinstall」目錄下執行pi.bat,在出現的提示中輸入n回車後,按任意鍵退出即可。 如果你不輸入N的話就輸入兩次Y,最後把c:msysmingw 輸入即可 。如果輸入N的話,要打開D:msysetcfstab.sample把它重命名為fstab 並用nodepad打開編輯,把c:mingw mingw 改成d:msysmingw即可。最後配置PATH,在系統的環境配置中添加d:msysin。
    2.安裝MinGW
      同樣是到http://sourceforge.net/project/showfiles.php?group_id=2435下載文件:
      binutils-2.17.50-20060824-1.tar.gz
      gcc-core-3.4.5-20060117-1.tar.gz
      gcc-g++-3.4.5-20060117-1.tar.gz
      w32api-3.9.tar.gz
      mingw-runtime-3.12.tar.gz
      把它們全部解壓到D:msysmingw。
    或者直接下載MinGW.exe文件 下載好按步驟安裝,選擇安裝的組件最好都選上啦。不過安裝目錄一定要選擇d:msysmingw 別的路徑它找不到。
    3.修改「msys.bat」
      用文本編輯器打開D:msysmsys.bat, 安裝微軟的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路徑替換成機器上vcvars32.bat實際存在的路徑,比如我的在「c:Program FilesMicrosoft Visual Studio .NET 2005Vcin」,於是就添加:
      call "c:Program FilesMicrosoft Visual Studio .NET 2005Vcinvcvars32.bat"
    4.svn
    http://tortoisesvn.net/downloads下載TortoiseSVN,安裝好之後,在d:ffmpeg右擊,選擇SVN check out,
    第一行目錄選擇svn://svn.mplayerhq.hu/ffmpeg/trunk 然後確定。這樣就得到最新的SVN。
    但由於SVN只針對UNIX系統做的。所以無法GCC對最新的SVN編譯。會報錯:192 PR command not found.
    解決方法一:不用最新的SVN版本。因為即使用了最新的MinGW5.1.exe還是有這樣的錯誤。 windows下還是無法編譯最新的SVN代碼。我這有07年3月的版本是可以用的。需要的可以索要。
    解決方法二:下載
     
    coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2 Mirror
    並且解壓縮出來,把bin下的內容拷貝到MSYS下,因為MSYS缺少COREUTILS所以報錯 PR command not found。
    改完後你會發現可以編譯了,但是make的時候又出錯了。怎麼辦呢?去sourceforge網站上下載make-3.81-MSYS-1.0.11-2.tar.bz2,替換掉原來的make.exe文件即可 (搜索了一天時間,提供出來免得大家走歪路!)
    這樣就可以用最新的SVN版本來進行編譯了。
    5.測試
    打開msys.bat,輸入cd空格/d/ffmpeg,路徑變化後,然後輸入./configure空格--enable-memalign-hack,回車!
    如果不報錯,那麼再輸入make.
    6.第三方插件
    根據以上5個步驟就已經可以得到ffmpeg.exe了,但沒有加入聲音,以及對其他格式支持的也不夠好。
    現在開始加入lame,就是聲音。到http://oss.netfarm.it/mplayer-win32.php下載已經編譯的mp3lame庫 (可以向我索要),解壓出來後分別拷貝到你安裝好的mingw目錄下的相對目錄裡。在傳遞配置參數時要加入「--enable-libmp3lame」 ,即使用以下命令配置:
      ./configure --enable-static --disable-shared --enable-memalign-hack --enable-libmp3lame
    然後加入mp4的格式的支持:
    然後加入3GP的支持:
    編譯的時候加上--enable-amr_nb --enable-amr_wb參數就行,根據編譯系統的提示,所以我們得下載一
    些編譯3gp所需得文件。
    http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-510.zip
    解壓以後把裡面的文件都拷貝到libavcodec/amrwb_float
    http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-510.zip
    解壓以後把裡面的文件都拷貝到libavcodec/amr_float
     
    另附
    海狗哥的「MinGW下簡單編譯FFmpeg」:http://jeremiah.blog.51cto.com/539865/126804
    FFMPEG工程組--在Windows下編譯ffmpeg完全手冊:http://bbs.chinavideo.org/viewthread.php?tid=1897&extra=page%3D1
    windows平台下vlc編譯
     
    Jeremiah剛剛工作幾個月,參與的第一個項目是與視頻監控有關,分配給我的任務就是用開源的vlc做一個自己的播放器。
    對於開源項目來說,搭建起編譯環境是第一步也是最重要的一步。Jeremiah在歷經5天的痛苦折磨,google出了n多網頁,其中還包括一個德語的網 頁和韓語的網頁,終於編譯通過了vlc0.8.6d。百度到的ChinaUnix的一個網頁上面說:編譯vlc感覺就像被...,Jeremiah深有體 會啊。不過編譯成功,還是小興奮了一下。啊哈哈~!有些自虐傾向。
    在網上查到一個vlc的:49846130。裡面人快滿了,不知道什麼時候開個二群。有興趣的可以加一下,大家共同交流。
    廢話不多說了,步入正題。
    在windows下編譯vlc需要使用仿真Linux環境Cygwin或者Msys+MingW,據說差不多。但是Jeremiah沒有用過後者,所以在這只介紹Cygwin環境。
     
    編譯之前的說明:由於最近Cygwin更新了庫文件,導致出現了一些新的無法通過編譯的錯誤。Jeremiah將自己的應用的Cygwin-old的庫文件在我的公共郵箱提供了下載,具體下載方式為:
    1). 登錄http://mail.qq.com
    2). 用戶名:jeremiah_vlc
    3). 密碼:發郵件給我(jeremiah.vlc@gmail.com),我會告知。
    4). 在「我的文件夾」的「Jeremiah_VLC相關資源」有所有資料的超大附件連接。
     
    編譯第一步:去下載Cygwin。給個網址:[url]http://www.cygwin.com/setup.exe[/url](用我上面提供的,選擇從本地安裝)
     
    編譯第二步:安裝Cygwin。Cygwin需要安裝到某個盤的根路徑。然後要找個源下載相應的庫,[url]http://www.cygwin.cn /pub[/url]相對比較快,[url]ftp://ftp.sjtu.edu.cn/cygwin/[/url]作為參考。(如果用的本地的庫文 件,就不用寫這一項)然後就需要安裝其他庫來支持vlc的編譯了。目錄如下:
    Archive 
    unzip (5.52-2)
    zip (2.32-2)
    Devel 
    autoconf (4-1 2.13-3 2.61-1)
    automake (2-1 1.10-1 1.4p6-4 1.5-2 1.63-3 1.7.9-3 1.8.5-3 1.9.6-2)
    binutils (20080624)
    cvs (1.11.22-1)
    gcc (3.4.4-3)
    gcc-core (3.4.4-3)
    gcc-g++ (3.4.4-3)
    gcc-mingw (20040810-1)
    gcc-mingw-core (20050522-1)
    gcc-mingw-g++ (20050522-1)
    gdb (6.8-2)
    gettext (0.15-1)
    gettext-devel (0.15-1)
    git (1.6.0.2-1)
    libiconv (1.11-1)
    libgcrypt-devel (1.41-4)
    libtool (1.5.27a-1)
    make (3.81-2)
    mingw-runtime (3.15.1-1)
    nasm (2.02-1)
    patchutils (0.2.31-2)
    pkg-config (0.23a-2)
    subversion (1.5.2-1)
    Editor 
    vim (7.2-3)
    Libs 
    expat (2.0.1-1)
    libgcrypt (1.4.1-4)
    Web 
    curl (optional: for building extras/contrib) (7.16.3-1)
    wget (optional: for building extras/contrib) (1.11.3-1)
    經過比較漫長的下載過程,Cygwin就算安裝好了。建議將下載下來的文件(位於安裝文件同目錄)保留下來,下次安裝的時候直接從文件安裝就不用到網上下載了。
    第一次運行Cygwin,如果沒有產生下列代碼:
    Copying skeleton files. 
    These files are for the user to personalise 
    their cygwin experience. 
     
    These will never be overwritten. 
     
    `./.bashrc' -> `/home/wangwei1//.bashrc' 
    `./.bash_profile' -> `/home/wangwei1//.bash_profile' 
    `./.inputrc' -> `/home/wangwei1//.inputrc'
    則表示windows用戶沒有添加到Cygwin中,運行以下兩條命令添加用戶:
    mkpasswd -l [-d] > /etc/passwd 
    mkgroup -l [-d] > /etc/group
    其中-d可選,如果你在域中,需要用加入'-d 域名'。
    重新開啟Cygwin,在根目錄'/'下就會生成/home/yourname的文件夾。
     
    編譯第三步:下載源碼及第三方庫。vlc的所有的源碼(*.tar.gz,*.tar.bz2)及編譯好的綠色版(win32/*.zip),安裝版 (win32/*.exe)都可以在這裡下載:[url]http://download.videolan.org/pub/videolan/vlc /[/url]。Cygwin下編譯vlc最關鍵的就是源碼和第三方庫要相匹配,Jeremiah之所以編譯了5天,經歷了n多痛苦的過程,就是因為沒有 匹配好源碼和第三方庫,導致了大量的錯誤。上面網址裡面的vlc的版本很多,相對穩定的是vlc-0.8.6*版本,推薦0.8.6i,匹配的 contrib為:[url]http://download.videolan.org/pub/testing/win32/contrib- 20070530-win32-bin-gcc-3.4.5-only.tar.bz2[/url]。Jeremiah寫這篇博客的時候最新的發行版是 vlc-0.9.6,其實1.0.0已經在測試了,只是沒有正式發佈而已([url]http://nightlies.videolan.org /[/url]),vlc各個版本的更新日誌參考:[url]http://www.videolan.org/developers/vlc /NEWS[/url]。但是Jeremiah沒有編譯成功vlc-0.9.6,0.9.*版本推薦0.9.4,匹配的contib為:contrib- 20080811-win32-bin-gcc-4.2.1-sjlj-runtime-3.13-only.tar.bz2。
    Jeremiah將在未來幾篇博客中詳細介紹編譯0.8.6i和0.9.4。
    windows平台下vlc編譯之二:vlc-0.8.6i的編譯
    如果按照上一篇博客《windows平台下vlc編譯之一:編譯環境構建》安裝好了Cygwin,下載了源碼和第三方庫之後,我們就可以編譯vlc了。這篇博客先講如何編譯vlc-0.8.6i.
     
    步驟一:解壓源碼和第三方庫。
    源文件:http://download.videolan.org/pub/videolan/vlc/0.8.6i/vlc-0.8.6i.tar.gz
    庫:http://download.videolan.org/pub/testing/win32/contrib-20070530-win32-bin-gcc-3.4.5-only.tar.bz2
    將vlc-0.8.6i.tar.gz和contrib-20070530-win32-bin-gcc-3.4.5-only.tar.bz2拷貝到/home/username/下面(username為登陸的用戶目錄),運行以下命令解壓:
    tar xjvf contrib-20070530-win32-bin-gcc-3.4.5-only.tar.bz2 -C / 
    tar xzvf vlc-0.8.6i.tar.gz
    做一點點清理工作
    rm -rf /usr/win32/bin/moc
    rm -rf /usr/win32/bin/rcc
    rm -rf /usr/win32/bin/uic
     
    步驟二:Bootstrap
    cd vlc-0.8.6i 
    ./bootstrap
     
    可能出現的錯誤:
    + aclocal-1.9 -I m4 
    /usr/bin/m4:configure.ac:4643: cannot create temporary file for diversion: Permission denied
    autom4te-2.61: /usr/bin/m4 failed with exit status: 1 
    aclocal-1.9: autom4te failed with exit status: 1
    分析:殺毒軟件有關係,比如Jeremiah用的Mcafee就會出這樣的錯誤。
    解決方法:關閉殺毒軟件重新運行./bootstrap。
     
    步驟三:編輯vlc腳本
    在vic-0.8.6i下新建文本文件"configure-vlc01.sh"(見附件),內容如下:
    PKG_CONFIG_PATH=/usr/win32/lib/pkgconfig
    CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml"
    LDFLAGS=-L/usr/win32/lib
    CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin"
    ./configure
    --disable-gtk
    --enable-nls --enable-sdl --with-sdl-config-path=/usr/win32/bin
    --enable-ffmpeg --with-ffmpeg-mp3lame --with-ffmpeg-faac
    --with-ffmpeg-zlib --enable-faad --enable-flac --enable-theora
    --with-wx-config-path=/usr/win32/bin
    --with-freetype-config-path=/usr/win32/bin
    --with-fribidi-config-path=/usr/win32/bin
    --enable-live555 --with-live555-tree=/usr/win32/live.com
    --enable-caca --with-caca-config-path=/usr/win32/bin
    --with-xml2-config-path=/usr/win32/bin
    --with-dvdnav-config-path=/usr/win32/bin
    --disable-cddax --disable-vcdx --enable-goom
    --enable-twolame --enable-dvdread
    --enable-shared-libvlc
    --enable-debug
    想知道每個--enable,--disable是什麼意思,可以使用如下命令將configure的參數信息保存到confHelp.txt中,以後對照該文件查看修改vlc編譯腳本。
    ./configure -h > confHelp.txt
     
    步驟四:運行vlc腳本
    轉換下腳本的編碼格式:
    dos2unix configure-vlc01.sh
    運行腳本:
    ./configure-vlc01.sh
    如果腳本遇到了類似Permission denied的錯誤,提升腳本的權限:
    chmod 777 configure-vlc01.sh
    如果腳本運行成功,則會顯示如下信息:
    vlc configuration 
    -------------------- 
    vlc version : 0.8.6i 
    system: mingw32 
    architecture: i686 mmx 
    build flavour : debug optim devel 
    vlc aliases : svlc wxvlc 
     
    You can tune the compiler flags in vlc-config. 
    To build vlc and its plugins, type `./compile' or `make'.
     
    步驟五:作一點點修改工作
    由於在編譯完成後vlc.exe會要求libvlc.dll.exe,這顯然是不對的。應該直接去調用libtool.dll,解決方案為:
    修改"/tmp/vlc-0.8.6i"目錄下的libtool文件4760行
     
    prog) 
    case $host in 
    *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; 
    esac
     
    為:
     
    prog) 
    case $host in 
    #*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; //這一行註釋掉
    *cygwin*) output=`$echo $output` ;; 
    esac
     
    步驟六:make
    運行:
    make
    如果是雙核的電腦,可以運行:
    make -j2
    如果的電腦有N多個cpu,則參數可以為-jN,N為cpu個數。這樣能將幾個cpu都利用起來,執行時間會縮短一些。
    make的執行期間可能會出現錯誤,需要修改一些文件,當修改完成後,再執行make,以前make的東西會保留而繼續make剛才出錯的地方。其實這種方式很方便我們以後修改源代碼,重新make的時候它只會編譯修改的地方,很節省時間。
     
    錯誤1:
    In file included from file.c:30: 
    /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/include/sys/stat. 
    h:113: error: parse error before "off_t" 
    /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/include/sys/stat. 
    h:118: error: parse error before '}' token 
    make[4]: *** [libaccess_output_file_plugin_a-file.o] Error 1 
    make[4]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules/access_output' 
    make[3]: *** [all-modules] Error 1 
    make[3]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules/access_output' 
    make[2]: *** [all-recursive] Error 1 
    make[2]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules' 
    make[1]: *** [all-recursive] Error 1 
    make[1]: Leaving directory `/home/wangwei1/vlc-0.8.6i' 
    make: *** [all] Error 2
    解決方案:
    //在"/usr/i686-pc-mingw32/include/sys"目錄下的stat.h的文件開始處添加如下代碼
     
    #ifndef _OFF_T DEFINED 
    typedeflong off_t; 
    #define _OFF_T DEFINED 
    #endif
     
    錯誤2:
    libdtstofloat32_plugin.a(libdtstofloat32_plugin_a-dtstofloat32.o): In function ` 
    Open': 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:219: und 
    efined reference to `_dca_init' 
    libdtstofloat32_plugin.a(libdtstofloat32_plugin_a-dtstofloat32.o): In function ` 
    DoWork': 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:303: und 
    efined reference to `_dca_syncinfo' 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:312: und 
    efined reference to `_dca_frame' 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:331: und 
    efined reference to `_dca_blocks_num' 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:335: und 
    efined reference to `_dca_block' 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:341: und 
    efined reference to `_dca_samples' 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:331: und 
    efined reference to `_dca_blocks_num' 
    libdtstofloat32_plugin.a(libdtstofloat32_plugin_a-dtstofloat32.o): In function ` 
    Destroy': 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:376: und 
    efined reference to `_dca_free' 
    libdtstofloat32_plugin.a(libdtstofloat32_plugin_a-dtstofloat32.o): In function ` 
    CloseFilter': 
    /home/wangwei1/vlc-0.8.6i/modules/audio_filter/converter/dtstofloat32.c:430: und 
    efined reference to `_dca_free' 
    collect2: ld returned 1 exit status 
    make[6]: *** [libdtstofloat32_plugin.dll] Error 1 
    make[6]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules/audio_filter/conve 
    rter' 
    make[5]: *** [all-modules] Error 1 
    make[5]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules/audio_filter/conve 
    rter' 
    make[4]: *** [all-recursive] Error 1 
    make[4]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules/audio_filter' 
    make[3]: *** [all] Error 2 
    make[3]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules/audio_filter' 
    make[2]: *** [all-recursive] Error 1 
    make[2]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules' 
    make[1]: *** [all-recursive] Error 1 
    make[1]: Leaving directory `/home/wangwei1/vlc-0.8.6i' 
    make: *** [all] Error 2
    解決方案:
    修改".../vlc-0.8.6i"目錄下的vlc-config 文件 
     
    dtstofloat32) 
    ldflags="${ldflags} -ldts_pic" 
     
    為: 
     
    dtstofloat32) 
    ldflags="${ldflags} -ldts"
     
    錯誤3:
    /usr/win32/lib/libFLAC.a(bitwriter.o):bitwriter.c:(.text+0x3fb): undefined refer 
    ence to `_ntohl@4' 
    /usr/win32/lib/libFLAC.a(bitwriter.o):bitwriter.c:(.text+0x488): undefined refer 
    ence to `_ntohl@4' 
    /usr/win32/lib/libFLAC.a(bitwriter.o):bitwriter.c:(.text+0x4e5): undefined refer 
    ence to `_ntohl@4' 
    /usr/win32/lib/libFLAC.a(bitwriter.o):bitwriter.c:(.text+0x57f): undefined refer 
    ence to `_ntohl@4' 
    /usr/win32/lib/libFLAC.a(bitwriter.o):bitwriter.c:(.text+0x5d5): undefined refer 
    ence to `_ntohl@4' 
    /usr/win32/lib/libFLAC.a(bitwriter.o):bitwriter.c:(.text+0x66f): more undefined 
    references to `_ntohl@4' follow 
    collect2: ld returned 1 exit status 
    make[4]: *** [libflacdec_plugin.dll] Error 1 
    make[4]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules/codec' 
    make[3]: *** [all-modules] Error 1 
    make[3]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules/codec' 
    make[2]: *** [all-recursive] Error 1 
    make[2]: Leaving directory `/home/wangwei1/vlc-0.8.6i/modules' 
    make[1]: *** [all-recursive] Error 1 
    make[1]: Leaving directory `/home/wangwei1/vlc-0.8.6i' 
    make: *** [all] Error 2
    解決方案:
    修改".../vlc-0.8.6i"目錄下的vlc-config 文件 
     
    flacdec) 
    ldflags="${ldflags} -lFLAC" 
     
    為: 
     
    flacdec) 
    ldflags="${ldflags} -lFLAC -lws2_32"
     
    錯誤4:
    /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/include/wchar.h:4 
    27: error: `off_t' does not name a type 
    make[3]: *** [libaxvlc_a-main.o] Error 1 
    make[3]: Leaving directory `/home/wangwei1/vlc-0.8.6i/activex' 
    make[2]: *** [all] Error 2 
    make[2]: Leaving directory `/home/wangwei1/vlc-0.8.6i/activex' 
    make[1]: *** [all-recursive] Error 1 
    make[1]: Leaving directory `/home/wangwei1/vlc-0.8.6i' 
    make: *** [all] Error 2
    解決方案:
    //在"/usr/i686-pc-mingw32/include/"目錄下的wchar.h的文件開始處添加如下代碼
     
    #ifndef _OFF_T DEFINED 
    typedeflong off_t; 
    #define _OFF_T DEFINED 
    #endif
    一般會遇到這四個錯誤,如果還出現了其他錯誤,肯定是哪一步搞錯了,如果還是有錯誤,RPWT。
     
    步驟七:打包
    執行以下命令就會得到綠色版的vlc:
    make package-win32-base
    在vlc-0.8.6i的目錄下又會出現一個目錄vlc-0.8.6i,裡面就是編譯好的vlc了。
    如果執行:
    make package-win32-zip
    得到的zip文件就是官網上提供的/win32/*.zip文件了。
    如果想得到安裝文件(後面講ActiveX的時候會用到),首先需要下載NSIS 2.41,給個連接:[url]http://prdownloads.sourceforge.net/nsis/nsis-2.41- setup.exe?download[/url]。
    安裝NSIS 2.41,然後在打包好的vlc-0.8.6i下面右鍵vlc.win32.nsi,選擇Compile NSIS .。
    期間會出錯誤,有關Mozilla插件的:
    Error in macro InstallFile . macroline 1 
    Error in . "E:cygwinhomewangwei1vlc-0.8.6i0vlc-0.8.6ivlc.win32.nsi" . line 445 -- aborting creation process
    用文本編譯器打開vlc.win32.nsi,在第445行前加上;(分號)註釋起來。
    ;!insertmacro InstallFile mozilla pvlc.dll
    重新Compile NSIS .。運行成功之後,在編譯好的vlc-0.8.6i同級目錄裡面就會出現vlc-${VERSION}-win32.exe這個文件。這個就是自己編譯的 vlc的安裝文件了。(文件名應該是vlc-0.8.6i-win32.exe,但是可能NSIS的腳本的問題,${VERSION}替換不了,手動改一 下就行了。)
    2009-07-09更新:
    vlc.win32.nsi的第7行加入
    !define VERSION "0.8.6i"
    可以解決${VERSION}的問題。
    至此,vlc-0.8.6i算是編譯完成了。
    2010-04-09更新:
    錯誤修正:
    如果運行vlc出現了「Windows無法訪問指定設備...您可能沒有合適權限訪問」,或者「Permission denied」錯誤,請在打包好的vlc-0.8.6i目錄下執行以下命令。增加兩個文件的運行權限。
     
    chmod755vlc.exevlc.exe.manifest
     
    windows平台下vlc編譯之三:vlc-0.9.4的編譯
    如果你已經成功編譯了vlc-0.8.6i,那麼編譯vlc-0.9.4就跟玩似的。
    在這簡單的介紹下編譯過程。如果有什麼不明白的,先好好看看前兩篇日誌。
     
    1. 解壓源碼及庫文件。
    注意:如果你編譯過vlc-0.8.6i,請先執行以下命令刪除以前的庫文件。
    rm -rf /usr/win32
    還是在Windows下直接用rar解壓源文件吧,用tar xzvf來解壓最後可能會出現exe的執行權限問題。
    源文件:http://download.videolan.org/pub/videolan/vlc/0.9.4/vlc-0.9.4.tar.bz2,解壓到X:/cygwin/home/yourname下。
    第三方庫:contrib-20080811-win32-bin-gcc-4.2.1-sjlj-runtime-3.13-only.tar.bz2,解壓到X:/cygwin/下。
    (
    在我的公共郵箱提供了下載,具體下載方式為: 1). 登錄http://mail.qq.com 2). 用戶名:jeremiah_vlc 3). 密碼:發郵件給我(jeremiah.vlc@gmail.com),我會告知。 4). 在「我的文件夾」的「Jeremiah_VLC相關資源」有所有資料的超大附件連接。
    )
     
    2. 解壓完庫文件做一點點清理工作
    rm -rf /usr/win32/bin/moc  rm -rf /usr/win32/bin/rcc  rm -rf /usr/win32/bin/uic
     
    3. 解壓完源碼做一點點修改工作
    用文本編輯器或vi打開vlc-0.9.4/configure.ac,
    修改  AM_GNU_GETTEXT_VERSION([0.17])  為  AM_GNU_GETTEXT_VERSION([0.15])
    或運行
    sed -i 's/AM_GNU_GETTEXT_VERSION(0.17)/AM_GNU_GETTEXT_VERSION(0.15)/g' configure.ac
     
    4. 執行bootstrap,注意殺毒軟件可能引起會Permission Denied。
    ./bootstrap
     
    5. 顯示Successfully bootstrapped後就可以編輯vlc腳本了。
    這裡有個問題需要詳細的說明一下,vlc官方提供的第三方庫qt4有問題,相關的skins2不好用。如果禁用掉qt4和skins2,最後得到的vlc 沒有界面,可以在命令行下面運行。保存以下腳本為configure-vlc01.sh(見附件)。(如果想解決qt4的問題,得到有界面的vlc,請直 接看8)
    PATH=/usr/win32/bin:$PATH  PKG_CONFIG_LIBDIR=/usr/win32/lib/pkgconfig  CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml"  LDFLAGS=-L/usr/win32/lib  CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin"  ./configure  --host=i686-pc-mingw32  --disable-gtk  --enable-nls --enable-sdl --with-sdl-config-path=/usr/win32/bin  --enable-avcodec --enable-avformat --enable-swscale  --enable-faad --enable-flac --enable-theora  --with-wx-config-path=/usr/win32/bin  --with-freetype-config-path=/usr/win32/bin  --with-fribidi-config-path=/usr/win32/bin  --enable-live555 --with-live555-tree=/usr/win32/live.com
    --disable-qt4 --disable-skins2 --enable-caca --with-caca-config-path=/usr/win32/bin  --with-xml2-config-path=/usr/win32/bin  --with-dvdnav-config-path=/usr/win32/bin  --disable-cddax --disable-vcdx --enable-goom --enable-twolame --enable-dvdread  --enable-debug--enable-dca  --disable-mkv --disable-taglib
    運行以下命令運行腳本:
    dos2unix configure-vlc01.sh  ./configure-vlc01.sh
     
    6. make
    make  [or make -j2]
    Jeremiah在make的時候沒有遇到錯誤,如果你遇到錯誤,請把錯誤直接貼到google上搜索解決方法。
     
    7. 打包,根據自己的需求來吧。
    make package-win32-base
    make package-win32-zip
    關於如何製作vlc的安裝文件,看上一篇日誌吧。(基本上報錯就是一些language的錯誤或者skins、npvlc.dll的錯誤,原則就是哪行出錯了,就用;(分號)把哪行註釋起來。)
     
    8. 解決下qt4的問題。
    先把以下腳本保存為configure-vlc02.vlc(見附件)。
    PATH=/usr/win32/bin:$PATH  PKG_CONFIG_LIBDIR=/usr/win32/lib/pkgconfig  CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml"  LDFLAGS=-L/usr/win32/lib  CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin"  ./configure  --host=i686-pc-mingw32  --disable-gtk  --enable-nls --enable-sdl --with-sdl-config-path=/usr/win32/bin  --enable-avcodec --enable-avformat --enable-swscale  --enable-faad --enable-flac --enable-theora  --with-wx-config-path=/usr/win32/bin  --with-freetype-config-path=/usr/win32/bin  --with-fribidi-config-path=/usr/win32/bin  --enable-live555 --with-live555-tree=/usr/win32/live.com  --enable-caca --with-caca-config-path=/usr/win32/bin  --with-xml2-config-path=/usr/win32/bin  --with-dvdnav-config-path=/usr/win32/bin  --disable-cddax --disable-vcdx --enable-goom  --enable-twolame --enable-dvdread  --enable-debug--enable-dca  --disable-mkv --disable-taglib
    類似於5.執行腳本,可能會出現以下問題:
    /usr/win32/include/qt4/QtCore/qatomic_windows.h:394: error: previous declaration  `long int InterlockedIncrement(long int*)' here  make[6]: *** [libqt4_plugin_la-qt4.lo] Error 1  make[6]: Leaving directory `/cygdrive/c/vlc/modules/gui/qt4'  make[5]: *** [all] Error 2  make[5]: Leaving directory `/cygdrive/c/vlc/modules/gui/qt4'  make[4]: *** [all-recursive] Error 1  make[4]: Leaving directory `/cygdrive/c/vlc/modules/gui'  make[3]: *** [all] Error 2  make[3]: Leaving directory `/cygdrive/c/vlc/modules/gui'  make[2]: *** [all-recursive] Error 1  make[2]: Leaving directory `/cygdrive/c/vlc/modules'  make[1]: *** [all-recursive] Error 1  make[1]: Leaving directory `/cygdrive/c/vlc'  make: *** [all] Error 2
    需要去下載兩個文件:
    1. [url]http://linux.rz.ruhr-uni-bochum.de/download/cygwin/release-2/w32api/w32api-3.11-1.tar.bz2[/url]
    2. [url]http://downloads.videolan.org/pub/videolan/vlc/0.8.5/contrib/qt4-4.4.1-win32-bin.tar.bz2[/url]
    運行解壓命令解壓這兩個包。
    tar xjvf w32api-3.11-1.tar.bz2 -C /
    tar xjvf qt4-4.4.1-win32-bin.tar.bz2
    繼續執行make,報錯如下:
    /usr/lib/gcc/i686-pc-mingw32/3.4.4/../../../../i686-pc-mingw32/bin/ld: cannot fi  nd -lqjpeg  collect2: ld returned 1 exit status  make[6]: *** [libqt4_plugin.la] Error 1  make[6]: Leaving directory `/home/wangwei1/vlc-0.9.4/modules/gui/qt4'  make[5]: *** [all] Error 2  make[5]: Leaving directory `/home/wangwei1/vlc-0.9.4/modules/gui/qt4'  make[4]: *** [all-recursive] Error 1  make[4]: Leaving directory `/home/wangwei1/vlc-0.9.4/modules/gui'  make[3]: *** [all] Error 2  make[3]: Leaving directory `/home/wangwei1/vlc-0.9.4/modules/gui'  make[2]: *** [all-recursive] Error 1  make[2]: Leaving directory `/home/wangwei1/vlc-0.9.4/modules'  make[1]: *** [all-recursive] Error 1  make[1]: Leaving directory `/home/wangwei1/vlc-0.9.4'  make: *** [all] Error 2
    將剛才解壓得到的qt4目錄下面的lib/libqjpeg.a拷貝到/usr/win32/lib中。進入到qt4-4.4.1-win32-bin目錄中執行:
    cp lib/libqjpeg.a /usr/win32/lib
    再進入到vlc-0.9.4中執行make,應該就沒有錯誤了。然後可以按照7.打包了。
    windows平台下vlc編譯之四:精簡vlc
    vlc太大,組件太多,我們根據業務需求,能用的僅僅是幾個組件而已,其他不用的我們就該去掉。這裡Jeremiah根據自己的情況精簡了 vlc,vlc-0.9.4最後得到的安裝文件3518KB,cab文件3520KB;vlc-0.8.6i的安裝文件3087KB,cab文件 3264KB。相對於原來幾十兆來說,小了N多。
     
    1. 業務需求。
    Jeremiah所用的業務需求是:(1)播放本地avi文件。(2)播放ts封裝的rtp流。(3)播放rtsp流。
     
    2. vlc-0.9.4的精簡
    腳本configure-vlc03.sh(見附件)如下:
    PATH=/usr/win32/bin:$PATH  PKG_CONFIG_LIBDIR=/usr/win32/lib/pkgconfig  CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml"  LDFLAGS=-L/usr/win32/lib  CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin"  ./configure --host=i686-pc-mingw32 --disable-gtk  --enable-avcodec  --enable-avformat  --enable-libmpeg2  --enable-live555 --with-live555-tree=/usr/win32/live.com  --disable-nls  --disable-skins2  --disable-qt4  --disable-macosx-defaults  --disable-hal  --disable-dbus  --disable-dbus-control  --disable-telepathy  --disable-mmx  --disable-sse  --disable-altivec  --disable-coverage  --disable-release  --enable-sout  --disable-lua  --disable-httpd  --disable-libproxy  --disable-audioscrobbler  --disable-taglib  --disable-dvdnav  --disable-dshow  --disable-bda  --disable-smb  --disable-dvbpsi  --disable-v4l2  --disable-libcdio  --disable-libcddb  --disable-vcdx  --disable-cdda  --disable-vcd  --disable-dvb  --disable-screen  --disable-ogg  --disable-mkv  --disable-mod  --disable-mpc  --disable-gme  --disable-mad  --disable-id3tag  --disable-swscale  --disable-imgresample  --disable-faad  --disable-real  --disable-realrtsp  --disable-libtar  --disable-a52  --disable-dca  --disable-flac  --disable-vorbis  --disable-tremor  --disable-speex  --disable-tarkin  --disable-theora  --disable-dirac  --disable-schroedinger  --disable-png  --disable-zvbi  --disable-telx  --disable-cmml  --disable-kate  --disable-x11  --disable-xvideo  --disable-glx  --disable-xinerama  --disable-opengl  --disable-sdl  --disable-sdl-image  --disable-freetype  --disable-fribidi  --disable-fontconfig  --disable-libxml2  --disable-pulse  --disable-alsa  --disable-upnp  --disable-ncurses  --disable-visual  --disable-atmo  --disable-bonjour  --disable-libgcrypt  --disable-gnutls  --disable-remoteosd  --enable-shared=yes  --enable-x264  --enable-vlc  --enable-activex
    腳本請參考:
    ./configure -h
    以及:[url]http://www.jbkempf.com/blog/post/2007/12/14/Configure-step-in-VLC-building[/url]
     
    make通過只後,刪除locale文件夾,這個文件夾是用本地語言作界面的。刪除plugins中的200多dll,只保留:
    libaccess_file_plugin.dll  libaout_directx_plugin.dll  libasf_plugin.dll  libaudio_format_plugin.dll  libavcodec_plugin.dll  libavformat_plugin.dll  libavi_plugin.dll  libconverter_fixed_plugin.dll  libconverter_float_plugin.dll
    libhotkeys_plugin.dll liblive555_plugin.dll  libmpeg_audio_plugin.dll  libpacketizer_copy_plugin.dll  libpacketizer_h264_plugin.dll  libpacketizer_vc1_plugin.dll  libplaylist_plugin.dll  librc_plugin.dll  librtp_plugin.dll  libsubtitle_plugin.dll  libtrivial_channel_mixer_plugin.dll  libtrivial_mixer_plugin.dll  libts_plugin.dll  libugly_resampler_plugin.dll  libvout_directx_plugin.dll  libwaveout_plugin.dll
    再用.nsi腳本編譯,修改n個錯誤之後就生成了較小的安裝文件了。
     
    3. 精簡vlc-0.8.6i
    腳本configure-vlc02.sh(見附件)如下:
    PKG_CONFIG_PATH=/usr/win32/lib/pkgconfig  CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml"  LDFLAGS=-L/usr/win32/lib  CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin"  ./configure  --with-freetype-config-path=/usr/win32/bin  --with-fribidi-config-path=/usr/win32/bin  --enable-ffmpeg --with-ffmpeg-mp3lame --with-ffmpeg-faac  --with-ffmpeg-zlib  --enable-live555 --with-live555-tree=/usr/win32/live.com  --disable-nls  --disable-cddax  --disable-vcdx  --disable-skins2  --disable-wxwidgets  --disable-mozilla  --disable-httpd  --disable-dvdnav  --disable-libcdio  --disable-libcddb  --disable-cdda  --disable-sdl  --disable-sdl-image  --disable-vcd  --disable-dvdread  --disable-smb  --disable-cmml  --disable-alsa  --disable-opengl  --disable-png  --disable-screen  --disable-mkv  --disable-mod  --disable-mpc  --disable-libtar  --disable-speex  --disable-visual  --disable-daap  --disable-bonjour  --disable-gnutls  --disable-vorbis  --disable-dts  --disable-real  --disable-xml  --disable-x264  --enable-sout  --enable-activex  --enable-shared-libvlc  --enable-release
    make之後刪除http,locale,skins,osdmenu文件夾,plugins保留:
    libaccess_file_plugin.dll  libaccess_udp_plugin.dll  libaout_directx_plugin.dll  libasf_plugin.dll  libaudio_format_plugin.dll  libavi_plugin.dll  libffmpeg_plugin.dll  libfloat32tos16_plugin.dll  libfloat32_mixer_plugin.dll  libipv4_plugin.dll  libmpeg_audio_plugin.dll  libmpgatofixed32_plugin.dll  librc_plugin.dll  libs16tofixed32_plugin.dll  libs16tofloat32swab_plugin.dll  libs16tofloat32_plugin.dll  libs8tofloat32_plugin.dll  libsubtitle_plugin.dll  libtrivial_channel_mixer_plugin.dll  libtrivial_mixer_plugin.dll  libts_plugin.dll  libu8tofixed32_plugin.dll  libu8tofloat32_plugin.dll  libugly_resampler_plugin.dll  libvobsub_plugin.dll  libvout_directx_plugin.dll  libwaveout_plugin.dll
    使用.nsi腳本來做安裝文件就ok了。
     
    windows平台下vlc編譯之五:vlc-0.9.6的編譯
    前兩天Jeremiah偶爾用最新的Cygwin編譯了下vlc-0.9.6,好像修改一個錯誤就編譯通過了,很簡單,在這大體寫一下。
     
    1. 安裝最新的Cygwin,圖片見附件(pic.rar)。(如何卸載Cygwin或者使用雙Cygwin,請看下一篇日誌:《Cygwin的卸載與新舊雙版本運行》)
    Cygwin下載:[url]http://www.cygwin.com/setup.exe[/url]。選擇通過網絡安裝。
    強烈建議通過Jeremiah提供的本地文件安裝:
    Cygwin-new(20081208)在我的公共郵箱提供了下載,具體下載方式為: 1). 登錄http://mail.qq.com 2). 用戶名:jeremiah_vlc 3). 密碼:發郵件給我(jeremiah.vlc@gmail.com),我會告知。 4). 在「我的文件夾」的「Jeremiah_VLC相關資源」有所有資料的超大附件連接。
     
     
    Archive unzip zip  Devel autoconf automake binutils cvs gcc gcc-core gcc-g++ gcc-mingw gcc-mingw-core gcc-mingw-g++ gdb gettext gettext-devel git libiconv libgcrypt-devel libtool make mingw-runtime nasm patchutils pkg-config subversion  Editor vim  Libs expat libgcrypt Web curl wget
     
    2. 下載源碼和庫:
    源碼:[url]http://download.videolan.org/pub/videolan/vlc/0.9.6/vlc-0.9.6.tar.bz2[/url]
    庫:http://www.namipan.com/downfile/contrib-20081021-win32-bin-gcc-4.2.1- sjlj-runtime-3.13-only.tar.bz2/7691f26e0285d472e5642666e3c6cbf94d2bd21d7032ea01
     
    3. 解壓源文件到e:/cygwin/home/yourname/。解壓庫到e:/cygwin/。
    刪除E:/cygwin/usr/win32/bin/的moc,rcc,uic。
    修改vlc-0.9.6/configure.ac,
    修改  AM_GNU_GETTEXT_VERSION([0.17])  為  AM_GNU_GETTEXT_VERSION([0.15])
    或運行
    sed -i 's/AM_GNU_GETTEXT_VERSION(0.17)/AM_GNU_GETTEXT_VERSION(0.15)/g' configure.ac
     
    4. 保存腳本configure-vlc01.sh(見附件)。
    PATH=/usr/win32/bin:$PATH PKG_CONFIG_LIBDIR=/usr/win32/lib/pkgconfig CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml" LDFLAGS=-L/usr/win32/lib CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin" ./configure --host=i686-pc-mingw32 --enable-nls --enable-sdl --with-sdl-config-path=/usr/win32/bin --enable-avcodec --enable-avformat --enable-swscale --enable-faad --enable-flac --enable-theora --enable-live555 --with-live555-tree=/usr/win32/live.com --enable-caca --with-caca-config-path=/usr/win32/bin --with-xml2-config-path=/usr/win32/bin --with-dvdnav-config-path=/usr/win32/bin --disable-cddax --disable-vcdx --enable-goom --enable-twolame --enable-dvdread --enable-debug --enable-dca --disable-mkv --disable-taglib
     
    5. 運行./bootstrap && dos2unix ./configure-vlc01.sh && ./configure-vlc01.sh && make。
     
    6. 出錯:
    _la-vlm.o input/.libs/libvlccore_la-vlmshell.o misc/.libs/libvlccore_la-revision  .o || /usr/bin/sed -e '/^[BCDGRS][ ]/s/.*[ ]([^ ]*)/1 DATA/;/^.*[ ]__nm__ /s/^.*[ ]__nm__([^ ]*)[ ][^ ]*/1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //' | sort |  uniq > .libs/libvlccore.exp'  make[4]: *** [libvlccore.la] Error 1  make[4]: Leaving directory `/home/wangwei1/vlc-0.9.6/src'  make[3]: *** [all-recursive] Error 1  make[3]: Leaving directory `/home/wangwei1/vlc-0.9.6/src'  make[2]: *** [all] Error 2  make[2]: Leaving directory `/home/wangwei1/vlc-0.9.6/src'  make[1]: *** [all-recursive] Error 1  make[1]: Leaving directory `/home/wangwei1/vlc-0.9.6'  make: *** [all] Error 2
    打開libtool第144行:
    修改  global_symbol_pipe=""  為  global_symbol_pipe="sed -n -e 's/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][]*\(\)\([_A-Za-z][_A-Za-z0-9]*\)$/\1\2\3 \3/p'"
    繼續make && make package-win32-base。 百度空間中的VLC研究:http://hi.baidu.com/liuxu0909/blog/category/Vlc 海狗哥:http://jeremiah.blog.51cto.com/539865/178696 //vlc-1.0.0的編譯 http://jeremiah.blog.51cto.com/539865/339181 //vlc1.1.0編譯  Fedora12 下源碼編譯vlc-1.1.5成功, 附操作說明: http://blog.csdn.net/jianxi258/archive/2010/11/21/6024522.aspx
    V4L2的開發流程
     
     
    一般操作流程(視頻設備):  1.打開設備文件。 int fd=open("/dev/video0",O_RDWR);  2.取得設備的capability,看看設備具有什麼功能,比如是否具有視頻輸入,或者音頻輸入輸出等。 VIDIOC_QUERYCAP,struct v4l2_capability 3.選擇視頻輸入,一個視頻設備可以有多個視頻輸入。VIDIOC_S_INPUT,struct v4l2_input  4.設置視頻的制式和幀格式,制式包括PAL,NTSC,幀的格式個包括寬度和高度等。  VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format  5.向驅動申請幀緩衝,一般不超過5個。struct v4l2_requestbuffers  6.將申請到的幀緩衝映射到用戶空間,這樣就可以直接操作採集到的幀了,而不必去複製。mmap  7.將申請到的幀緩衝全部入隊列,以便存放採集到的數據.VIDIOC_QBUF,struct v4l2_buffer  8.開始視頻的採集。VIDIOC_STREAMON  9.出隊列以取得已採集數據的幀緩衝,取得原始採集數據。VIDIOC_DQBUF  10. 將緩衝重新入隊列尾,這樣可以循環採集。VIDIOC_QBUF  11. 停止視頻的採集。VIDIOC_STREAMOFF  12. 關閉視頻設備。close(fd);  常用的結構體(參見/usr/include/linux/videodev2.h):  struct v4l2_requestbuffers reqbufs;//向驅動申請幀緩衝的請求,裡面包含申請的個數  struct v4l2_capability cap;//這個設備的功能,比如是否是視頻輸入設備  struct v4l2_input input; //視頻輸入  struct v4l2_standard std;//視頻的制式,比如PAL,NTSC  struct v4l2_format fmt;//幀的格式,比如寬度,高度等  struct v4l2_buffer buf;//代表驅動中的一幀  v4l2_std_id stdid;//視頻制式,例如:V4L2_STD_PAL_B  struct v4l2_queryctrl query;//某一類型的控制  struct v4l2_control control;//具體控制的值
     
     
     
     
  • 相关阅读:
    20145335 《信息安全系统设计基础》第十四周学习总结
    20145335 《信息安全系统设计基础》第十三周学习总结
    使用MarkdonPad2学习心得
    《信息安全系统设计基础》实验三实验报告
    很久没发博客了
    20145334《信息安全系统设计基础》课程总结
    20145334 《信息安全系统设计基础》第十四周学习总结
    20145334《信息安全系统设计基础》第十三周学习总结
    信息安全系统设计基础实验五实验报告
    《信息安全系统设计基础》实验一 开发环境的熟悉
  • 原文地址:https://www.cnblogs.com/sunminmin/p/4502605.html
Copyright © 2011-2022 走看看