当前位置: 首页 > news >正文

音视频小白系统入门笔记-1

本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅

课程传送门:音视频小白系统入门课 音视频基础+ffmpeg原理

往期课程笔记传送门:音视频小白系统入门笔记-0

课程实践代码仓库:传送门

音频采集

命令行采集

Android端音频采集:AudioRecord(底层)/ MediaRecorder(上层封装成媒体格式)

iOS端音频采集:AudioUnit(底层,复杂)/ AVFoundation /

Windows端音频采集:AudioCore /

ffmpeg对不同操作系统API进行了封装,类似Qt对不同操作系统的GUI进行了封装

ffmpeg -f avfoundation -i :0 out.wav

  • -f表示使用的API,avfoundation是iOS上的API,其他系统需要进行更换
  • -i参数表示输入源,:前表示视频,后面表示音频,不同系统的参数同样有些差异

ffplay out.wav

调用API采集

在Mac App中,坐标(0,0)在左下角,而不是一般GUI系统中的左上角

在Mac App的ViewController中控制组件的显示,类似于Qt的Widget,在viewDidLoad方法中添加组件

Swift的target-action机制类似于Qt的信号与槽的机制

为了在Swift中调用C函数,需要创建桥接头文件,并进行import。

为了在Swift中调用ffmpeg函数,需要引入ffmpeg的库和头文件,具体在XCode中的环境配置参考对应的教程。

ffmpeg中的库大体分为两类,av系列表示Audio-Video,进行核心音视频处理;sw系列表示Software,表示软件(硬件无关)实现的辅助功能,对音视频进行进一步算法处理。

剩下的postproc系列表示视频后处理,现在已经使用较少,因为现代编解码器内置了这块的功能。

采集音频流程:打开输入设备 → 数据包 → 输出文件

打开设备:

  • 注册设备
  • 设置采集方式 avfoundation(Mac) / dshow(Windows) / alsa(Linux)
  • 打开音频设备

注意新版XCode不会自动生成info.plist文件,导致在尝试打开麦克风时直接报错:This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSMicrophoneUsageDescription key with a string value explaining to the user how the app uses this data.

需要手动添加info.plist文件,并添加对应的key:https://coding.imooc.com/learn/questiondetail/NAr196nGpENPLBEz.html

在 FFmpeg 的最新版本(尤其是 4.0+)中,av_init_packet() 和直接操作 AVPacket 结构体的方式已被标记为 废弃(deprecated),原因如下:

1. 内存管理不安全旧版 `AVPacket` 需要手动初始化并管理内(如 `av_init_packet()` + `av_packet_unref()`),容易导致:- 内存泄漏:未正确调用 `av_packet_unref()`。
- 野指针:未初始化字段(如 `data`、`size`)直接使用。
2. 新 API 更安全高效FFmpeg 引入了 `AVPacket` 的引用计数机制,推荐使用以下新函数:- `av_packet_alloc()`:动态分配并初始化 `AVPacket`。
- `av_packet_free()`:自动处理引用计数和内存释放。
- `av_packet_ref()` / `av_packet_unref()`:安全复制或释放数据。

av_read_frame返回-35,Resource temporarily unavailable

我认为Mac的原理应该是要读够一定大小的数据调用`av_read_frame`才会成功,否则就返回EAGAIN让再次尝试

为什么要写入二进制文件而不是普通文件?

使用二进制模式存储文件防止系统对于字节流进行转义。保证字节级精确性,适合任何非纯文本数据或需要跨平台一致性的场景。

Mac默默认采样规格需要通过运行ffmpeg命令测试一下:ffmpeg -f avfoundation -i ":0" out.wav

通过ffplay -ar 48000 -ch_layout mono -f f32le xxx.pcm 播放

在添加通过按钮停止录制的功能时,需要在录制时创建一个单独的线程,并通过全局变量控制录制状态。课堂中老师介绍的实现存在两处竞态条件:

  1. 通过C语言实现的,控制录制状态的变量通过两个线程更改状态,应该使用互斥锁保护,或者设置为原子变量进行同步,避免race condition。
  2. ViewController中子线程试图更新UI组件状态应该通过DispatchQueue.main.async { **self**.btn.title = "停止录制" } 实现,而不是直接在子线程中更改,这种未定义的行为可能导致程序崩溃,所有对UI状态的更新都应该在主线程完成。

相关文章:

音视频小白系统入门笔记-1

