音视频面试题集锦

下面是音视频开发面试题精选:

  • 1、谈谈 iOS 音视频采集相关接口和数据结构的设计?
  • 2、如何降低处理音视频链路中的内存峰值?
  • 3、OpenGL 如何实现二分屏效果?
  • 4、使用 OpenGL 绘制时对于二维坐标需要注意什么?

1、谈谈 iOS 音视频采集相关接口和数据结构的设计?

1)整体框架

通常我们通过 AVCaptureSession 相关的 API 来进行音视频的采集,其中主要组件分为 Input、Output、Session 几个部分:

  • Input:AVCaptureDeviceInput,以 Device 作为输入,分为:视频采集设备、音频采集设备,可以同时添加多个 Input。
  • Output:可以指定图片、视频文件、音视频裸帧数据等作为输出,可以同时添加多个 Output。
    • kCVPixelFormatType_32BGRA
    • kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange(nv12 420v)
    • kCVPixelFormatType_420YpCbCr8BiPlanarFullRange(nv12 420f)
    • AVCaptureStillImageOutput 图片
    • AVCaptureMovieFileOutput 视频文件
    • AVCaptureAudioDataOutput 音频裸帧
    • AVCaptureVideoDataOutput 视频裸帧,目前支持三种格式的输出:
  • AVCaptureSession 主要负责管理各个 Input、Output 以及它们的内部链路组合。

可以通过如下代码获取视频输出支持的格式:

AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
NSArray<NSNumber *> *types = [videoOut availableVideoCVPixelFormatTypes];
NSLog(@"type count: %ld", types.count); // 3 种
for (NSNumber *type in types) {NSLog(@"type: %@", type);
}

2)视频采集

对于视频采集,一般直接使用 AVCaptureSession 的 API 即可,需要注意的是:相机(前后置一样)吐出的视频帧,默认是横屏模式的 (横屏,Home 键在右边,也就是顺时针旋转 90 度就变成 Home 键在下边的正常竖屏状态),跟 Android 略有差异。

视频采集时会有一个 10 多帧的缓存,当我们没有及时归还相机吐出的视频帧,导致采集吐帧的这个缓存空了,就会导致相机不吐帧。

3)音频采集

对于音频采集,除了可以使用 AVCaptureSession 来进行音频采集外,还可以使用 AudioUnit。

使用 AVCaptureSession 可以和视频采集在一起处理,也可以单独创建新的 AVCaptureSession 进行音频采集。

  • 优点:由系统根据 AVAudioSession 自动处理音频采集的开始和暂停,也就是系统中断不用做特殊处理。
  • 缺点:没有办法设置音频采样格式,所以在线路切换时,比如:从正常扬声器切到蓝牙耳机,采样率可能会发生变化,这是就要进行重采样,是采样率保持一致。

使用 AudioUnit 音频采集:

  • 优点:更底层,更高效;在创建 unit 后,可以直接设置音频采集格式(如:通道数等)。
  • 缺点:需要自己处理音频中断等情况。

2、如何降低处理音视频链路中的内存峰值?

音视频处理链路中的内存峰值一般是视频数据导致的,要降低内存峰值一般可以从两个方面入手:

  • 降低采集参数:
    • 降低采集视频分辨率
    • 降低采集视频帧率
  • 降低并发任务数量:
    • 将任务分优先级,按照优先级串行执行,这样既能降低内存峰值,也会降低 CPU 峰值

3、OpenGL 如何实现二分屏效果?

以纹理 y 坐标中间分屏为例,代码如下:


precision highp float;
varying lowp vec2 varyTextCoord;
uniform sampler2D inputTexture;void main()
{float y;if (varyTextCoord.y >= 0.0 && varyTextCoord.y <= 0.5) {y = varyTextCoord.y + 0.25;} else {y = varyTextCoord.y - 0.25;}gl_FragColor = texture2D(inputTexture, vec2(varyTextCoord.x, y));
}

4、使用 OpenGL 绘制时对于二维坐标需要注意什么?

1)搞清楚顶点坐标与纹理坐标

  • 顶点坐标是左下角是 (-1, -1),右上角是 (1, 1);
  • 纹理坐标是左下角是 (0, 0),右上角是 (1, 1),也就是 (0, 0) 对应图片的左下角,(1, 1) 对应着图片的右上角;
  • 顶点坐标与纹理坐标一一对应,默认设置的纹理坐标是平铺满整个顶点坐标的,所以在设置 fill、fit 模式时,只用设置顶点坐标即可。

