基于libvlc和wxWidgets的简单播放器代码阅读
生活随笔
收集整理的這篇文章主要介紹了
基于libvlc和wxWidgets的简单播放器代码阅读
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
源代碼來自 http://git.videolan.org/?p=vlc.git;a=blob_plain;f=doc/libvlc/wx_player.cpp
// g++ wx_player.cpp `wx-config --libs` `wx-config --cxxflags` `pkg-config --cflags gtk+-2.0 libvlc` `pkg-config --libs gtk+-2.0 libvlc` -o wx_player/* License WTFPL http://sam.zoy.org/wtfpl/ */ /* Written by Vincent Schü?ler */#include <wx/wx.h> #include <wx/filename.h> #include <vlc/vlc.h> #include <climits>#ifdef __WXGTK__#include <gdk/gdkx.h>#include <gtk/gtk.h>#include <wx/gtk/win_gtk.h>#define GET_XID(window) GDK_WINDOW_XWINDOW(GTK_PIZZA(window->m_wxwindow)->bin_window) #endif#define myID_PLAYPAUSE wxID_HIGHEST+1 #define myID_STOP wxID_HIGHEST+2 #define myID_TIMELINE wxID_HIGHEST+3 #define myID_VOLUME wxID_HIGHEST+4#define TIMELINE_MAX (INT_MAX-9) #define VOLUME_MAX 100DECLARE_EVENT_TYPE(vlcEVT_END, -1) DECLARE_EVENT_TYPE(vlcEVT_POS, -1) DEFINE_EVENT_TYPE(vlcEVT_END) DEFINE_EVENT_TYPE(vlcEVT_POS)void OnPositionChanged_VLC(const libvlc_event_t *event, void *data); void OnEndReached_VLC(const libvlc_event_t *event, void *data);// 主窗口 class MainWindow : public wxFrame {public:MainWindow(const wxString& title);~MainWindow();private:// 初始化VLCvoid initVLC();void OnOpen(wxCommandEvent& event);void OnPlayPause(wxCommandEvent& event);void OnStop(wxCommandEvent& event);void OnPositionChanged_USR(wxCommandEvent& event);void OnPositionChanged_VLC(wxCommandEvent& event);void OnEndReached_VLC(wxCommandEvent& event);void OnVolumeChanged(wxCommandEvent& event);void OnVolumeClicked(wxMouseEvent& event);void OnTimelineClicked(wxMouseEvent& event);void play();void pause();void stop();void setTimeline(float value);void connectTimeline();wxButton *playpause_button; // 播放暫停按鈕wxButton *stop_button; // 停止按鈕wxSlider *timeline; // 進度控制滑塊wxSlider *volume_slider; // 音量控制滑塊wxWindow *player_widget; // 視頻輸出窗口libvlc_media_player_t *media_player; // vlc媒體播放對象libvlc_instance_t *vlc_inst; // vlc實例libvlc_event_manager_t *vlc_evt_man; // vlc事件管理 };MainWindow *mainWindow;MainWindow::MainWindow(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition) {// setup menubarwxMenuBar *menubar;wxMenu *file;menubar = new wxMenuBar;file = new wxMenu;file->Append(wxID_OPEN, wxT("&Open"));menubar->Append(file, wxT("&File"));SetMenuBar(menubar);Connect(wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainWindow::OnOpen));// setup vboxwxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);this->SetSizer(vbox);//setup player widgetplayer_widget = new wxWindow(this, wxID_ANY);player_widget->SetBackgroundColour(wxColour(wxT("black"))); // 設置播放窗口顏色vbox->Add(player_widget, 1, wxEXPAND | wxALIGN_TOP);//setup timeline slidertimeline = new wxSlider(this, myID_TIMELINE, 0, 0, TIMELINE_MAX);timeline->Enable(false);vbox->Add(timeline, 0, wxEXPAND);connectTimeline();// 設置進度滑塊鼠標事件回調timeline->Connect(myID_TIMELINE, wxEVT_LEFT_UP, wxMouseEventHandler(MainWindow::OnTimelineClicked));//setup control panelwxPanel *controlPanel = new wxPanel(this, wxID_ANY);//setup hboxwxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);controlPanel->SetSizer(hbox);vbox->Add(controlPanel, 0, wxEXPAND);//setup controlsplaypause_button = new wxButton(controlPanel, myID_PLAYPAUSE, wxT("Play"));stop_button = new wxButton(controlPanel, myID_STOP, wxT("Stop"));volume_slider = new wxSlider(controlPanel, myID_VOLUME, VOLUME_MAX, 0, VOLUME_MAX, wxDefaultPosition, wxSize(100, -1));playpause_button->Enable(false);stop_button->Enable(false);hbox->Add(playpause_button);hbox->Add(stop_button);hbox->AddStretchSpacer();hbox->Add(volume_slider);Connect(myID_PLAYPAUSE, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainWindow::OnPlayPause));Connect(myID_STOP, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainWindow::OnStop));Connect(myID_VOLUME, wxEVT_COMMAND_SLIDER_UPDATED, wxCommandEventHandler(MainWindow::OnVolumeChanged));volume_slider->Connect(myID_VOLUME, wxEVT_LEFT_UP, wxMouseEventHandler(MainWindow::OnVolumeClicked));//setup vlc// 創建vlc實例vlc_inst = libvlc_new(0, NULL);// 創建媒體播放對象media_player = libvlc_media_player_new(vlc_inst);// 創建vlc事件管理對象vlc_evt_man = libvlc_media_player_event_manager(media_player);// 設置VLC事件屬性// 媒體播放結束事件libvlc_event_attach(vlc_evt_man, libvlc_MediaPlayerEndReached, ::OnEndReached_VLC, NULL);// 媒體播放進度改變事件libvlc_event_attach(vlc_evt_man, libvlc_MediaPlayerPositionChanged, ::OnPositionChanged_VLC, NULL);// wx的事件處理// 處理vlcEVT_END事件Connect(wxID_ANY, vlcEVT_END, wxCommandEventHandler(MainWindow::OnEndReached_VLC));// 處理vlcEVT_POS事件Connect(wxID_ANY, vlcEVT_POS, wxCommandEventHandler(MainWindow::OnPositionChanged_VLC));Show(true);initVLC(); }MainWindow::~MainWindow() {// 釋放媒體播放對象libvlc_media_player_release(media_player);libvlc_release(vlc_inst); }void MainWindow::initVLC() {#ifdef __WXGTK__// 設置視頻輸出的窗口libvlc_media_player_set_xwindow(media_player, GET_XID(this->player_widget));#else// 這是在windows下的libvlc_media_player_set_hwnd(media_player, this->player_widget->GetHandle());#endif }void MainWindow::OnOpen(wxCommandEvent& event) {wxFileDialog openFileDialog(this, wxT("Choose File"));if (openFileDialog.ShowModal() == wxID_CANCEL) {return;}else {libvlc_media_t *media;wxFileName filename = wxFileName::FileName(openFileDialog.GetPath());filename.MakeRelativeTo();// 使用本地文件創建vlc媒體對象media = libvlc_media_new_path(vlc_inst, filename.GetFullPath().mb_str());// 給媒體播放對象設置一個媒體對象libvlc_media_player_set_media(media_player, media);play(); // 開始播放libvlc_media_release(media);} }void MainWindow::OnPlayPause(wxCommandEvent& event) {// 判斷是不是播放狀態if(libvlc_media_player_is_playing(media_player) == 1) {pause();}else {play();} }void MainWindow::OnStop(wxCommandEvent& event) {stop(); }void MainWindow::OnPositionChanged_USR(wxCommandEvent& event) {// 設置視頻播放進度(播放位置)libvlc_media_player_set_position(media_player, (float) event.GetInt() / (float) TIMELINE_MAX); }void MainWindow::OnPositionChanged_VLC(wxCommandEvent& event) {// 獲取進度(獲取到的是個比值,范圍[0,1])float factor = libvlc_media_player_get_position(media_player);setTimeline(factor); }void MainWindow::OnEndReached_VLC(wxCommandEvent& event) {stop(); }void MainWindow::OnVolumeChanged(wxCommandEvent& event) {// 設置音量libvlc_audio_set_volume(media_player, volume_slider->GetValue()); }void MainWindow::OnVolumeClicked(wxMouseEvent& event) {wxSize size = mainWindow->volume_slider->GetSize();float position = (float) event.GetX() / (float) size.GetWidth();mainWindow->volume_slider->SetValue(position*VOLUME_MAX);libvlc_audio_set_volume(mainWindow->media_player, position*VOLUME_MAX);event.Skip(); }void MainWindow::OnTimelineClicked(wxMouseEvent& event) {wxSize size = mainWindow->timeline->GetSize();float position = (float) event.GetX() / (float) size.GetWidth();libvlc_media_player_set_position(mainWindow->media_player, position);mainWindow->setTimeline(position);event.Skip(); }void MainWindow::play() {// 媒體播放對象播放媒體libvlc_media_player_play(media_player);playpause_button->SetLabel(wxT("Pause"));playpause_button->Enable(true);stop_button->Enable(true);timeline->Enable(true); }void MainWindow::pause() {// 暫停播放libvlc_media_player_pause(media_player);playpause_button->SetLabel(wxT("Play")); }void MainWindow::stop() {pause(); // 暫停// 停止播放libvlc_media_player_stop(media_player);stop_button->Enable(false);setTimeline(0.0);timeline->Enable(false); }void MainWindow::setTimeline(float value) {if(value < 0.0) value = 0.0;if(value > 1.0) value = 1.0;Disconnect(myID_TIMELINE);timeline->SetValue((int) (value * TIMELINE_MAX));connectTimeline(); }void MainWindow::connectTimeline() {Connect(myID_TIMELINE, wxEVT_COMMAND_SLIDER_UPDATED, wxCommandEventHandler(MainWindow::OnPositionChanged_USR)); }class MyApp : public wxApp {public:virtual bool OnInit(); };void OnPositionChanged_VLC(const libvlc_event_t *event, void *data) {// VLC的進度改變事件(這個函數在VLC的事件處理中調用)// 添加一個事件到wxwxCommandEvent evt(vlcEVT_POS, wxID_ANY);mainWindow->GetEventHandler()->AddPendingEvent(evt); }void OnEndReached_VLC(const libvlc_event_t *event, void *data) {// VLC的播放結束事件(這個函數在VLC的事件處理中調用)// 添加一個事件到wxwxCommandEvent evt(vlcEVT_END, wxID_ANY);mainWindow->GetEventHandler()->AddPendingEvent(evt); }bool MyApp::OnInit() {mainWindow = new MainWindow(wxT("wxWidgets libVLC demo"));return true; }IMPLEMENT_APP(MyApp)總結
以上是生活随笔為你收集整理的基于libvlc和wxWidgets的简单播放器代码阅读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在阿里云主机上基于CentOS用vsft
- 下一篇: 《JAVA编程思想》学习笔记——第三章