vlc代碼的使用

vlc代碼的使用

1.爲axvlc.dll添加接口;2.使用axvlc.dll控件;3.對vlc代碼的一些修改;4.播放長時間黑屏問題;
TAG: VLC

1.爲axvlc.dll添加接口
1.1 修改cygwin文件的環境配置。在cygwin的etc文件夾下的profile文件中添加如下語句,
export PATH=$PATH:"/cygdrive/c/Program Files/Microsoft Visual Studio/COMMON/MSDev98/Bin":"/cygdrive/c/Program Files/Microsoft Visual Studio/VC98/Bin"
export INCLUDE='C:\Program Files\Microsoft Visual Studio\VC98\Include'
export MIDL="midl"
只是爲了添加midl命令
添加完成後,重新啓動cygwin,運行midl命令,如果出現:
Microsoft (R) MIDL Compiler Version 5.01.0164
Copyright (c) Microsoft Corp 1991-1997. All rights reserved.
midl : command line error MIDL1000 : missing source-file name
則表示修改cygwin成功。
2.2 現在你只要找個paly接口,搜索下看要在那些地方加一般是在axvlc.idl和axvlc_idl.h文件裏面把接口加上就好了.
3.3 加好執行下midl axvlc.idl
2.使用axvlc.dll控件:
2.1首先你得把你編譯出來的控件註冊下,在把其添加到vc工程裏面去,然後就可以通過m_VLCPlayerCtrl.playlistClear();
m_VLCPlayerCtrl.stop();
VARIANT va;
VariantInit(&va);
m_VLCPlayerCtrl.addTarget("G:\\BraveHeart1.avi",va,0x0002+0x0004,-666);
m_VLCPlayerCtrl.play();
來調用他了。
3.我對vlc代碼的一些修改,寫的很雜亂.
3.1.修改vlc背景顏色:在文件module/video_output/Dirextx/events.c中是創建視頻顯示窗體的地方,找到DirectXCreateWindow函數,
在找到wc.hbrBackground = GetStockObject(LTGRAY_BRUSH/*yanjb BLACK_BRUSH*/);
3.2.如何讓父窗體響應右鍵消息:響應不了是因爲在在文件module/video_output/Dirextx/events.c創建的窗體已經捕獲了WM_RBUTTONUP消息,我們要在
在視頻窗體上把該消息在轉發一次,
{
POINT pt;
pt.x = GET_X_LPARAM(msg.lParam);
pt.y = GET_Y_LPARAM(msg.lParam);
ClientToScreen(msg.hwnd, &pt);//把子窗體鼠標座標轉換爲屏幕座標
ScreenToClient(p_event->p_vout->p_sys->hparent, &pt);//在把屏幕座標轉換爲父窗體鼠標座標
PostMessage(p_event->p_vout->p_sys->hparent, WM_RBUTTONUP, msg.wParam, MAKELPARAM(pt.x, pt.y));//給父窗體發送該消息,並附帶鼠標座標值
}
3.3.對於axvlc.dll如何添加一個新窗體,這樣可以實現輪訓效果:
3.3.1主要涉及文件是activex/pulgin.cpp (創建接口類對象和activex窗體),activex/pulgin.h ,activex/vlccontrol.cpp(提供接口類)
,activex/vlccontrol.h
3.3.2 先添加一個新窗體HWND _videownd;和一個新libvlc對象:libvlc_instance_t* _p_libvlc2.
3.3.3 在創建getvlc函數中增加一段:
_p_libvlc2 = libvlc_new(ppsz_argc, ppsz_argv, NULL); 並在最後返回該對象。
3.3.4 在創建窗體時:
_videownd2 = CreateWindow(_p_class->getVideoWndClassName(),
TEXT("VLC Plugin Video Window2"),
WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE,
posRect.left+10,
posRect.top+10,
posRect.right-posRect.left+10,
posRect.bottom-posRect.top+10,
_inplacewnd,
0,
_p_class->getHInstance(),
NULL
);
並添加這段 libvlc_video_set_parent(_p_libvlc2,reinterpret_cast<libvlc_drawable_t>(_videownd2), NULL); 這是一個窗體綁定的函數。
3.3.5 加好了後,還要在刷新事件onPositionChange中加上
SetWindowPos(_videownd2, NULL,
posRect.left,
posRect.top,
posRect.right-posRect.left,
posRect.bottom-posRect.top,
SWP_NOACTIVATE|
SWP_NOCOPYBITS|
SWP_NOZORDER|
SWP_NOOWNERZORDER );
這段是當我們拖動改變窗體大小改變時,該用該函數改變其窗體大小。
3.3.6 要實現輪訓我們還要更改vlccontrol.cpp提供的play()接口,並新增加一個open()接口,兩接口代碼如下:
STDMETHODIMP VLCControl::open(BSTR uri)
{
VARIANT v_name;
VariantInit(&v_name);
addTarget(uri, v_name, VLCPlayListInsert, 1);
//play
int i_vlc;
HRESULT result = _p_instance->getVLCObject(&i_vlc);
if( SUCCEEDED(result) )
{
VLC_Play(i_vlc);
_p_instance->fireOnPlayEvent();
}
if(_p_instance->b_show) //b_show是加了專門用來判斷是否第一次訪問的.
{
_p_instance->b_show = false;
}else
{
ShowWindow(_p_instance->_videownd, _p_instance->b_libvlc ? SW_HIDE :SW_SHOW);
ShowWindow(_p_instance->_videownd2, _p_instance->b_libvlc ?SW_SHOW :SW_HIDE);
}
return NOERROR;
};

STDMETHODIMP VLCControl::play(void)
{
ShowWindow(_p_instance->_videownd, _p_instance->b_libvlc ? SW_SHOW : SW_HIDE);
ShowWindow(_p_instance->_videownd2, _p_instance->b_libvlc ?SW_HIDE : SW_SHOW);
/*
int i_vlc;
HRESULT result = _p_instance->getVLCObject(&i_vlc);
if( SUCCEEDED(result) )
{
VLC_Play(i_vlc);
_p_instance->fireOnPlayEvent();
}
return result;
*/
//yanjb
{
if( _p_instance->b_libvlc)
{
_p_instance->b_libvlc = false;
}else{
_p_instance->b_libvlc = TRUE;
}
}
stop();
playlistClear();
return NOERROR;
};

4.播放長時間黑屏問題:
文件:modules\codec\ffmpeg\Video.c

picture_t *E_(DecodeVideo)( decoder_t *p_dec, block_t **pp_block )
{
p_dec->b_pace_control = VLC_TRUE;//這個是讓超過時間的圖片丟棄,但是這樣以來圖片質量變的很差。

文件:src\video_output\video_output.c
static void RunThread( vout_thread_t *p_vout)

b_drop_late = val.b_bool;
b_drop_late = VLC_FALSE; //強制爲FALSE不執行下面那段

5.幾個重要的命令行參數:
ppsz_argv[ppsz_argc++] = "--rtsp-caching=100"; //rtsp緩衝時間
ppsz_argv[ppsz_argc++] = "--file-caching=100"; //文件流緩衝時間,這些時間不是越大越好,設置越大實時流延遲越高。
ppsz_argv[ppsz_argc++] = "--no-overlay"; //重疊視頻輸出默認關閉,這個一定要否則當窗口無效時,它不會刷新窗口,導致無法顯示視頻.

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