千家信息网

Qt ffmpeg录像存储怎么实现

发表于:2025-12-04 作者:千家信息网编辑
千家信息网最后更新 2025年12月04日,这篇文章主要讲解了"Qt ffmpeg录像存储怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Qt ffmpeg录像存储怎么实现"吧!一、前言上
千家信息网最后更新 2025年12月04日Qt ffmpeg录像存储怎么实现

这篇文章主要讲解了"Qt ffmpeg录像存储怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Qt ffmpeg录像存储怎么实现"吧!

一、前言

上一篇文章写道直接将视频流保存裸流到文件,尽管裸流文件有一定的好处,但是 毕竟大部分用户需要的不是裸流而是MP4视频文件,所以需要将视频流保存成MP4文件,毕竟电脑上的播放器包括默认的播放器,可以直接播放MP4文件,而未必能播放裸流文件,裸流文件需要安装K-Lite解码器才行,关于ffmpeg解码保存成MP4文件,有两种处理方式,一种是先保存成裸流,然后开个后台线程,当裸流文件保存完成以后,自动触发H264转MP4的命令执行,也可以很快的完成转换,另外一种方法就是直接解码的时候保存成MP4文件,两种方法都可以,一般建议后者。

保存成MP4文件流程:

  1. 调用avformat_alloc_output_context2开辟一个格式上下文AVFormatContext用来处理视频流输出。

  2. 调用avformat_new_stream开辟一个视频流AVStream用来输出MP4文件。

  3. 重新设置输出视频流的各种参数。

  4. 调用avio_open打开输出文件。

  5. 调用avformat_write_header写入头部标识。

  6. 循环解码后调用av_write_frame写入数据到文件。

  7. 结束后调用av_write_trailer写入结束标识。

  8. 关闭解码输出,关闭文件,释放资源,

二、功能特点

  1. 多线程实时播放视频流+本地视频+USB摄像头等。

  2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。

  3. 多线程显示图像,不卡主界面。

  4. 自动重连网络摄像头。

  5. 可设置边框大小即偏移量和边框颜色。

  6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。

  7. 可设置两种OSD位置和风格。

  8. 可设置是否保存到文件以及文件名。

  9. 可直接拖曳文件到ffmpegwidget控件播放。

  10. 支持h365视频流+rtmp等常见视频流。

  11. 可暂停播放和继续播放。

  12. 支持存储单个视频文件和定时存储视频文件。

  13. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。

  14. 可设置画面拉伸填充或者等比例填充。

  15. 可设置解码是速度优先、质量优先、均衡处理。

  16. 可对视频进行截图(原始图片)和截屏。

  17. 录像文件存储支持裸流和MP4文件。

  18. 支持qsv、dxva2、d3d11va等硬解码。

  19. 支持opengl绘制视频数据,极低CPU占用。

  20. 支持嵌入式linux,交叉编译即可。

三、效果图

四、核心代码

void FFmpegThread::saveVideoMp4(const QString &fileName){    QMutexLocker locker(&mutex);    closeVideo();    if (videoStreamIndex < 0 || !isRtsp) {        return;    }    //转换文件字符串    const char *filename = fileName.toStdString().data();    //开辟一个格式上下文用来处理视频流输出    avformat_alloc_output_context2(&formatOut, NULL, NULL, filename);    //开辟一个视频流用来输出MP4文件    AVStream *streamOut = avformat_new_stream(formatOut, NULL);    AVStream *streamIn = formatCtx->streams[videoStreamIndex];    //重新设置输出视频流的各种参数    AVCodecContext *codec = streamOut->codec;    codec->bit_rate = 400000;    codec->codec_id = streamIn->codec->codec_id;    codec->codec_type = streamIn->codec->codec_type;    codec->time_base.num = streamIn->time_base.num;    codec->time_base.den = streamIn->time_base.den;    codec->width = streamIn->codec->width;    codec->height = streamIn->codec->height;    codec->pix_fmt = streamIn->codec->pix_fmt;    codec->flags = streamIn->codec->flags;    codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;    codec->me_range = streamIn->codec->me_range;    codec->max_qdiff = streamIn->codec->max_qdiff;    codec->qmin = streamIn->codec->qmin;    codec->qmax = streamIn->codec->qmax;    codec->qcompress = streamIn->codec->qcompress;    //打开输出文件并写入头部标识    if (avio_open(&formatOut->pb, filename, AVIO_FLAG_WRITE) >= 0) {        if (avformat_write_header(formatOut, NULL) >= 0) {            initSaveOk = true;        }    }}void FFmpegThread::closeVideo(){    if (!saveFile) {        return;    }    if (saveMp4) {        if (formatOut != NULL) {            //写入结束标识            av_write_trailer(formatOut);            avcodec_close(formatOut->streams[0]->codec);            av_freep(&formatOut->streams[0]->codec);            av_freep(&formatOut->streams[0]);            avio_close(formatOut->pb);            av_free(formatOut);            initSaveOk = false;            formatOut = NULL;        }    } else {        if (fileVideo.isOpen()) {            fileVideo.close();        }        if (fileAudio.isOpen()) {            fileAudio.close();        }    }}//解码后的数据直接写入文件即可av_write_frame(formatOut, videoPacket);

感谢各位的阅读,以上就是"Qt ffmpeg录像存储怎么实现"的内容了,经过本文的学习后,相信大家对Qt ffmpeg录像存储怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

文件 视频 视频流 支持 存储 可设 输出 录像 标识 数据 标签 线程 处理 学习 位置 内容 参数 图片 头部 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全红蓝对抗的价值 修改数据库之前如何备份 软件开发标准化效果分析 软件开发企业产品介绍页面 正宗戴尔服务器诚信企业推荐 网络技术包括哪些 数据库二元关系 数据库的db都是什么 论软件开发成本估算 登录邮箱服务器错误怎么解决 网络安全加密与解密实验 我是网络安全宣传员手抄报带字 2017网络技术卷 数据库检索技术中逻辑与 网络安全加密技术有哪些分类 新乡县游享网络技术 电视机服务器连接失败重启机顶盒 镇江互联网软件开发常见问题 for循环取出数据库数据 江苏领先网络技术有限公司 小程序云数据库mysql 对比 文化部艺术人才数据库真假 c 在窗口之间传递数据库 方正宽带用什么服务器 论文多长时间可以录入网页数据库 梁金数据库二次元市场 从事软件开发方面的人 网络安全命运共同体案例 网络安全小报word 戴尔服务器更新密码
0