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

news2025/4/19 13:28:18

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

课程传送门:音视频小白系统入门课 音视频基础+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状态的更新都应该在主线程完成。

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

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

相关文章

Linux》》bash 、sh 执行脚本

通常使用shell去运行脚本,两种方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引号不能省略 我们知道 -c 的意思是 command,所以 bash -c 或 sh -c 后面应该跟一个 command。

如何用“AI敏捷教练“破解Scrum项目中的“伪迭代“困局?

一、什么是“伪迭代”? “伪迭代”是指团队表面上采用Scrum框架,但实际运作仍沿用瀑布模式的现象。例如:迭代初期开发人员集中编码、末期测试人员突击测试,导致资源分配不均;需求拆分粗糙,团队无法在固定时…

使用 vxe-table 来格式化任意的金额格式,支持导出与复制单元格格式到 excel

使用 vxe-table 来格式化任意的金额格式,支持导出与复制单元格格式到 excel 查看官网:https://vxetable.cn gitbub:https://github.com/x-extends/vxe-table gitee:https://gitee.com/x-extends/vxe-table 安装 npm install vx…

金币捕鱼类手游《海洋管家》源码结构与系统分层解析

在休闲互动类移动应用开发中,捕鱼类项目因玩法成熟、逻辑清晰而成为不少开发者接触多端架构与模块化管理的重要起点。本文以一款名为《海洋管家》的项目源码为样例,简要解析其整体结构与主要功能模块,供有类似项目需求或系统学习目的的开发者…

Go语言实现OAuth 2.0认证服务器

文章目录 1. 项目概述1.1 OAuth2 流程 2. OAuth 2.0 Storage接口解析2.1 基础方法2.2 客户端管理相关方法2.3 授权码相关方法2.4 访问令牌相关方法2.5 刷新令牌相关方法 2.6 方法调用时序2.7 关键注意点3. MySQL存储实现原理3.1 数据库设计3.2 核心实现 4. OAuth 2.0授权码流程…

【2025年认证杯数学中国数学建模网络挑战赛】C题 数据预处理与问题一二求解

目录 【2025年认证杯数学建模挑战赛】C题数据预处理与问题一求解三、数据预处理及分析3.1 数据可视化3.2 滑动窗口相关系数统计与动态置信区间耦合分析模型3.3 耦合关系分析结果 四、问题一代码数据预处理问题一 【2025年认证杯数学建模挑战赛】C题 数据预处理与问题一求解 三…

2025年最新Web安全(面试题)

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…

开源微调混合推理模型:cogito-v1-preview-qwen-32B

一、模型概述 1.1 模型特点 Cogito v1-preview-qwen-32B 是一款基于指令微调的生成式语言模型(LLM),具有以下特点: 支持直接回答(标准模式)和自我反思后再回答(推理模式)。使用 I…

Golang|Channel 相关用法理解

文章目录 用 channel 作为并发小容器channel 的遍历channel 导致的死锁问题用 channel 传递信号用 channel 并行处理文件用channel 限制接口的并发请求量用 channel 限制协程的总数量 用 channel 作为并发小容器 注意这里的 ok 如果为 false,表示此时不仅channel为空…

C++ - #命名空间 #输入、输出 #缺省参数 #函数重载 #引用 # const 引用 #inline #nullptr

文章目录 前言 一、实现C版本的hello world 二、命名空间 1、namespace 的价值 2、namespace 的定义 (1.域会影响一个编译器编译语法时的查找规则 (2、域会影响生命周期 (3、命名空间域只能定义在全局 (4、编译器会自动合并相同命名空间中的内容 (5、C标准库放在命名…

JSON处理工具/框架的常见类型及详解,以Java语言为例

以下是JSON处理工具/框架的常见类型及详解,以Java语言为例: 一、主流JSON处理工具对比 Jackson(推荐) 特点:高性能、功能丰富,支持注解(如JsonProperty)、树形模型(Json…

中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)

1、概述 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的互联网巨头Yandex为解决其内部数据分析需求而开发,并于2016年开源。专为大规模数据分析,实时数据分析和复杂查询设计,具有高性能、实时数据和可扩展性等…

Java中的经典排序算法:插入排序、希尔排序、选择排序、堆排序与冒泡排序(如果想知道Java中有关插入排序、希尔排序、选择排序、堆排序与冒泡排序的知识点,那么只看这一篇就足够了!)

前言:排序算法是计算机科学中的基础问题之一,它在数据处理、搜索算法以及各种优化问题中占有重要地位,本文将详细介绍几种经典的排序算法:插入排序、选择排序、堆排序和冒泡排序。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解…

K8S+Prometheus+Consul+alertWebhook实现全链路服务自动发现与监控、告警配置实战

系列文章目录 k8s服务注册到consul prometheus监控标签 文章目录 系列文章目录前言一、环境二、Prometheus部署1.下载2.部署3.验证 三、kube-prometheus添加自定义监控项1.准备yaml文件2.创建新的secret并应用到prometheus3.将yaml文件应用到集群4.重启prometheus-k8s pod5.访…

uniapp-商城-25-顶部模块高度计算

计算高度: 使用computed进行顶部模块的计算。 总高度:bartotalHeight log 介绍--收款码这一条目 也就是上一章节的title的高度计算 bodybarheight。 在该组件中: js部分的代码: 包含了导出的名字: shop-head…

非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较

非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较 一、引言二、非关系型数据库(NoSQL)2.1 优势 三、关系型数据库(RDBMS)3.1 优势 四、结论 💖The Begin💖…

蓝桥杯2024国B数星星

小明正在一棵树上数星星,这棵树有 n 个结点 1,2,⋯,n。他定义树上的一个子图 G 是一颗星星,当且仅当 G 同时满足: G 是一棵树。G 中存在某个结点,其度数为 ∣VG​∣−1。其中 ∣VG​∣ 表示这个子图含有的结点数。 两颗星星不相…

中科院1区顶刊Expert Systems with Applications ESO:增强型蛇形算法,性能不错

Snake Optimizer(SO)是一种优化效果良好的新颖算法,但由于自然规律的限制,在探索和开发阶段参数更多是固定值,因此SO算法很快陷入局部优化并慢慢收敛。本文通过引入新颖的基于对立的学习策略和新的动态更新机制&#x…

Flask+Influxdb+grafna构建电脑性能实时监控系统

Influx下载地址,这里下载了以下版本influxdb-1.8.5_windows_amd64.zip 运行前需要先启动Influx数据库: 管理员方式运行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf,以influxdb.conf配置文件启动数…

若伊微服务版本教程(自参)

第一步 若伊官网下载源码 https://ruoyi.vip/ RuoYi-Cloud: 🎉 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统,同时提供了 Vue3 的版本 git clone 到 本地 目录如下: 第二部 参考官网 运行部署说明 环境部署…