GLfloat vertexes[] =
{-1.0, -1.0, //左下1.0, -1.0,  //右下-1.0, 1.0,  //左上1.0, 1.0    //右上
};GLfloat textures[] = {0.0f, 0.0f, //左下1.0f, 0.0f, //右下0.0f, 1.0f, //左上1.0f, 1.0f  //右上
};

2)FBO 与 glViewport

首先绘制前 FBO 需要绑定了一个尺寸一致的 texture,绘制的内容会被绘制到这张 texture 上,这个就是 RTT,如果 FBO 为 0 则是屏幕绘制,否则是离屏绘制,可以将 FBO 看作画板,texture 看做这张画布。

一般我们会将 viewport 设置为: (0, 0, FBO.width, FBO.height),这样绘制会占满整个 FBO,而顶点的的4个顶点是与 viewport 的4个顶点一一对应的,当然纹理也是一样对应的。

viewport 的 frame 和 FBO 不一致时,就会只在 viewport 的那块区域进行绘制对应的内容,也就是将输入的纹理在 viewport 的 frame 上进行绘制。

粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

相关文章

Vue中如何使用dayjs

Day.js中文网Day.js是一个极简的JavaScript库&#xff0c;可以为现代浏览器解析、验证、操作和显示日期和时间。https://dayjs.fenxianglu.cn/ 单位不区别大小写&#xff0c;支持复数和缩写形式 单位缩写描述 date D日期 [1,31]dayd星期 [0,6]&#xff08;星期日0&#xff0c…

云计算面试题【后期】

前言&#xff1a; 随着年龄的增长生活琐碎的事情、烦心的事情日渐增多&#xff0c;怠慢了更新&#xff0c; 1.什么是数据库 DB.DataBase 数据库&#xff1a; 依照某种数据模型进行组织并存放到存储器的数据集合 DBMS.DataBase Management System – 数据库管理系统&#xff1a;…

Java MP3转PCM

Java MP3转PCM 1 添加依赖2 Java 代码 1 添加依赖 <dependency><groupId>com.googlecode.soundlibs</groupId><artifactId>mp3spi</artifactId><version>1.9.5.4</version> </dependency>2 Java 代码 package com.xu.music.…

迪萧科技有限公司邀您参观2024生物发酵展

参展企业介绍 浙江迪萧科技有限公司位于浙江杭州&#xff0c;是一家专注于膜技术的国家高新企业。公司针对食品饮料、医药保健等领域的过程分离与控制、产品提取及浓缩、废料资源化利用等提供全方案解决服务。坚持以“顾客至上、优质服务、卓越品质”为原则。为客户企业提供清…

视频批量瘦身:一键缩小尺寸,轻松处理海量视频

在如今视频内容爆炸的时代&#xff0c;无论是个人创作者还是企业团队&#xff0c;都面临着处理大量视频的需求。而视频尺寸过大往往会导致上传缓慢、存储空间不足等问题。为了解决这个问题&#xff0c;我们推出了一款强大的视频批量剪辑工具&#xff0c;让你轻松实现视频尺寸批…

NXP实战笔记(七):S32K3xx基于RTD-SDK在S32DS上配置ICU输入捕获

目录 1、概述 2、输入捕获SDK配置 2.1、SAIC中断方式 2.2、IPWM或者IPM 1、概述 输入捕获&#xff0c;可以抓取高电平时间、低电平时间、占空比、周期、边沿检测与回调函数、边沿计数&#xff08;ABZ解码&#xff09;、时间戳、唤醒中断。 记录一下根据Emios模块实现上述部分…

Spring Cache框架使用教程,通过简单且强大的方式在应用程序中使用缓存提高性能

Spring Cache Spring Cache 框架是 Spring 框架的一部分,它提供了一种简单但功能强大的方式来在应用程序中实现缓存。下面是 Spring Cache 框架的一些好处: 性能提升: 使用缓存可以大大提高应用程序的性能,特别是对于那些需要频繁访问和计算的数据。通过缓存先前计算的结果…

【ARMv8M Cortex-M33 系列 8.1 -- RT-Thread 堆内存 检查命令 free 实现及介绍】

文章目录 RT-Thread 堆内存 检查命令 free 实现及介绍rt_memory_info 函数验证 RT-Thread 堆内存 检查命令 free 实现及介绍 在RT-Thread系统中&#xff0c;通常可以通过rt_memory_info函数获取当前的堆内存使用信息&#xff0c;然后你可以包装这个函数来显示剩余的堆空间。rt…

