源代码来自 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的简单播放器代码阅读相关推荐

  1. ffmpeg——简单播放器代码

    1.媒体文件播放总体过程 媒体文件-->解复用-->解码-->调用播放接口-->播放 2.解复用 2.1 什么是解复用? 解复用:将媒体文件分解为视频流和音频流 avforma ...

  2. VB简单播放器与python文字语音朗读

    1.VB简单播放器代码 之前在某度知道上看到的一个问题 回答了一下.代码如下: 用WindowsMediaPlayer1控件和Drive dir file做了一个简单的播放器.你可以美化界面和优化代码 ...

  3. 基于Ffmpeg解码器的简单播放器(a simple audio player based on Ffmpeg)

    这是一个基于Ffmpeg解码器的简单播放器,怎么在Windows上编译Ffmpeg可以在网上找到很多,开发环境是Windows XP SP3+VS2008,其中DirectSound控制单元来自jdk ...

  4. GSYVideoPlayer(基于ijkplayer)之rtmp协议播放器的简单应用

    基于ijkplayer的GSYVideoPlayer rtmp协议播放器的简单应用 **添加依赖** **Manifest配置** **Layout布局** activity_start.xml ac ...

  5. Linux下基于Libmad库的MP3音乐播放器编写

    linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...

  6. 如何用FFmpeg编写一个简单播放器详细步骤介绍

    如何用FFmpeg编写一个简单播放器详细步骤介绍(转载) FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码.复用和解复用. ...

  7. 基于Android的MediaPlayer的音乐播放器的封装

    基于Android的MediaPlayer的音乐播放器的封装 使用过android原生的mediaplayer来做音频播放的同学们,肯定是经历过一些痛苦的,因为android提供了一个状态机,确实这个 ...

  8. alin的学习之路:嵌入式课程设计总结(基于Linux的Qt版MP3播放器)

    嵌入式课程设计总结(基于Linux的Qt版MP3播放器) 废话不多写直接上图上代码,其中有很多不规范的地方,希望大佬们指正. 1.课设题目 设计一个MP3播放器,要求:使用Linux下的madplay ...

  9. vb毕业设计——基于vb+VB.NET的媒体播放器设计与实现(毕业论文+程序源码)——媒体播放器

    基于vb+VB.NET的媒体播放器设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于vb+VB.NET的媒体播放器设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. 文章目录: 基于 ...

最新文章

  1. 傅盛:AI是企业弯道超车的机会,大家在同一起跑线上
  2. 皮一皮:原来程序员也是要看天赋的...
  3. android jni 返值
  4. LeetCode:位运算实现加法
  5. WordPress 常用数据库SQL查询语句大全
  6. linux无效内存访问,x86_64 Linux 3.0:无效的内存地址
  7. “洞察千里”,华为云HiLens如何让无人车智行天下
  8. 中移动总裁李跃:发展Wifi才是长久之计
  9. JSONP - 从理论到实践
  10. 2021年将最流行的10大JavaScript库
  11. mavonEditor编辑器的使用
  12. 音量控制面板项目说明
  13. 金融工程学(七):互换的运用
  14. Wordpress关闭所有评论
  15. 虚实接口是当前元宇宙发展的重中之重
  16. JAVA系列:SimpleDateFormat解析带T字符的时间格式( yyyy-MM-ddTHH:mm:sssZ )
  17. 2022家电行业舆情监控及应对分析
  18. 自适应设计:创建流畅的YouTube和Vimeo内容
  19. [复试——大地测量学]第一章节——2022/12/30
  20. 九个方面告诉你,一个合格的数据分析师,到底要什么能力?

热门文章

  1. 初次尝试使用IDAPro修改程序控制流程
  2. 3d max 的 Gamma 和 LUT 首选项学习
  3. Win32 GetWindowLong函数实例Demo
  4. 超图桌面版下载、安装、使用入门
  5. Spire.XLS试用手记
  6. SNMP协议介绍和操作截图
  7. 使用命令将单个java文件打包为jar
  8. Excel+DDT数据驱动实例
  9. 东莞新能源——业务流程管理实践
  10. 一个训练集未知的神经网络