日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nim_duilib加libvlc制作简单播放器

發布時間:2024/1/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nim_duilib加libvlc制作简单播放器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前期的貯備知識點

1.nim_duilib中的如何生成一個帶窗口句柄的控件

2.libvlc相關接口的使用,以及播放視頻需要對應的窗口句柄作為播放視頻源的載體

3.libvlc里面對應的一些事件處理

網上有很多關于duilib的例子 但是網易云信這版的就不多,不過幸好這兩個玩意兒 大同小異,有很多可以參考的地方 一個問題一個問題來看

問題1 如何生成一個帶窗口句柄的控件

假設我們設置的這個控件的類為?VlcPlayForm 實現如下

#pragma once#include "Resource.h" #include "stdafx.h"class VlcPlayForm : public ui::Control { public:VlcPlayForm(void) { m_hwnd = NULL; };~VlcPlayForm(void) {};virtual void SetInternVisible(bool bVisible = true){__super::SetInternVisible(bVisible);::ShowWindow(m_hwnd, bVisible);}virtual void SetPos(RECT rc){__super::SetPos(rc);::SetWindowPos(m_hwnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW); //SWP_SHOWWINDOW //SWP_NOZORDER | SWP_NOACTIVATE}BOOL Attach(HWND hWndNew){if (!::IsWindow(hWndNew)){return FALSE;}m_hwnd = hWndNew;return TRUE;}HWND Detach(){HWND hWnd = m_hwnd;m_hwnd = NULL;return hWnd;}HWND Gethwnd() { return m_hwnd; }protected:HWND m_hwnd; };

在nim_duilib中 要使用自定義控件需要重寫一個函數

virtual ui::Control* CreateControl(const std::wstring& pstrClass);

這個函數的實現如下:

ui::Control* BasicForm::CreateControl(const std::wstring& pstrClass) {//自定義一個控件來提供句柄ui::Control* pControl = NULL;if (L"vlcform" == pstrClass){pControl = new VlcPlayForm();HWND hwnd = ::CreateWindow(L"STATIC", L"", WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, GetHWND(), NULL, NULL, NULL); //GetActiveWindow()static_cast<VlcPlayForm*>(pControl)->Attach(hwnd);}return pControl; }

通過這一步 就新建了一個帶句柄的窗口

XML定義如下

<vlcform name="show_video" width="stretch" height="stretch" />

2.介紹下相應的libvlc的接口

libvlc_media_player_stop? ? ? ? ? ? ? ? ????????//停止 釋放資源的時候需要用到此函數

libvlc_media_player_get_length? ? ? ? ? ? ?//獲取文件總的播放時長

libvlc_media_player_get_time? ? ? ? ? ? ? ? //獲取當前播放的時長

libvlc_media_player_get_position? ? ? ? ? //獲取播放的位置

libvlc_media_player_set_position? ? ? ? ? //設置播放的位置

libvlc_media_player_play? ? ? ? ? ? ? ? ? ? ? ?//播放

libvlc_media_player_pause? ? ? ? ? ? ? ? ? ? //暫停

libvlc_media_player_release? ? ? ? ? ? ? ? ?//釋放資源

libvlc_release? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //釋放資源

libvlc_new? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//申請資源

libvlc_media_new_location? ? ? ? ? ? ? ? ? //創建一個指定的媒體資源,例如一個URL

libvlc_media_player_new_from_media? ? ? ? //創建一個媒體播放器對象

libvlc_media_release? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//釋放一個媒體播放器對象

libvlc_media_player_set_hwnd? ? ? ? ? ? ? ? //設置播放的窗口句柄

libvlc_media_player_play? ? ? ? ? ? ? ? ? ? ? ? //設置媒體player

3. libvlc的事件處理

void OnVLC_Event(const libvlc_event_t* event, void* data);libvlc_event_manager_t* vlc_evt_man = libvlc_media_player_event_manager(m_player); libvlc_event_attach(vlc_evt_man, libvlc_MediaPlayerPlaying, OnVLC_Event, this);

通過這種方式可以獲取到libvlc的各種事件信息,常用的有:

? ? libvlc_MediaPlayerPlaying,
? ? libvlc_MediaPlayerPaused,
? ? libvlc_MediaPlayerStopped,

通過這些枚舉的事件定義 可以很好的得到libvlc相關的狀態回調事件 事件定義在 libvlc_events.h文件中;

總結

以上是生活随笔為你收集整理的nim_duilib加libvlc制作简单播放器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。