1.由于现使用的DirctShow技术很难用切问题很多,需要了解FFMPEG技术来控制摄像头,在翻阅了雷神(雷霄骅-搞视频音频的别说你不知道哦,他是一代英才!给FFMPEG技术贡献巨大!)的笔记后汇总了一篇基于雷神原型下的重新启动摄像头显示功能;
2.由于本文章为了方便以后在工作中个人使用,所以很多配置细节没有详细说明,如需下载请联系本人;
3.直接贴源码;
#include "stdafx.h"
#include <stdio.h>
#include "libavutil/pixfmt.h"
//#include "libavdevice/avdevice.h"
#define __STDC_CONSTANT_MACROS
#ifdef _WIN32
//Windows
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavdevice/avdevice.h"
#include "SDL/SDL.h"
};
#else
//Linux...
#ifdef __cplusplus
extern "C"
{
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavdevice/avdevice.h>
#include <SDL/SDL.h>
#ifdef __cplusplus
};
#endif
#endif
//Output YUV420P
#define OUTPUT_YUV420P 0
//'1' Use Dshow
//'0' Use VFW
#define USE_DSHOW 0
//Refresh Event
#define SFM_REFRESH_EVENT (SDL_USEREVENT + 1)
#define SFM_BREAK_EVENT (SDL_USEREVENT + 2)
#define av_frame_alloc avcodec_alloc_frame
int thread_exit=0;
int sfp_refresh_thread(void *opaque)
{
thread_exit=0;
while (!thread_exit) {
SDL_Event event;
event.type = SFM_REFRESH_EVENT;
SDL_PushEvent(&event);
SDL_Delay(40);
}
thread_exit=0;
//Break
SDL_Event event;
event.type = SFM_BREAK_EVENT;
SDL_PushEvent(&event);
return 0;
}
//Show Dshow Device
void show_dshow_device(){
AVFormatContext *pFormatCtx = avformat_alloc