最近接到任务要做关于视频播放,查阅了相关资料,最有名的就是ffmpeg了,使用ffmpeg可以做各种格式的编解码器,而且可以播放高达6K的视频,可见其功能之强悍,奈何ffmpeg的代码量有些大,小熊略感吃不消,终于在老大的英明领导之下,接触到了VLC。VLC 是一款免费、自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,DVD、音频 CD、VCD 以及各类流媒体协议。关键是他有开放的SDK,连源码也是开放的(VLC太讲究了!有木有!)
1.下载VLC
下载地址:http://www.videolan.org/,注意分32bit和64bit两种,在编程时请选择适当的版本。
2.安装VLC
没啥说的,全部安装就是了。
3.VS+VLC配置
寻找dll和lib文件,如果默认安装路径,在C:\Program Files\VideoLAN\VLC\sdk中
注意dll包括plugin文件夹
4. 代码
#pragma once
#include <windows.h>
#include <vector>
#include "vlc/vlc.h"
#pragma comment(lib, "libvlc.lib")
#pragma comment(lib, "libvlccore.lib")
using namespace std;
class Player
{
public:
void intialPlayer();
int loadMedia(char* filename);
int playVideo(int mediaID);
void playStop();
private:
libvlc_instance_t * inst;
libvlc_media_player_t *mp;
libvlc_state_t player_state;
vector<libvlc_media_t*> medias;
vector<libvlc_time_t>duration_time;
bool isFirstPlaying;
int currrntID;
};
void Player::intialPlayer()
{
inst = libvlc_new (0, NULL);
isFirstPlaying = true;
}
int Player::loadMedia(char* filename)
{
medias.push_back(libvlc_media_new_path (inst, filename)) ;
libvlc_media_parse(medias.back());
if (libvlc_media_is_parsed(medias.back()))
{
duration_time.push_back( libvlc_media_get_duration(medias.back()));
printf("duration0 time %llu\n", duration_time.back());
return 1;
}
else
{
printf("can not read media information\n");
return -1;
}
}
int Player::playVideo(int mediaID)
{
//if(player_state == libvlc_NothingSpecial)
int v;
if(isFirstPlaying==true)
{
currrntID = mediaID;
mp = libvlc_media_player_new_from_media (medias[mediaID]);
v = libvlc_media_player_play (mp);
isFirstPlaying = false;
return v;
}
else if(isFirstPlaying==false)
{
player_state = libvlc_media_player_get_state(mp);
if (currrntID!=mediaID || player_state==libvlc_Ended)
{
libvlc_media_player_set_media (mp,medias[mediaID]);
v = libvlc_media_player_play (mp);
currrntID = mediaID; //改变当前播放视频的ID
return v;
}
}
return 1;
}
void Player::playStop()
{
libvlc_media_player_stop (mp);
for(int i=0;i<medias.size();i++)
libvlc_media_release (medias[i]);
libvlc_media_player_release (mp);
libvlc_release (inst);
}
int main()
{
Player mPlayerInstance;
mPlayerInstance.intialPlayer();
mPlayerInstance.loadMedia("Contours.avi");
mPlayerInstance.loadMedia("SmartGlass.mp4");
while(1)
{
mPlayerInstance.playVideo(0);
//...
}
mPlayerInstance.playStop();
}
5.效果
6.Reference
VLC开发API:http://blog.csdn.net/lxp116/article/details/8257056
海狗哥的流媒体空间:http://jeremiah.blog.51cto.com/