FFmpeg音视频采集

文章目录

  • 音视频采集
  • 音频采集
    • 获取设备信息
    • 录制麦克风
    • 录制声卡
  • 视频采集
    • 摄像机画面采集

音视频采集

DirectShow(简称DShow)是一个Windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能,它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。

  • DirectShow大大简化了媒体回放、格式转换和采集工作。但与此同时,也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其他用户的DirectShow组件。
  • DirectShow专为C++而设计。Microsoft不提供用于DirectShow的托管API。
  • DirectShow是基于组件对象模型(COM)的,因此当你编写DirectShow应用程序时,你必须具备COM客户端程序编写的知识。对于大部分的应用程序,你不需要实现自己的COM对象,DirectShow提供了大部分你需要的DirectShow组件,但是假如你需要编写自己的DirectShow组件来进行扩充,那么你必须编写实现COM对象。
  • 使用DirectShow编写的典型应用程序包括:DVD播放器、视频编辑程序、AVI到ASF转换器、MP3播放器和数字视频采集应用。

音频采集

获取设备信息

void Widget::capture()
{avdevice_register_all(); // 注册所有的设备qDebug() << "注册设备完成";AVFormatContext *fmt_ctx = avformat_alloc_context();            // 分配一个格式上下文const AVInputFormat *input_fmt = av_find_input_format("dshow"); // 查找输入格式if (!input_fmt){qDebug() << "找不到输入格式";return;}AVDeviceInfoList *dev_list = nullptr; // 设备信息列表int ret = avdevice_list_input_sources(input_fmt, nullptr, nullptr, &dev_list); // 获取设备信息列表if (ret < 0){qDebug() << "获取设备信息列表失败";return;}for (int i = 0; i < dev_list->nb_devices; i++){qDebug() << "设备名称: " << dev_list->devices[i]->device_name;qDebug() << "设备描述: " << dev_list->devices[i]->device_description;// qDebug() << "设备类型: " << av_get_media_type_string(*(dev_list->devices[i]->media_types));qDebug() << "------------------------";}avdevice_free_list_devices(&dev_list);qDebug() << "设备信息获取完成";
}

录制麦克风

void Widget::recordMicrophone()
{const char *output_file = "../../output/record.pcm"; // 输出文件路径avdevice_register_all();                             // 注册所有的设备AVDeviceInfoList *dev_list = nullptr;                // 设备信息列表const AVInputFormat *input_fmt = av_find_input_format("dshow"); // 查找输入格式if (!input_fmt){qDebug() << "找不到输入格式";return;}int ret = avdevice_list_input_sources(input_fmt, nullptr, nullptr, &dev_list); // 获取设备信息列表if (ret < 0){qDebug() << "获取设备信息列表失败";return;}std::string device_name = "audio=";for (int i = 0; i < dev_list->nb_devices; i++){AVDeviceInfo *dev_info = dev_list->devices[i];if (dev_info){if (*dev_info->media_types == AVMEDIA_TYPE_AUDIO) // 判断设备类型是否为音频{device_name += dev_info->device_name; // 获取设备名称break;}}}avdevice_free_list_devices(&dev_list); // 释放设备信息列表AVFormatContext *fmt_ctx = avformat_alloc_context(); // 分配一个格式上下文ret = avformat_open_input(&fmt_ctx, device_name.c_str(), input_fmt, nullptr); // 打开输入设备if (ret < 0){qDebug() << "打开输入设备失败";return;}av_dump_format(fmt_ctx, 0, device_name.c_str(), 0); // 打印输入设备信息std::ofstream output(output_file, std::ios::binary | std::ofstream::out); // 打开输出文件,以二进制方式写入if (!output.is_open()){qDebug() << "打开输出文件失败";return;}auto currentTime = std::chrono::steady_clock::now(); // 获取当前时间AVPacket packet;                             // 分配一个数据包while (av_read_frame(fmt_ctx, &packet) >= 0) // 读取数据包{output.write((char *)packet.data, packet.size);                                // 写入数据包av_packet_unref(&packet);                                                      // 释放数据包if (std::chrono::steady_clock::now() - currentTime > std::chrono::seconds(10)) // 录音10秒后停止break;}output.close();                 // 关闭输出文件avformat_close_input(&fmt_ctx); // 关闭输入设备avformat_free_context(fmt_ctx); // 释放格式上下文qDebug() << "录音结束";
}

通过ffplay指令播放
在这里插入图片描述

录制声卡

跟麦克风录制一样,略

视频采集

查看支持的设备信息

 ffmpeg -list_devices true -f dshow -i dummy

在这里插入图片描述

ffmpeg -f dshow -list_options true -i video="USB Camera"

在这里插入图片描述