本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 课程传送门:音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门:音视频小白系统入门笔记-0 课程实践代码仓库:传送门 音频采集 命令行采集 Android端音频…...

技术速递|使用 BrowserStack App Automate 和 Appium UI 测试 .NET MAUI 应用

作者:Sweeky&Gerald 排版:Alan Wang 本文是 Gerald 的博客《开始使用 Appium 测试 .NET MAUI 应用的 UI 》中创建的 .NET MAUI – 使用 Appium 和 NUnit 进行 UI 测试的续篇。 在本篇博客中,我们将了解如何使用 BrowserStack App Automa…...

在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系

一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下,食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商,业务遍布 160 多个国家,涵盖从配料混合、碳酸化处理到全线自动包装。…...

Nginx+SpringBoot跨域那些事儿(多域名跨域加强版——Nginx配置详解)

嘿,小伙伴们,咱们接着上回书说到,当你的应用需要支持多个域名跨域访问时,Nginx+SpringBoot这对黄金搭档绝对是你的不二之选!今天,咱们就深入聊聊如何在Nginx中配置多个域名跨域,让你的应用更加灵活、强大! 一、跨域问题再科普(多域名跨域场景) 在前后端分离开发中,…...

基于Python的App流量大数据分析与可视化方案

一、引言 App流量数据通常包括用户的访问时间、停留时间、点击行为、页面跳转路径等信息。这些数据分散在不同的服务器日志、数据库或第三方数据平台中,需要通过有效的技术手段进行整合和分析。Python在数据科学领域的广泛应用,得益于其简洁的语法、强大…...

windows下使用nginx + waitress 部署django

架构介绍 linux一般采用nginx uwsgi部署django,在Windows下,可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django,,他们的关系如下 django是WEB应用…...

openssh离线一键升级脚本分享(含安装包)

查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址:http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址:https://www.openssl.org/source/zlib下载地址:http://www.zlib.net/今天演示从7.4升级…...

【专题刷题】双指针(二)

📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;&#xff…...

Ubuntu服务器中了木马且处于局域网内无法直接通过公网正向连接

如果你的Ubuntu服务器中了木马且处于局域网内无法直接通过公网正向连接,可以尝试以下方法进行应急响应和恢复控制: 一、尝试通过局域网内部访问(优先方案) 如果攻击者未完全封锁你的权限,且你有局域网内其他机器的控制权: 通过跳板机连接: 使用同一局域网内的其他机器…...

Day09 【基于LSTM实现文本加标点的任务】

基于LSTM实现文本加标点的任务 目标数据准备参数配置数据处理模型构建定义模型结构前向传播方法优化器选择 主程序测试与评估类初始化模型评估统计记录显示统计结果 测试结果 目标 本文基于给定的词表,将输入的文本基于jieba分词分割为若干个词,然后基于…...

SQL刷题日志(day2)

1、timestampdiff:计算时间间隔 timestampdiff(unit,start_date,end_date) 参数说明: unit:返回的时间单位,如minute,hour等start_date:开始日期end_date:结束日期 2、dense_rank(&#xff…...

仿 ElementUI 搭建自己的 vue 组件库

仿 ElementUI 搭建自己的 vue 组件库 一、创建 my-ui-can 项目1. 新建项目2. 自定义组件3. 创建 MyButton 组件4. 导出组件5. package.json 二、发布到 npm 仓库1. npm 账号注册(忽略)2. 发布 my-ui-can 二、项目引用 my-ui-can 依赖包方式一&#xff1a…...

CentOS 操作系统下搭建 tsung性能测试环境

写在前面 为何这么安装,实际就是这么做的,这是经过好几次实践得出的经验总结。 这为了让大家更清楚的知道怎么安装 tsung性能测试环境,按步照搬的安装即可。 步骤 1、 下载软件安装包 CentOS-6.0-x86_64-bin-DVD1.iso jdk-6u4-linux-x64-rpm.bin erlang: otp_src_1…...

基于YOLOv9的课堂行为检测系统

基于YOLOv9的课堂行为检测系统 项目概述 本项目是一个基于YOLOv9深度学习模型的课堂行为检测系统,旨在通过计算机视觉技术自动识别和监测课堂中学生的各种行为状态,帮助教师更好地了解课堂教学效果。 项目结构 课堂行为检测/ ├── data/ │ ├──…...

Linux常见工具的基本使用,同时介绍了编译过程和动/静态链接的原理

目录 一、工具的本质 二、一些常用的工具 1.yum 2.vim 1)vim的三种基本模式: 2)vim的基本操作 ①命令模式下的基本操作: ②插入模式: ③底行模式: 3)vim的配置:让他变得更好用 3.gcc…...

