VLC 打开网络相机实现人脸识别核心代码

void *lock(void *data, void** p_pixels) {
	VLCVideoCaptureContext *ctx = (VLCVideoCaptureContext*)data;
	ctx->mutex->lock();
	*p_pixels = ctx->pixels;
//	ctx->alreadyRead = false;
	ctx->valid = true;

	return NULL;
}

void unlock(void *data, void *id, void *const *p_pixels) {
	VLCVideoCaptureContext *ctx = (VLCVideoCaptureContext*)data;
	cv::Mat frame = *ctx->image;
	try {
		ctx->addToBuffer(frame);
		ctx->mutex->unlock();
	} catch(VLCFullBufferException& e) {
		ctx->mutex->unlock();
		std::cerr << e.what() << std::endl;
	}
}

void display(void *data, void *id){
	VLCVideoCaptureContext *ctx = (VLCVideoCaptureContext*)data;
}

VLCVideoCapture::VLCVideoCapture(std::string url_, std::string windowName_, std::string four_cc_, unsigned int fps_, cv::Size size_, unsigned int buffer_size) {
	url = url_;
	size = size_;
	windowName = windowName_;
	four_cc = four_cc_;
	fps = fps_;
    millis = 50;
	opened = false;
	if(size.height<=0 && size.width<=0) {
		size = getSize();
	}
	buf_size = buffer_size;
    ctx = new VLCVideoCaptureContext(windowName, size, CV_8UC3, buffer_size);
}

VLCVideoCapture::~VLCVideoCapture() {
	delete ctx;
}

bool VLCVideoCapture::open() {
	if(isOpened())
		return true;
	std::vector<const char*> options;
	options.push_back("-I");
	options.push_back("dummy");
	options.push_back("--ignore-config");
    options.push_back("--network-caching=250");

	std::vector<const char*>::iterator option;
	// Load the VLC engine
	vlcInstance = libvlc_new(int(options.size()), options.data());
	// Create a media item from URL
	media = libvlc_media_new_location (vlcInstance, url.c_str());
	mp = libvlc_media_player_new_from_media (media);

	libvlc_video_set_callbacks(mp, lock, unlock, display, ctx);
    libvlc_video_set_format(mp, four_cc.c_str(), size.width, size.height, size.width * 24 / 8);

	libvlc_media_player_play(mp);

	opened = true;
	return isOpened();
}

void VLCVideoCapture::read(cv::Mat &frame, int frameToSkip) {
	if(!valid) {
		waitForValidBuffer();
	}
	ctx->read(frame, frameToSkip);
}

void VLCVideoCapture::read(cv::Mat &frame) {
//	if(!valid) {
//		waitForValidBuffer();
//	}
	ctx->read(frame);
}

cv::Mat VLCVideoCapture::read() {
	if(!valid) {
		waitForValidBuffer();
	}

	ctx->mutex->lock();
	cv::Mat tframe = *ctx->image;
	cv::Mat frame = tframe.clone();
	if(ctx->alreadyRead) {
		frame.release();
		ctx->mutex->unlock();
		VLCAlreadyReadFrameException e;
		throw e;
	} else {
		ctx->alreadyRead = true;
		ctx->mutex->unlock();
		if (frame.data && frame.rows>0 && frame.cols>0) {
			return frame;
		} else {
			frame.release();
			VLCEmptyBufferException e;
			throw e;
		}
	}

}

void VLCVideoCapture::close() {
	if(!isOpened())
		return;
	opened = false;
    valid = false;
    libvlc_media_player_stop(mp);
    QThread::msleep(50);
    libvlc_media_player_release(mp);
    libvlc_media_release(media);
    libvlc_release(vlcInstance);

}

cv::Size VLCVideoCapture::getSize() {
	libvlc_instance_t *vlcInstanceT;
	libvlc_media_player_t *mpT;
	libvlc_media_t *mediaT;

	std::vector<const char*> options;
	options.push_back("-I");
	options.push_back("dummy");
	options.push_back("--ignore-config");
    options.push_back("--network-caching=250");

	vlcInstanceT = libvlc_new(options.size(), options.data());

	mediaT = libvlc_media_new_location(vlcInstanceT, url.c_str());
	mpT = libvlc_media_player_new_from_media(mediaT);

	libvlc_media_release(mediaT);
	libvlc_video_set_callbacks(mpT, NULL, NULL, NULL, NULL);
	libvlc_video_set_format(mpT, four_cc.c_str(), 100, 100, 100 * 24 / 8); // pitch = width * BitsPerPixel / 8
	//libvlc_video_set_format(mp, "RV32", 100, 100, 100 * 4);
	libvlc_media_player_play(mpT);

    QThread::msleep(500);//wait a while so that something get rendered so that size info is available
	unsigned int width = 0, height = 0;

	for (int i = 0; i < 30 && height == 0; i++) {
        QThread::msleep(50);
		libvlc_video_get_size(mpT, 0, &width, &height);

		if (width != 0 && height != 0)
			break;
	}
	if (width == 0 || height == 0) {
		width = 320;
		height = 180;
	}

	libvlc_media_player_stop(mpT);
	libvlc_release(vlcInstanceT);
	libvlc_media_player_release(mpT);
	return cv::Size(width, height);
}

void VLCVideoCapture::waitForValidBuffer() {
	valid = ctx->valid;
	unsigned int init_millis = 128;
	double base = 1.5;
	unsigned int exp = 0;
	unsigned int total_millis = 0;
	unsigned int max_wait_millis_timeout = 10000;
	while(!valid) {
		if(total_millis>max_wait_millis_timeout) {
			VLCElapsedTimeoutException e;
			throw e;
		}
		exp++;
		valid = ctx->valid;
	}
}










 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lsa_BigDevil

你的行动是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值