摄像机画面采集

void Widget::recordCamera()
{const char *output_file = "../../output/record.yuv"; // 输出文件名avdevice_register_all();                             // 注册所有设备AVDeviceInfoList *dev_list = nullptr;const AVInputFormat *input_fmt = av_find_input_format("dshow"); // 查找输入格式if (!input_fmt){qDebug() << "找不到输入格式";return;}int ret = avdevice_list_input_sources(input_fmt, nullptr, nullptr, &dev_list); // 获取设备信息列表if (ret < 0){qDebug() << "获取设备信息失败";return;}std::string device_name = "video="; // 设备名称for (int i = 0; i < dev_list->nb_devices; i++){AVDeviceInfo *dev_info = dev_list->devices[i];if (dev_info){if (*dev_info->media_types == AVMEDIA_TYPE_VIDEO) // 判断设备类型是否为视频{device_name += dev_info->device_name;break;}}}avdevice_free_list_devices(&dev_list); // 释放设备信息列表AVDictionary *options = nullptr;av_dict_set(&options, "pixel_format", "yuyv422", 0); // 设置像素格式av_dict_set(&options, "video_size", "1280x720", 0);  // 设置视频大小av_dict_set(&options, "framerate", "10", 0);         // 设置帧率AVFormatContext *fmt_ctx = avformat_alloc_context();                           // 分配一个格式上下文ret = avformat_open_input(&fmt_ctx, device_name.c_str(), input_fmt, &options); // 打开输入设备if (ret < 0){qDebug() << "打开输入设备失败";return;}av_dump_format(fmt_ctx, 0, device_name.c_str(), 0); // 打印输入设备信息std::ofstream output(output_file, std::ios::binary | std::ofstream::out); // 打开输出文件,以二进制方式写入if (!output.is_open()){qDebug() << "打开输出文件失败";return;}auto currentTime = std::chrono::steady_clock::now(); // 获取当前时间AVPacket packet;                                     // 分配一个数据包while (av_read_frame(fmt_ctx, &packet) >= 0)         // 读取数据包{output.write((char *)packet.data, packet.size);                                // 写入数据包av_packet_unref(&packet);                                                      // 释放数据包if (std::chrono::steady_clock::now() - currentTime > std::chrono::seconds(10)) // 录像10秒后停止break;}output.close();                 // 关闭输出文件avformat_close_input(&fmt_ctx); // 关闭输入设备avformat_free_context(fmt_ctx); // 释放格式上下文qDebug() << "录像结束";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漫话机器学习系列】056.F1值(F1 score)

F1值&#xff08;F1 Score&#xff09; 定义 F1值是机器学习中一种用于评估模型性能的指标&#xff0c;特别适合用于 不平衡数据集 的分类任务。它是 精确率&#xff08;Precision&#xff09; 和 召回率&#xff08;Recall&#xff09; 的调和平均值。通过综合考虑精确率和召…

Mac安装Homebrew

目录 安装修改homeBrew源常用命令安装卸载软件升级软件相关清理相关 安装 官网 https://brew.sh/不推荐官网安装方式&#xff08;很慢很慢或者安装失败联网失败&#xff09; 检测是否安装homebrewbrew -v执行安装命令 苹果电脑 常规安装脚本 &#xff08;推荐 完全体 几分钟就…

一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload以及webpackChunkName的使用

文章目录 一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. preload和prefetch的区别2. prefetch的使用3. preload的使用4. webpackChunkName 一文大白话讲清楚webpack基本使用——9——…

【Elasticsearch 】 聚合分析:桶聚合

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

tensorflow源码编译在C++环境使用

https://tensorflow.google.cn/install/source?hlzh-cn查看tensorflow和其他需要下载软件对应的版本&#xff0c;最好一模一样 1、下载TensorFlow源码 https://github.com/tensorflow/tensorflow 2、安装编译protobuf&#xff08;3.9.2&#xff09; protobuf版本要和TensorFlo…

使用 F12 查看 Network 及数据格式

在浏览器中&#xff0c;F12 开发者工具的 “Network” 面板是用于查看网页在加载过程中发起的所有网络请求&#xff0c;包括 API 请求&#xff0c;以及查看这些请求的详细信息和响应数据的。以下以常见的 Chrome 浏览器为例&#xff0c;介绍如何使用 F12 控制台查看 Network 里…

Redis 2.6.12在Win10系统上的安装教程

诸神缄默不语-个人CSDN博文目录 这个版本的安装包是跟同事要的&#xff0c;em&#xff0c;如果真的需要这个版本的话可以跟我要&#xff1a; 解压后双击第一个bat文件&#xff0c;即可挂起Redis服务&#xff1a;

分布式数据库中间件(DDM)的使用场景

华为云分布式数据库中间件&#xff08;DDM&#xff09;是一款专注于解决数据库分布式扩展问题的中间件服务&#xff0c;突破了传统数据库的容量和性能瓶颈&#xff0c;能够实现海量数据的高并发访问。以下是九河云总结的DDM的典型使用场景&#xff1a; 1. 互联网应用 在电商、…

Ubuntu16.04 安装OpenCV4.5.4 避坑

Ubuntu16.04 安装C版OpenCV4.5.4 Ubuntu16.04 VSCode下cmakeclanglldb调试c 文章目录 Ubuntu16.04 安装C版OpenCV4.5.41. 下载Opencv压缩包2. 安装Opencv-4.5.43. 配置OpenCV的编译环境4.测试是否安装成功 1. 下载Opencv压缩包 下载Opencv压缩包&#xff0c;选择source版本。…

RabbitMQ集群安装rabbitmq_delayed_message_exchange

1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章&#xff1a; rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后&#xff0c;start_app 就会报错了 (CaseC…

QT开发:事件循环与处理机制的概念和流程概括性总结

事件循环与处理机制的概念和流程 Qt 事件循环和事件处理机制是 Qt 框架的核心&#xff0c;负责管理和分发各种事件&#xff08;用户交互、定时器事件、网络事件等&#xff09;。以下是详细透彻的概念解释和流程讲解。 1. 事件循环&#xff08;Event Loop&#xff09;的概念 …

博客搭建 — GitHub Pages 部署

关于 GitHub Pages GitHub Pages 是一项静态站点托管服务&#xff0c;它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件&#xff0c;通过构建过程运行文件&#xff0c;然后发布网站。 本文最终效果是搭建出一个域名为 https://<user>.github.io 的网站 创建…

网络通信---MCU移植LWIP

使用的MCU型号为STM32F429IGT6&#xff0c;PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码&#xff1a;lwip源码 -在这里下载 ST官方支持的ETH包&#xff1a;ST-ETH支持包 这里下载 创建工程 …

【MySQL】存储引擎有哪些?区别是什么?

频率难度60%⭐⭐⭐⭐ 这个问题其实难度并不是很大&#xff0c;只是涉及到的相关知识比较繁杂&#xff0c;比如事务、锁机制等等&#xff0c;都和存储引擎有关系。有时还会根据场景选择不同的存储引擎。 下面笔者将会根据几个部分尽可能地讲清楚 MySQL 中的存储引擎&#xff0…

【系统环境丢失恢复】如何恢复和重建 Ubuntu 中的 .bashrc 文件

r如果你遇到这种情况&#xff0c;说明系统环境的.bashrc 文件丢失恢复&#xff1a; 要恢复 ~/.bashrc 文件&#xff0c;可以按照以下几种方式操作&#xff1a; 恢复默认的 ~/.bashrc 文件 如果 ~/.bashrc 文件被删除或修改&#xff0c;你可以恢复到默认的版本。可以参考以下…

Element修改表格结构样式集合(后续实时更新)

场景 修改前端Element组件el-table样式 实现 线表格 <div class"tablepro"><el-table:data"tableData":header-cell-style"{ textAlign:center}"class"tablepro-table"borderstyle"width: 100%;height:100%"&g…

基于Redis实现短信验证码登录

目录 1 基于Session实现短信验证码登录 2 配置登录拦截器 3 配置完拦截器还需将自定义拦截器添加到SpringMVC的拦截器列表中 才能生效 4 Session集群共享问题 5 基于Redis实现短信验证码登录 6 Hash 结构与 String 结构类型的比较 7 Redis替代Session需要考虑的问题 8 …

60,【1】BUUCF web [RCTF2015]EasySQL1

先查看源码 1&#xff0c;changepwd&#xff08;修改密码&#xff09; <?php // 开启会话&#xff0c;以便使用会话变量 session_start();// 设置页面的内容类型为 HTML 并使用 UTF-8 编码 header("Content-Type: text/html; charsetUTF-8");// 引入配置文件&…

高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计

三、CentralCache&#xff08;中心缓存&#xff09;_内存设计 &#xff08;一&#xff09;Span的创建 // 页编号类型&#xff0c;32位下是4byte类型&#xff0c;64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…

2024年终总结-行到水穷处,坐看云起时

依然是——关于我 我&#xff0c;坐标山东青岛&#xff0c;一位无名的Java Coder&#xff0c;你可以叫我Debug.c亦或者种棵代码技术树。在此不过多赘述关于我&#xff0c;更多的关于我请移步我的2023年年终总结。 2023年终总结-轻舟已过万重山 2024年OKR完成情况 2023年年末…