千家信息网

Qt USB摄像头解码ffmpeg方法是什么

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要介绍"Qt USB摄像头解码ffmpeg方法是什么",在日常操作中,相信很多人在Qt USB摄像头解码ffmpeg方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
千家信息网最后更新 2025年01月31日Qt USB摄像头解码ffmpeg方法是什么

这篇文章主要介绍"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方案处理流程:

  1. 引入avdevice.h头文件,调用avdevice_register_all();注册本地设备处理。

  2. 调用av_dict_set设置分辨率(video_size)、帧率(framerate)等参数。

  3. 调用av_find_input_format设置输入格式。

  4. 调用avformat_open_input打开文件。

  5. 调用av_find_best_stream找到视频流地址。

  6. 调用avcodec_find_decoder设置视频解码器。

  7. 调用av_read_frame循环解码读取帧数据。

  8. 调用avcodec_send_packet avcodec_receive_frame解码数据。

  9. 处理完以后调用av_frame_free avcodec_close等释放资源。

二、功能特点

  1. 同时支持windows、linux、嵌入式linux上的USB摄像头实时采集。

  2. 支持多路USB摄像头多线程实时采集。

  3. 在嵌入式linux设备上,自动查找USB设备文件并加载。

  4. 可手动设置设备文件名称,手动设置后按照手动设置的设备文件加载。

  5. 在嵌入式linux设备上支持人脸识别接口,实时绘制人脸框。

  6. 具有打开、暂停、继续、关闭、截图等常规功能。

  7. 可设置两路OSD标签,分别设置文本、颜色、字号、位置等。

  8. 可作为视频监控系统使用。

三、效果图

四、核心代码

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方法是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

摄像 摄像头 处理 设备 视频 方法 文件 参数 时间 格式 视频流 学习 支持 实时 嵌入式 手动 摄像机 方式 强制 最大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华为v5服务器挂载本地文件 知网数据库属于固定资产吗 周村染色软件开发报价 数据库构造脚本 双十一淘宝服务器容纳多少人 职业院校网络安全集团 联想服务器风扇转一下停 局域网代理服务器 潍坊联想服务器代理销售电话 数据库中查询先行课 全球互联网医疗科技公司排名 网络安全并购事件 网络安全法不同意见 徐州软件开发公司有多少家 dpf数据库文件 做软件开发的美女多吗 大型服务器散热液 帆软如何打开数据库查询页面 宽带管理服务器怎么办 杨浦区环保网络技术 网络安全有哪些检查 中宏网河南互联网科技集团 邢台专业存储服务器公司 腾讯健康电子卡服务器异常 星际争霸2战役不能保存服务器吗 上海抖音软件开发程序员工资 meta四大中文数据库 武昌首义图书馆嘉鱼数据库 广东数据要素 网络安全 产业 相关大数据系统支持华为服务器
0