最簡單的基於libVLC的例子:最簡單的基於libVLC的視訊播放器(圖形介面版)
=====================================================
最簡單的基於libVLC的例子文章列表:
=====================================================
本文記錄使用libVLC開發的一個簡單的圖形介面的視訊播放器。由於是示例程式,只包含了最簡單的媒體播放方面的功能。其中有一些功能還不完善,有時間以後再做修改。
最簡單的基於libVLC的視訊播放器(圖形介面版)
這是使用libVLC基於MFC開發的一個示例播放器。實現了一個播放器的基本功能:播放,暫停/繼續,停止,播放時間軸的顯示,以及從任一點開始播放媒體。並且支援將媒體檔案拖拽至播放器進行播放。播放前將媒體檔案的路徑輸入到“URL”欄中,然後單擊“Start”即可開始播放。
播放時候的效果截圖如下所示。
原始碼比較長,不再詳細記錄。簡單記錄一下其中幾個主要功能的實現機制。
視訊的播放/暫停/繼續/停止
播放
視訊“播放”的原始碼如下所示。簡單來說,完成了以下視訊播放的初始化工作:(1)輸入的URL轉換為UTF-8編碼(後文詳細記錄)
(2)將顯示視訊畫面的控制元件的控制代碼提供給libVLC
(3)初始化libVLC並開始播放
(4)開啟定時器,用於更新視訊播放的進度(後文詳細記錄)
void CplayerGUIDlg::OnBnClickedStart() { CStringW cstr_url; #ifdef _UNICODE m_url.GetWindowText(cstr_url); #else USES_CONVERSION; CStringA cstr_urla; m_url.GetWindowText(cstr_urla); cstr_url.Format(L"%s",A2W(cstr_urla)); #endif std::string str_url; UNICODE_to_UTF8(cstr_url, str_url); const char *char_url=str_url.c_str(); if(strcmp(char_url,"")==0){ AfxMessageBox(_T("Input URL is NULL!")); return; } HWND screen_hwnd=NULL; screen_hwnd = this->GetDlgItem(IDC_SCREEN)->m_hWnd; if(playerstate!=STATE_PREPARE){ AfxMessageBox(_T("Media is playing now.")); return; } /* Create a new item */ //m = libvlc_media_new_location (libvlc_inst, "http://mycool.movie.com/test.mov"); libvlc_m = libvlc_media_new_path (libvlc_inst, char_url); /* Create a media player playing environement */ libvlc_mp = libvlc_media_player_new_from_media (libvlc_m); /* No need to keep the media now */ libvlc_media_release (libvlc_m); //on windows libvlc_media_player_set_hwnd (libvlc_mp,screen_hwnd); /* play the media_player */ int x=libvlc_media_player_play (libvlc_mp); //_sleep (30000); /* Let it play a bit */ playerstate=STATE_PLAY; SetBtn(STATE_PLAY); SetTimer(1,1000,NULL); }
暫停/繼續
視訊“暫停/繼續”的原始碼如下所示。其中呼叫了libvlc_media_player_set_pause()設定“暫停”或者是“繼續”。void CplayerGUIDlg::OnBnClickedPause() { if(playerstate==STATE_PLAY){ libvlc_media_player_set_pause(libvlc_mp,1); playerstate=STATE_PAUSE; GetDlgItem(ID_PAUSE)->SetWindowText(_T("Resume")); }else if(playerstate==STATE_PAUSE){ libvlc_media_player_set_pause(libvlc_mp,0); playerstate=STATE_PLAY; GetDlgItem(ID_PAUSE)->SetWindowText(_T("Pause")); } }
停止
視訊“停止”的原始碼如下所示。其中呼叫了libvlc_media_player_stop()停止視訊播放,並且呼叫libvlc_media_player_release()釋放相應的libvlc_media_player_t結構體。void CplayerGUIDlg::OnBnClickedStop()
{
if(libvlc_mp!=NULL){
libvlc_media_player_stop (libvlc_mp);
libvlc_media_player_release (libvlc_mp);
KillTimer(1);
}
SystemClear();
}
視訊播放進度雜時間軸的顯示
隨著視訊的播放,需要在視訊播放進度的時間軸上更新播放進度資訊。在程式中使用了一個定時器完成這個功能。在視訊開始播放的時候,呼叫SetTimer()開啟定時器。時間間隔設定為1000ms。
SetTimer(1,1000,NULL);
在視訊停止播放的時候,呼叫KillTimer()結束定時器。KillTimer(1);
在定時器的訊息響應函式中,呼叫libvlc_media_player_get_time()獲取當前視訊的播放進度,此外呼叫libvlc_media_player_get_length()獲取視訊的總時長。經過計算之後,就可以把計算的結果設定到相應的編輯框(Edit Control)以及滑動控制條(Slider Control)上。
void CplayerGUIDlg::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == 1){
CString curtimestr,durationstr;
int curtime;
int duration;
int tns, thh, tmm, tss;
int progress;
//ms
curtime = libvlc_media_player_get_time(libvlc_mp);
if(curtime!=0){
//change to second
tns = curtime/1000;
thh = tns / 3600;
tmm = (tns % 3600) / 60;
tss = (tns % 60);
curtimestr.Format(_T("%02d:%02d:%02d"),thh,tmm,tss);
m_curtime.SetWindowText(curtimestr);
}
duration = libvlc_media_player_get_length(libvlc_mp);
if(duration!=0){
tns = duration/1000;
thh = tns / 3600;
tmm = (tns % 3600) / 60;
tss = (tns % 60);
durationstr.Format(_T("%02d:%02d:%02d"),thh,tmm,tss);
m_duration.SetWindowText(durationstr);
progress=curtime*100/duration;
m_progress.SetPos(progress);
}
}
//Stop in the end
if(libvlc_media_player_get_state(libvlc_mp)==libvlc_Ended)
OnBnClickedStop();
CDialogEx::OnTimer(nIDEvent);
}
視訊播放點的調整
當滑鼠拖動滑動控制條(Slider Control)控制元件上的滑塊的時候,需要根據拖動的位置設定視訊的播放進度。此時呼叫libvlc_media_player_set_position()設定視訊的播放進度。訊息響應函式中的程式碼如下所示。void CplayerGUIDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if (pScrollBar->GetSafeHwnd() == m_progress.GetSafeHwnd()){
float posf=0.0;
if(nSBCode==SB_THUMBPOSITION){
posf=(float)nPos/100.0;
libvlc_media_player_set_position(libvlc_mp,posf);
}
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
libVLC中輸入中文檔案路徑問題
libVLC使用英文作為輸入路徑的時候是沒有問題的。但是當我們直接傳遞中文路徑的時候,會出現libVLC將中文解析為亂碼從而導致無法播放的問題。這個問題卡了我一陣子時間。造成這一問題的原因在於VLC的輸入檔案路徑是使用UTF-8編碼的。因此我們需要將輸入路徑轉碼為UTF-8編碼。轉碼之後這一問題即得到了解決。
Unicode轉碼為UTF-8的函式程式碼如下所示。void CplayerGUIDlg::UNICODE_to_UTF8(CStringW& unicodeString, std::string& str)
{
int stringLength = ::WideCharToMultiByte(CP_UTF8, NULL, unicodeString, wcslen(unicodeString), NULL, 0, NULL, NULL);
char* buffer = new char[stringLength + 1];
::WideCharToMultiByte(CP_UTF8, NULL, unicodeString, wcslen(unicodeString), buffer, stringLength, NULL, NULL);
buffer[stringLength] = '\0';
str = buffer;
delete[] buffer;
}
下載
Simplest libVLC Example
專案主頁
本工程是包含了一些基於libVLC的示例程式。一共包含了如下幾個子程式。
playerGUI: 最簡單的基於libVLC的播放器-圖形介面版。
simplest_libvlc_example: 最簡單的基於libVLC的播放器。
simplest_libvlc_streamer: 最簡單的基於libVLC的推流器。
相關推薦
最簡單的基於libVLC的例子:最簡單的基於libVLC的視訊播放器(圖形介面版)
=====================================================最簡單的基於libVLC的例子文章列表:=====================================================本文記錄使用libVLC
100行程式碼實現最簡單的基於FFMPEG+SDL的視訊播放器(SDL1.x)
=====================================================最簡單的基於FFmpeg的視訊播放器系列文章列表:=====================================================簡介FFMPEG
Objective-C簡單的音樂播放器(邊下邊播)
Objective-C中的音樂播放大多用AVAudioPlayer,它有很多優點: (1)可以播放任意長度音樂; (2)可以迴圈播放; (3)可以控制播放的時間; (4)可以控制聲道的音量實現立體聲效果; (5)可以調整音量。 但是AVAudioPl
android 音樂視訊播放器(github上十二款最著名的Android播放器開源專案)
1.ijkplayer 專案地址: https://github.com/Bilibili/ijkplayer 介紹:Ijkplayer 是Bilibili釋出的基於 FFplay 的輕量級 Android/iOS 視訊播放器。實現了跨平臺功能,API 易於整合;編譯配置
以前寫的兩本書《安全之路:Web滲透技術及實戰案例解析(第2版)》和《黑客攻防實戰加密與解密》
Web滲透技術及實戰案例解析 黑客攻防實戰加密與解密 應一些朋友的要求,我重新將書封面和購買地址發一下說明一下:www.antian365.com原來域名轉移到國外去了。現在國家對境外域名在國內訪問必須實名制,進行備份啥的,情況你懂的。最近正在制作《黑客攻防實戰加密與解密》的視頻課程,對黑客攻防過程遇
用Vue來實現音樂播放器(三十八):歌詞滾動列表的問題
vue 三十八 pla -s toggle 情況 TP 解決辦法 暫停 1、頻繁切換歌曲時,歌詞會跳來跳去 原因: // 歌詞跳躍是因為內部有一個currentLyric對像內部有一些功能來完成歌詞的跳躍 //每個currentLyric能實現歌曲的播放跳到相應的位置 是
基於NDK、C++、FFmpeg的android視訊播放器開發實戰-夏曹俊-專題視訊課程
基於NDK、C++、FFmpeg的android視訊播放器開發實戰—1796人已學習 課程介紹 課程包含了對流媒體(拉流)的播放,演示了播放rtmp的香港衛視,支援rtsp攝像頭和h
編寫高質量程式碼:改善Python程式的91個建議(高清版)PDF
編寫高質量程式碼:改善Python程式的91個建議(高清版)PDF百度網盤連結:https://pan.baidu.com/s/1rPdBouMjuAhOm1HZtRLrVQ 提取碼:smh0 複製這段內容後開啟百度網盤手機App,操作更方便哦內容簡介 · · · · · · 在通往“Python技術殿堂”的
編寫高質量代碼:改善Python程序的91個建議(高清版)PDF
設計 pdf -o 內容 編寫 shadow 圖片 優化 工作 編寫高質量代碼:改善Python程序的91個建議(高清版)PDF百度網盤鏈接:https://pan.baidu.com/s/1rPdBouMjuAhOm1HZtRLrVQ 提取碼:smh0 復制這段內容後打開
你大概走了假敏捷:認真說說敏捷的實現和問題(手繪版)
作者:薄玉桴,騰訊產品經理,關注專案管理。靈魂畫手。 今天你敏捷了沒有?“敏捷”在網際網路和軟體開發領域從涓涓細流逐漸演變為行業潮流,往小了說是改進了開發方法,往大了說是革了瀑布流式的命——把產品開發引向了快速迭代、小步快跑的路線上。 我們使用tapd寫 featu
MFC 基於VLC的視訊播放器(三)---介面設計以及對話方塊接受檔案的拖拽
北京時間23點11分 2018年12月20日 前面已經完成了vlc的環境的搭建,下面便開始真正的程式設計。 前面的介面是這樣的: 理想的介面應該是這樣的: 所以新增按鈕、進度條和播放列表控制元件,並且修改好ID。 介面設計完成,執行,還是隻是一個空殼,因為沒加任
MFC 基於VLC的視訊播放器(二)---配置VLC庫
北京時間 23點18分 2018年12月19日 因為我之前是完成了一次,現在重新來寫一遍,所以更新會比較慢。 整理好步驟如下: 1、新建一個MFC專案,基於對話方塊 基於對話方塊,下一步,下一步,完成。 建立完成。 2、先初步修改介面。
MFC 基於VLC的視訊播放器(一)---簡介
大家好,我是一名大四學生,今年的科研訓練題目是做一個播放器,從以前就很想試著做一下,大概花了四五天寫完程式碼,這幾天來寫總結。 先看一下執行的效果: 主介面: 執行介面: 涉及到的知識:1、MFC上播放gif動畫 2、MFC的
基於jQuery的自定義Video視訊播放元件(相容IE6~8)
之前用過video.js外掛寫過視訊元件,但是自己一般僅僅是播放個視訊,裡面有好多功能用不到,改著不太方便,於是就自己用jQuery封裝了一個外掛,控制器之類的樣式是可以自定義的,支援中英文切換,廢話不多說,下面上圖。 高版本瀏覽器video樣式 注:如果遇到進度
擴充套件:SpringBoot+MyBatis框架+mysql資料庫的整合(配置檔案版)
開發環境:開發工具:Intellij IDEA 2017.2.3JDK : 1.8.0_144spring boot 版本 : 1.5.10.RELEASEmaven : 3.2.3SpringBoot整合MyBatis加入基礎依賴:mybatis:<dependenc
XBMC原始碼分析 4:視訊播放器(dvdplayer)-解碼器(以ffmpeg為例)
XBMC分析系列文章: 本文我們分析XBMC中視訊播放器(dvdplayer)中的解碼器部分。由於解碼器種類很多,不可能一一分析,因此以ffmpeg解碼器為例進行分析。 XBMC解碼器部分檔案目錄如下圖所示: 解碼器分為音訊解碼器和視訊解碼器。在這裡我們看一下視訊
XBMC原始碼分析 6:視訊播放器(dvdplayer)-檔案頭(以ffmpeg為例)
XBMC分析系列文章: XBMC原始碼簡析 5:視訊播放器(dvdplayer)-解複用器(以ffmpeg為例)本文我們分析XBMC中視訊播放器(dvdplayer)中的檔案頭部分。檔案頭部分裡包含的是封裝Dll用到的標頭檔案。由於檔案頭種類很多,不可能一一分析,
最簡單的基於libVLC的例子:最簡單的基於libVLC的推流器
=====================================================最簡單的基於libVLC的例子文章列表:=====================================================本文記錄基於libVLC
最簡單的基於libVLC的例子:最簡單的基於libVLC的視訊播放器
=====================================================最簡單的基於libVLC的例子文章列表:=====================================================本文記錄使用libVLC
最簡單的基於Flash的流媒體示例:網頁播放器(HTTP,RTMP,HLS)
=====================================================Flash流媒體文章列表:=====================================================本文繼續上一篇文章,記錄一些基於Flas