最全整理,软件测试-Web页面测试思路总结,13年经验...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Web功能测试 …

Vim 模式切换 | 命令集

Vim 模式切换 | 命令集 vim 主要模式及切换一、正常/普通/命令模式1 光标相关操作命令集1.1 光标移动1.2 文字删除1.3 粘贴和复制1.4 替换1.5 字符更改 二、插入模式2.1 插入模式和命令行模式相互切换 三、末行模式2.1 末行模式和命令行模式相互切换2.2 末行模式相关命令集 vim…

【EI会议征稿通知】第十届机械工程、材料和自动化技术国际会议(MMEAT 2024)

2024年第十届机械工程、材料和自动化技术国际会议(MMEAT 2024) 2024 10th International Conference on Mechanical Engineering,Materials and Automation Technology 2024年第十届机械工程、材料和自动化技术国际会议( MMEAT 2024) 将于2024年06月21-23日在中国武汉举行。MM…

【LeetCode每日一题】单调栈316去除重复字母

题目&#xff1a;去除重复字母 给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的字典序最小&#xff08;要求不能打乱其他字符的相对位置&#xff09;。 示例 1&#xff1a; 输入&#xff1a;s “bcabc” 输…

docker自定义网络实现容器之间的通信

Background docker原理 docker是一个Client-Server结构的系统&#xff0c;Docker的守护进程运行在主机上。通过Socket从客户端访问。docker核心三大组件&#xff1a;image–镜像、container-容器、 repository-仓库。docker使用的cpu、内存以及系统内核等资源都是直接使用宿主…

python 函数-04-参数收集-带1个或2个星号

一个函数&#xff0c;至多可以带一个一星参数&#xff08;收集位置参数&#xff09;&#xff0c;加上一个二星参数&#xff08;收集关键字参数&#xff09;。 01 一个星号参数 入参为不定参数&#xff08;参数个数不确定&#xff09;&#xff0c;此时在定义参数时&#xff0c…

最简单方式把jar打包成Windows服务

废话 &#x1f622; 将JAR文件转化为Windows服务是一种高效且常见的Java应用部署策略。这种转变赋予了Java应用程序在Windows操作系统上以无界面后台服务模式运行的能力&#xff0c;从而实现了持续、稳定且可靠的功能提供。这种部署方式不仅提升了应用的可用性&#xff0c…

Python学习笔记——类(编程风格)

编写的应用比较复杂时&#xff0c;特别是大型项目&#xff0c;团队分工协同&#xff0c;尤其要注意编程风格。 &#xff08;1&#xff09;类名应采用驼峰命名法&#xff0c;即将类名中的每个单词的首字母都大写&#xff08;类名的首字母是大写的&#xff09;&#xff0c;并且不…

导入excel某些数值是0

目录 导入excel某些数值是0数据全部都是0原因解决 部分数据是0原因解决 导入excel某些数值是0 数据全部都是0 有一列“工单本月入库重量”全部的数据都是0 原因 展示的时候&#xff0c;展示的字段和内表需要展示的字段不一致&#xff0c;导致显示的是0。 解决 修改展示的字…

kubernetes面试题及核心知识点

无状态负载deployment有状态管理 &#xff1a; config配置文件 secret密码文件 内置volumn插件 1、emptyDir宿主机的存储为容器分配资源。临时储存&#xff0c;随着pod的删除而消失&#xff0c; 2、hostPath宿主机的存储为容器分配资源。不会随着pod的删除而消失&#xf…

Video generation models as world simulators-视频生成模型作为世界模拟器

原文地址&#xff1a;Video generation models as world simulators 我们探索在视频数据上进行大规模生成模型的训练。具体来说&#xff0c;我们联合训练文本条件扩散模型&#xff0c;同时处理不同持续时间、分辨率和长宽比的视频和图像。我们利用一个在视频和图像潜在编码的时…

AGI|AI到底如何生成视频?Sora究竟为何能引爆科技圈?

目录 一、AI生成视频引发新浪潮 二、生成方法及难点 三、Sora的突破进展 &#xff08;一&#xff09;可生成不同尺寸视频 &#xff08;二&#xff09;可生成1分钟时长视频 &#xff08;三&#xff09;图片生成视频 &#xff08;四&#xff09;场景一致性 &#xff08;五…