VLC player

最近接到任务要做关于视频播放,查阅了相关资料,最有名的就是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/




猜你喜欢

转载自blog.csdn.net/sangni007/article/details/19284475