6.(vue3.x+vite)动态挂载组件并传递参数和方法

1:效果截图 2:父组件代码 <template><div id="cesiumID"></div><div>子组件使用方法传递给父组件的值:{...

大数据人工智能

在大数据人工智能领域&#xff0c;需要具备多种算法和深度学习知识&#xff0c;以下是一些常见的&#xff1a; 机器学习算法 - 线性回归&#xff1a;用于建立输入特征与连续型输出变量之间的线性关系&#xff0c;常用于预测数值型数据。 - 逻辑回归&#xff1a;主要用于二分类…...

Vue3 nextTick

nextTick 是 Vue 中非常重要的一个 API&#xff0c;它允许你在 DOM 更新周期后执行延迟回调。 核心源码位置 Vue3 的 nextTick 实现主要在 packages/runtime-core/src/scheduler.ts 文件中。 基本实现 const resolvedPromise Promise.resolve() as Promise<any> let …...

快速入手-基于python和opencv的人脸检测

1、安装库 pip install opencv-python 如果下载比较卡的话&#xff0c;指向国内下载地址&#xff1a; pip3 install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 2、下载源码 https://opencv.org/ windows11对应的版本下载&#xff1a; https://pan.baidu…...

第七节:React HooksReact 18+新特性-并发模式(Concurrent Mode)解决了什么问题?

• 考点&#xff1a;可中断渲染、优先级调度、startTransition使用场景 • 示例&#xff1a;搜索框输入防抖优化 React Hooks 进阶&#xff1a;自定义 Hook 设计实战指南&#xff08;以 useWindowSize 和 useFetch 为例&#xff09; 一、自定义 Hook 设计规范 在实现 useWind…...

jwt的无感刷新

jwt无感刷新 如果没有引入额外的刷新机制&#xff0c;JWT 过期后后续请求就会因验证失败而拒绝&#xff0c;导致用户需要重新登录&#xff0c;从而被“强制下线”。为实现无感刷新&#xff0c;可以考虑以下几种方案&#xff1a; 引入 Refresh Token 双 token 机制&#xff1a;…...

Linux:安装 CentOS 7(完整教程)

文章目录 一、简介二、安装 CentOS 72.1 虚拟机配置2.2 安装CentOS 7 三、连接远程服务器&#xff08;扩展&#xff09;3.1 获取虚拟机 IP 地址3.2 连接远程服务器 四、结语 一、简介 CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于 Linux 的…...

【YOLOv8改进- Backbone主干】CVPR2025 MambaOut :为图像分类任务设计的轻量级模型,曼巴永存!

YOLOV8目标检测创新改进与实战案例专栏 专栏目录: YOLOV8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例 专栏链接: YOLOV8基础解析+创新改进+实战案例 介绍 摘要 “曼巴(Mamba)是一种具有状态空间模型(SSM)的…...

thanos与VictoriaMetrics对比

Thanos 和 VictoriaMetrics 都是开源的时序数据库&#xff08;TSDB&#xff09;解决方案&#xff0c;通常用于存储、查询和管理大规模的时间序列数据&#xff0c;尤其是监控数据。尽管它们在功能上有一些重叠&#xff0c;但它们各自的设计目标、架构、以及适用场景存在差异。以…...

ubuntu 24.02部署java web服务

ubuntu 24.02 版本推荐使用jdk 21版本部署java web服务&#xff0c;开发后先使用sudo java -jar xxx.jar验证运行结果。 jdk安装&#xff1a;sudo apt install openjdk-21-jdk-headless 编辑服务文本 [Unit] DescriptionWebMgr Java Application Afternetwork.target mysql.…...

时序数据预测:TDengine 与机器学习框架的结合(一)

一、引言 在当今数字化时代&#xff0c;时序数据如潮水般涌来&#xff0c;广泛存在于物联网、工业监控、金融交易、气象监测等众多领域。这些按时间顺序记录的数据蕴含着丰富的信息&#xff0c;对其进行准确预测&#xff0c;能够为企业和组织的决策提供有力支持&#xff0c;带…...

SvelteKit 最新中文文档教程(20)—— 最佳实践之性能

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …...

Spark-SQL核心编程(二)(三)

Spark-SQL核心编程&#xff08;二&#xff09; DSL 语法 DataFrame 提供一个特定领域语言(domain-specific language, DSL)去管理结构化的数据。 可以在 Scala, Java, Python 和 R 中使用 DSL&#xff0c;使用 DSL 语法风格不必去创建临时视图了。 1.创建一个 DataFrame val d…...

Godot学习-创建简单动画

文章目录 1、准备工作Godot资源 2、创建项目3、创建结点4、创建动画1、创建动画2、添加轨道3、创建关键帧3.1 第一个关键帧3.2 第二个关键帧 5、加载后自动播放6、动画循环7、轨道设置1、轨道更新模式2、轨迹插值3、其他属性的关键帧4、编辑关键帧5、使用 RESET 轨道6、洋葱皮 …...

新加坡太白私募:金融创新与稳健发展的典范

在全球金融市场的版图中&#xff0c;新加坡太白私募正以其独特的魅力和卓越的表现&#xff0c;成为众多投资者关注的焦点。作为一家在新加坡注册成立的私募机构&#xff0c;太白私募自诞生以来&#xff0c;便凭借着创新的理念、专业的团队和稳健的运营&#xff0c;在激烈的市场…...

[MySQL] 事务管理(二) 事务的隔离性底层

事务的隔离性底层 1.数据库并发的场景2.读-写2.1MVCC三个变量2.1.1 3个记录隐藏列字段2.1.2 undo日志 模拟MVCCselect 的读取2.1.3 Read View&#xff08;读视图&#xff09; 3.RR与RC的区别 1.数据库并发的场景 读-读&#xff1a;不存在问题&#xff0c;也不需要并发控制读-写…...

【Netty篇】EventLoopGroup 与 EventLoop 详解

目录 开场白&#xff1a;话说 Netty 江湖第一段&#xff1a;EventLoopGroup——“包工头”的角色第二段&#xff1a;EventLoop——“身怀绝技的工人”第三段&#xff1a;EventLoop 如何处理 I/O 事件、普通任务和定时任务第四段&#xff1a;Handler 执行中如何换人&#xff1f;…...

vscode连接windows服务器出现过程试图写入的管道不存在

优云智算平台的windows 1. 确保 Windows 已启用 OpenSSH 服务器 Get-WindowsCapability -Online | Where-Object Name -like OpenSSH.Server* 如果 State 是 NotPresent&#xff0c;说明未安装。 如果 State 是 Installed&#xff0c;说明已安装。 安装 OpenSSH Server&am…...

Windows VsCode Terminal窗口使用Linux命令

背景描述&#xff1a; 平时开发环境以Linux系统为主&#xff0c;有时又需要使用Windows系统下开发环境&#xff0c;为了能像Linux系统那样用Windows VsCode&#xff0c;Terminal命令行是必不可少内容。 注&#xff1a;Windows11 VsCode 1.99.2 下面介绍&#xff0c;如何在V…...

19【干获】如何快速在GIS某个图斑中抠出空洞

应用场景&#xff1a;在图斑中扣取空洞&#xff0c;很多时候是因为CAD数据在转换为GIS文件时&#xff0c;由于CAD作图不规范&#xff0c;例如填充本身不严谨&#xff0c;导致转换后&#xff0c;一个大地块包含的小地块范围不见了&#xff0c;只有大地块&#xff1b;或者会存在两…...

基于YOLO11的跌倒检测报警系统

基于YOLO11的跌倒检测报警系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】完整的视频/摄像头/图片检测与报警功能 【技术栈】 ①&#xff1a;系统环境&#xff1a;Windows/MacOS/Linux通用 ②&#xff1a;开发环境&#xff1a;Py…...

十、自动化函数+实战

Maven环境配置 1.设计测试用例 2.创建空项目 1&#xff09;添加需要的依赖pom.xml <dependencies> <!-- 截图配置--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</…...

面向初学者的JMeter实战手册:从环境搭建到组件解析

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是面向初学者的JMeter实战手册&#xff1a;从环境搭建到组件解析&#xff0c;废话不多说&#xff0c;让我们直接开始~ 目录 1. JMeter简介 2. JMeter安装与配置 2.1. 安装 2.2.…...

【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——PCIE2.0 x1接口测试

1&#xff09;实验平台&#xff1a;正点原子ATK-DLMP257B开发板 2&#xff09;浏览产品&#xff1a;https://www.alientek.com/Product_Details/135.html 3&#xff09;全套实验源码手册视频下载&#xff1a;正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——PCI…...

云函数采集架构:Serverless模式下的动态IP与冷启动优化

在 Serverless 架构中使用云函数进行网页数据采集&#xff0c;不仅能大幅降低运维成本&#xff0c;还能根据任务负载动态扩展。然而&#xff0c;由于云函数的无状态特性及冷启动问题&#xff0c;加上目标网站对采集行为的反制措施&#xff08;如 IP 限制、Cookie 校验等&#x…...

UE5 设置物体的位置

UE的位置设置和untiy不同&#xff0c;UE的对象分为根物体和组件&#xff0c;他们的设置方法不同 对于蓝图根物体 可以直接当作Actor处理,设置它的世界位置 对于蓝图的组件 设置世界位置&#xff1a; 设置相对位置...

【adb】bat批处理+adb 自动亮屏,自动解锁屏幕,启动王者荣耀

准备adb 下载 需要确认是否安装了adb.exe文件,可以在: 任务管理器 -->详细信息–>找一下后台运行的adb 安装过anroid模拟器,也存在adb,例如:雷电安装目录 D:\leidian\LDPlayer9 单独下载adb 官方下载地址:[官方网址] 下载目录文件: 测试adb USB连接手机 首先在设置界…...

【计算机网络】3数据链路层①

这篇笔记专门讲数据链路层的功能。 2.功能 数据链路层的主要任务是让帧在一段链路上或一个网络中传输。 2.1.封装成帧(组帧) 解决的问题:①帧定界②帧同步③透明传输 实现组帧的方法通常有以下种。 2.1.1.字符计数法 原理:在每个帧开头,用一个定长计数字段来记录该…...

OSPF路由协议

OSPF&#xff08;开放式最短路径优先&#xff09; 1、回顾 rip&#xff1a;v1&#xff08;广播发送、路由自动汇总&#xff0c;不支持可变长子网&#xff09;v2&#xff08;组播发送&#xff0c;默认不汇总路由&#xff0c;支持可变长子网&#xff09;封装在UDP的520端口中&a…...

线代第二章矩阵第三、四课:矩阵乘法和方阵的幂

文章目录 矩阵的乘法矩阵的可交换方阵的幂 矩阵的乘法 (1)乘法的前提条件&#xff1a; 第一个矩阵的列数等于第二个矩阵的行数 (2)结果阵的形状: 结果矩阵的行数&#xff1d;第一个矩阵的行数 结果矩阵的列数&#xff1d;第二个矩阵的列数 乘法不满足交换律&#xff1a; &am…...

if constexpr

if constexpr if constexpr 是 C17 引入的一个强大的特性&#xff0c;它允许在编译时根据条件选择性地编译代码块。与普通的 if 语句不同&#xff0c;if constexpr 的条件必须是一个编译时可计算的常量表达式&#xff08;constexpr 表达式&#xff09;。如果条件为 true&#…...

JAVA程序实现mysql读写分离并在kubernetes中演示

1 概述 对数据进行读写分离&#xff0c;可以将读流量从主数据库中剥离出来&#xff0c;进一步降低读操作对写操作的影响。读写分离的实现可以有多种方式&#xff0c;例如通过proxySQL、mycat等中间件来实现&#xff0c;也可以在应用进程内实现。本文介绍JAVA程序通过spring框架…...

HarmontOS-ArkUI V2状态 !!语法糖 双向绑定

什么是双向绑定 双向绑定指的是在组件间数据的双向绑定。当一个值无论是在父组件还是子组件中改动都会在这两层中都更新界面。 回顾过往的“双向绑定”实现方式 靠@Event装饰回调函数 一般是对于@Param修饰的状态变量。当子组件发生某个动作的时候,调用某个父组件传递过来的…...

Linux驱动开发进阶(十)- I2C子系统BSP驱动

文章目录 1、前言2、I2C总线注册3、I2C设备注册4、I2C驱动注册总结 1、前言 学习参考书籍以及本文涉及的示例程序&#xff1a;李山文的《Linux驱动开发进阶》本文属于个人学习后的总结&#xff0c;不太具备教学功能。 2、I2C总线注册 和其它总线驱动一样&#xff0c;I2C驱动…...

Vue 3 路由配置使用与讲解

在现代前端开发中&#xff0c;单页应用&#xff08;SPA&#xff09;已成为主流趋势&#xff0c;Vue.js 作为一款优秀的 JavaScript 框架&#xff0c;在构建 SPA 方面表现出色。Vue Router 作为 Vue.js 官方的路由管理器&#xff0c;与 Vue.js 核心深度集成&#xff0c;极大地简…...