不过日子系列之视频播放器
前言
不过日子了,今天开源一个基于QT和libvlc sdk写的视频播放器,基本上按照VLC给的API功能都能实现,只不过获取总时长和更新当前已播放时间需要换算一下。
一、功能列表
1.支持打开硬盘上的任意视频添加到左侧列表,双击显示的视频名称播放。
2.支持全屏。
3.支持静音、取消静音。
4.支持音量拖大拖小。
5.显示当前播放时间和总时长。
6.支持停止、暂停、播放。
7.支持进度条拖动到指定位置播放。
8.支持最大化,最小化,全屏。
二、效果
三、主要代码
VLC是个挺好用的播放器主要调用如下:
libvlc_instance_t *pInstace = libvlc_new(0, NULL);
if (NULL == pInstace)
{
return;
}
pMedia = libvlc_media_new_path(pInstance, pstPlayUrl);
libvlc_media_player_t *pPlayer = libvlc_media_player_new_from_media(pMedia);
if (NULL == pPlayer)
{
libvlc_media_release(pMedia);
return NULL;
}
libvlc_media_player_stop(pPlayer);
libvlc_media_release(pMedia);
libvlc_media_player_set_hwnd(pPlayer, handle);
int iRet = libvlc_media_player_play(pPlayer);
if (0 != iRet)
{
libvlc_media_player_stop(pPlayer);
libvlc_media_player_release(pPlayer);
return NULL;
}
获取总的时长和更新当前时长需要换算
long long llTotal = pThis->m_oMediaPlayer.SktGetDur(pThis->m_pPlayWindow);
long long durationInSeconds = llTotal / 1000; // 转换为秒数
long long llDuration= durationInSeconds;
pThis->m_lDuration = durationInSeconds;
long long hours = durationInSeconds / 3600; // 小时数
long long minutes = (durationInSeconds % 3600) / 60; // 分钟数
long long seconds = durationInSeconds % 60; // 秒数
char szSktVal[32] = {0};
if ((10 > minutes) && (seconds >= 10))
{
sprintf_s(szSktVal, 32, "0%lld:0%lld:%lld", hours, minutes, seconds);
}else if ((10 > minutes) && (seconds < 10))
{
sprintf_s(szSktVal, 32, "0%lld:0%lld:0%lld", hours, minutes, seconds);
}
else if ((10 <= minutes) && (seconds < 10))
{
sprintf_s(szSktVal, 32, "0%lld:%lld:0%lld", hours, minutes, seconds);
}
else {
sprintf_s(szSktVal, 32, "0%lld:%lld:%lld", hours, minutes, seconds);
}
emit pThis->SktSetSig(SKT_SIG_01, 0, szSktVal);
Sleep(500);
pThis->m_lCurDur = 0;
while (true)
{
long long llCurTime = pThis->m_oMediaPlayer.SktGetCurDur(pThis->m_pPlayWindow);
durationInSeconds = llCurTime / 1000;
hours = durationInSeconds / 3600;
minutes = (durationInSeconds % 3600) / 60;
seconds = durationInSeconds % 60;
memset(szSktVal, 0, 32);
if ((10 > minutes) && (seconds >= 10))
{
sprintf_s(szSktVal, 32, "0%lld:0%lld:%lld", hours, minutes, seconds);
}
else if ((10 > minutes) && (seconds < 10))
{
sprintf_s(szSktVal, 32, "0%lld:0%lld:0%lld", hours, minutes, seconds);
}
else if ((10 <= minutes) && (seconds < 10))
{
sprintf_s(szSktVal, 32, "0%lld:%lld:0%lld", hours, minutes, seconds);
}
else {
sprintf_s(szSktVal, 32, "0%lld:%lld:%lld", hours, minutes, seconds);
}
if (true == pThis->m_bStop)
{
if (0 != pThis->m_lCurDur)
{
long long llVal = pThis->m_lCurDur * pThis->m_lDuration / 100 * 1000;
pThis->m_oMediaPlayer.SktSetCurDur(pThis->m_pPlayWindow, llVal);
pThis->m_lCurDur = 0;
pThis->m_bStop = false;
}
} else {
emit pThis->SktSetSig(SKT_SIG_02, 0, szSktVal);
Sleep(500);
int iSdrVal = (durationInSeconds * 100) / llDuration;
emit pThis->SktSetSig(SKT_SIG_03, iSdrVal, szSktVal);
Sleep(500);
}
int iRet = pThis->m_oMediaPlayer.SktGetPlayState(pThis->m_pPlayWindow);
if ((libvlc_Ended == iRet) || (libvlc_Stopped == iRet))
{
break;
}
//Sleep(1000);
}
总结
下载地址: