这篇文章主要介绍“Qt USB摄像头解码ffmpeg方法是什么”,在日常操作中,相信很多人在Qt USB摄像头解码ffmpeg方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Qt USB摄像头解码ffmpeg方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
成都创新互联公司服务项目包括石鼓网站建设、石鼓网站制作、石鼓网页制作以及石鼓网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,石鼓网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到石鼓省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
用ffmpeg来处理USB摄像头,是前段时间研究视频监控ffmpeg内核的时候搞定的,既然ffmpeg这么牛逼的库可以解析各种音视频,我想处理个本地USB摄像头应该也不是什么难事,果真搜索也是一大堆,当然主要也是因为有个项目的应用需要用到ffmpeg来处理本地USB摄像头,需要拿到每张图片做智能分析,用Qt自带的camera类不大好处理,刚好将ffmpeg的处理流程都搞清楚了,索性直接用ffmpeg来直接处理好了,用上这么强大的解码库,理论上支持各种USB摄像头。本地USB摄像机不需要硬解码,视频流编码类型为 AV_CODEC_ID_RAWVIDEO 像素格式为 AV_PIX_FMT_YUYV422 不经过解码操作直接就可显示。
ffmpeg方案处理流程:
引入avdevice.h头文件,调用avdevice_register_all();注册本地设备处理。
调用av_dict_set设置分辨率(video_size)、帧率(framerate)等参数。
调用av_find_input_format设置输入格式。
调用avformat_open_input打开文件。
调用av_find_best_stream找到视频流地址。
调用avcodec_find_decoder设置视频解码器。
调用av_read_frame循环解码读取帧数据。
调用avcodec_send_packet avcodec_receive_frame解码数据。
处理完以后调用av_frame_free avcodec_close等释放资源。
同时支持windows、linux、嵌入式linux上的USB摄像头实时采集。
支持多路USB摄像头多线程实时采集。
在嵌入式linux设备上,自动查找USB设备文件并加载。
可手动设置设备文件名称,手动设置后按照手动设置的设备文件加载。
在嵌入式linux设备上支持人脸识别接口,实时绘制人脸框。
具有打开、暂停、继续、关闭、截图等常规功能。
可设置两路OSD标签,分别设置文本、颜色、字号、位置等。
可作为视频监控系统使用。
void FFmpegThread::initOption() { //在打开码流前指定各种参数比如:探测时间/超时时间/最大延时等 //设置缓存大小,1080p可将值调大 av_dict_set(&options, "buffer_size", "8192000", 0); //以tcp方式打开,如果以udp方式打开将tcp替换为udp av_dict_set(&options, "rtsp_transport", transport.toUtf8().constData(), 0); //设置超时断开连接时间,单位微秒,3000000表示3秒 av_dict_set(&options, "stimeout", "3000000", 0); //设置最大时延,单位微秒,1000000表示1秒 av_dict_set(&options, "max_delay", "1000000", 0); //自动开启线程数 av_dict_set(&options, "threads", "auto", 0); //单独对USB摄像机设置参数 if (isUsbCamera) { //设置输入格式 //av_dict_set(&options, "input_format", "mjpeg", 0); //设置分辨率 QString size = QString("%1x%2").arg(videoWidth).arg(videoHeight); av_dict_set(&options, "video_size", size.toUtf8().constData(), 0); //设置帧率 av_dict_set(&options, "framerate", "25", 0); } //本地USB摄像机不需要硬解码,强制改成回调运行和无硬解码 //视频流编码类型为 AV_CODEC_ID_RAWVIDEO 像素格式为 AV_PIX_FMT_YUYV422 不经过解码操作直接就可显示 if (isUsbCamera) { callback = true; hardware = "none"; } //没有启用opengl则强制改为回调 #ifndef opengl callback = true; #endif //rtmp视频流强制改成存储成h364裸流,目前存储成mp4还有问题 if (url.startsWith("rtmp", Qt::CaseInsensitive)) { saveMp4 = false; } } bool FFmpegThread::initInput() { //实例化格式处理上下文 formatCtx = avformat_alloc_context(); //设置超时回调,有些不存在的地址或者网络不好的情况下要卡很久 formatCtx->interrupt_callback.callback = AVInterruptCallBackFun; formatCtx->interrupt_callback.opaque = this; //必须要有tryOpen标志位来控制超时回调,由他来控制是否继续阻塞等待打开 tryOpen = false; //先判断是否是本地设备(video=设备名字符串),打开的方式不一样 QByteArray urlData = url.toUtf8(); AVInputFormat *ifmt = NULL; if (isUsbCamera) { #if defined(Q_OS_WIN) ifmt = av_find_input_format("dshow"); #elif defined(Q_OS_LINUX) //ifmt = av_find_input_format("v4l2"); ifmt = av_find_input_format("video4linux2"); #elif defined(Q_OS_MAC) ifmt = av_find_input_format("avfoundation"); #endif } int result = avformat_open_input(&formatCtx, urlData.data(), ifmt, &options); tryOpen = true; if (result < 0) { qDebug() << TIMEMS << "open input error" << url; return false; } //释放设置参数 if (options != NULL) { av_dict_free(&options); } //获取流信息 result = avformat_find_stream_info(formatCtx, NULL); if (result < 0) { qDebug() << TIMEMS << "find stream info error"; return false; } return true; }
到此,关于“Qt USB摄像头解码ffmpeg方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!