2023年5月9日 星期二

讓 wxMediaCtrl 可播放

在網路上找到的資料或 AI 生成的範例,要真正能夠讓 wxMediaCtrl 動起來的方法都不是很完整,此文沒有高深的技巧,只是在初始建構上做補充。

要讓 wxMediaCtrl 能夠播放有兩點被 AI 忽略,建立時要指定後台播放器;以及要確定 Load 完成,即要捕捉 wxEVT_MEDIA_LOADED 這個事件。

wxMediaCtrl 是 wxWidgets 內建的純功能程式庫,可在背後播放聲音或影片,沒有可視元素的干擾,可以方便設計自己可視架構,例子中有一個註解掉影片載入動作,是用 TestDialog 做布幕,在建構時用 this 指定的,這一個不能指定 NULL,即使只是用來播放音樂。

  1. // 這是一個什麼元件都沒有的 Dialog
  2. TestDialog::TestDialog(wxWindow* parent,wxWindowID id)
  3. {
  4. //(*Initialize(TestDialog)
  5. Create(parent, id, _("wxWidgets app"), wxDefaultPosition,
  6. wxDefaultSize, wxDEFAULT_DIALOG_STYLE, _T("id"));
  7. //*)
  8.  
  9.  
  10. // 創建 wxMediaCtrl 對象
  11. m_mediaCtrl = new wxMediaCtrl(this, wxID_ANY,
  12. wxEmptyString,
  13. wxDefaultPosition,
  14. wxDefaultSize,
  15. 0,
  16. MEDIABACKEND_WMP10);// 在 Windows 要設定這個後台播放器
  17.  
  18. // 捕捉 wxEVT_MEDIA_LOADED 這個事件,以確定 media 資料已完成載入
  19. m_mediaCtrl->Bind(wxEVT_MEDIA_LOADED,&TestDialog::OnMediaLoaded, this);
  20.  
  21. m_mediaCtrl->Load("example.mid");
  22. //m_mediaCtrl->Load("example.mp4"); // 也可播放影片
  23. }
  24.  
  25. void TestDialog::OnMediaLoaded(const wxMediaEvent& event)
  26. {
  27. // 已確定 media 資料已完成載入可以 play 了
  28. m_mediaCtrl->Play();
  29. }
  30.  



沒有留言:

張貼留言