1. 程式人生 > >最簡單的基於libVLC的例子:最簡單的基於libVLC的視訊播放器(圖形介面版)

最簡單的基於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