音视频面试基础题

news2024/11/20 9:13:39

编码原理

为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?核心思想就是去除冗余信息:

1)空间冗余:图像相邻像素之间有较强的相关性

2)时间冗余:视频序列的相邻图像之间内容相似

3)编码冗余:不同像素值出现的概率不同

4)视觉冗余:人的视觉系统对某些细节不敏感

5)知识冗余:规律性的结构可由先验知识和背景知识得到

直播秒开优化

  • DNS 解析慢 为了有效降低 DNS 解析对首开的影响,我们可以提前完成播放域名->IP 地址的解析, 并缓存起来,播放的时候,直接传入带 IP 地址的播放地址,从而省去了 DNS 解析的耗时。 如果要支持用 IP 地址播放,是需要修改底层 ffmpeg 源码的。

  • 播放策略 很多侧重点播的播放器,为了减少卡顿,会有一些缓冲策略,当缓冲足够多的数据之后 ,再送入解码播放。

而为了加快首开效果,需要对播放的缓冲策略做一些调整,如果第一帧还没有渲染出来的情况下, 不要做任何缓冲,直接送入解码器解码播放,这样就可以保证没有任何因为「主动」缓冲带来的首开延时。

  • 播放参数设置 所有基于 ffmpeg 的播放器,都会遇到avformat_find_stream_info这个函数耗时比较久, 从而增大了首开时间,该函数主要作用是通过读取一定字节的码流数据, 来分析码流的基本信息,如编码信息、时长、码率、帧率等等,它由两个参数来控制其读取的数据量大小和时长, 一个是 probesize,一个是 analyzeduration。

减少 probesize 和 analyzeduration 可以有效地减少avformat_find_stream_info的函数耗时, 从而加快首开,但是需要注意的是,设置地太小可能会导致读取的数据量不足,从而无法解析出码流信息,导致播放失败, 或者出现只有音频没有视频,只有视频没有音频的问题。

  • 服务端优化

服务器关键帧缓冲

CDN最近策略

直播弱网

  • 首先如何判断是弱网 不一定要进行网络检测,可以检测两次发包的时间间隔,通过发包的状态与时间的长度判断网络状态。

  • 根据上行带宽的状况来动态调整码率、FPS、分辨率 一般情况下视频轨码率默认设置为600Kbps,音频轨码率默认设置为64Kbps。

  • 编码优化 对于视频编码器确定编码器开启了最低延迟,对于x264尤其明显。

尽量使用 ACC-LC Codec 来编码音频,HE-ACC 或者 HE-ACC 2 虽然编码效率高,但是编码所需时间更长,而产生更大体积的音频,造成包可能过大。

不要使用视频 MJPEG 的视频压缩格式,至少使用不带 B 帧的 MPEG4 视频压缩格式(Simple profile),甚至最好使用 H.264 baseline profile(X264 还有一个「-tune zerolatency」的优化开关)。 这样一个简单的优化可以降低延迟,因为它能够以更低的码率编码全帧率视频。

固定码率编码 CBR 可以一定程度上消除网络抖动影响,如果能够使用可变码率编码 VBR 可以节省一些不必要的网络带宽,降低一定的延迟。因此建议尽量使用 VBR 进行编码。

  • 传输协议优化

  1. 在服务端节点和节点之间尽量使用 RTMP 而非基于 HTTP 的 HLS 协议进行传输,这样可以降低整体的传输延迟。 这个主要针对终端用户使用 HLS 进行播放的情况。

  2. 如果终端用户使用 RTMP 来播放,尽量在靠近推流端的收流节点进行转码,这样传输的视频流比原始视频流更小。

  3. 如果有必要,可以使用定制的 UDP 协议来替换 TCP 协议,省去弱网环节下的丢包重传可以降低延迟。 它的主要缺点在于,基于 UDP 协议进行定制的协议的视频流的传输和分发不够通用,CDN 厂商支持的是标准的传输协议。 另一个缺点在于可能出现丢包导致的花屏或者模糊(缺少关键帧的解码参考),这就要求协议定制方在 UDP 基础之上做好丢包控制。

4、丢帧处理 弱网环境下的丢帧策略。一般情况我们会有两种队列,分别是编码之前的原始数据队列和编码之后的编码队列。 弱网丢帧策略常见的实现有两种:一种是丢弃原始数据队列中未编码的数据帧,另外一种是丢弃编码队列中的数据帧。 这两种实现各有优缺点,无论采用哪种实现方式都以“不影响音视频的对齐”为第一准则。 丢掉了一定时间的视频帧同时也需要丢掉同等时间的音频帧。

  • 播放优化 动态码率播放策略。除了动态调整 buffer 大小的策略之外,也可以利用实时监测的网络信息来动态调整播放过程中的码率, 在网络带宽不足的情况下降低码率进行播放,减少延迟。

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

视频拼接处理步骤(细节处理,比如分辨率大小不一,时间处理等等)

解封装、解码、决定分辨率大小、编码、时间处理、封装。

NV21如何转换成I420

首先需要明白为什么需要将NV21转换成I420,这是因为x264只支持编码I420的数据。 实际上就是YUV420p与YUV420sp之间的转换。 YUV420p与YUV420sp的相关知识请参考:《音视频基础知识-YUV图像》 具体转换参考:NV21与I420编码格式_yuanjinsong123的博客-CSDN博客_nv21格式

硬编码与软编码如何选择

https://github.com/interviewandroid/AndroidInterView/blob/master/android/mediacodec.md

x264编码调优

参考:X264性能优化_渔村居士的博客-CSDN博客_x264优化体积

DTS与PTS

PTS就是Presentation Time Stamp也就说这个帧什么时候会放在显示器上;

DTS就是Decode Time Stamp,就是说这个帧什么时候被放在编码器去解。

在没有B帧的情况下,DTS和PTS的输出顺序是一样的。

比特率

比特率表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示。 比特率也叫做码率 也就是指每秒传送的比特(bit)数。

比如音频的比特率:比特率 =采样率 x 采用位数 x声道数。

影响视频清晰度的指标

帧率

码率

分辨率

量化参数(压缩比)

影响视频流畅度的指标

码率

帧率

什么是GOP

GOP ( Group of Pictures ) 是一组连续的画面,由一张 I 帧和数张 B / P 帧组成,是视频图像编码器和解码器存取的基本单位。 也就是说GOP组是指一个关键帧I帧所在的组的长度,每个 GOP 组只有 1 个 I 帧。

GOP 组的长度格式也决定了码流的大小。

GOP越大,中间的P帧和B帧的数量就越多,所以解码出来的视频质量就越高,但是会影响编码效率。

例如720P的视频,需要选择多大的码率才合适

文件大小 = (音频码率 + 视频码率)/ 8 * 影片时长(单位为秒s)

什么是SPS,什么是PPS

SPS又称作序列参数集。SPS中保存了一组编码视频序列的全局参数。包含了profile、level、宽高和颜色空间等信息。

所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。

PPS是图像参数集。每一帧的编码后数据所依赖的参数保存于图像参数集中。

SurfaceView/TextureView的区别

  • SurfaceView是一个有自己Surface的View。界面渲染可以放在单独线程而不是主线程中。它更像是一个Window,自身不能做变形和动画。

  • TextureView同样也有自己的Surface。但是它只能在拥有硬件加速层层的Window中绘制,它更像是一个普通View,可以做变形和动画。

Camera和Camera2如何选择

参考官方的CameraView:GitHub - google/cameraview: [DEPRECATED] Easily integrate Camera features into your Android app

JNI线程交互

native 环境中创建的线程,如果需要访问 JNI,必须要调用 AttachCurrentThread 关联,并使用 DetachCurrentThread 解除链接。

作者:音视频开发进阶

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 

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

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

相关文章

CVPR21 - BasicVSR:简单有效的视频超分辨率Baseline

文章目录原文信息初识相知组件分析BasicVSRIconVSR部分实验回顾原文信息 原文链接 初识 相比于图像超分,视频超分(VSR,Video Super-Resolution)显然是一件更具挑战性的任务。视频超分比图像超分多了时间维度的信息、更为复杂,而在当时&…

结构体的声明使用及存储方式

文章目录 一、结构体的声明与使用 1、1 结构体的简单声明 1、2 结构体的特殊声明 1、3 结构体自引用 1、4 结构体变量的定义和初始化 1、5 结构体传参 二、结构体在内存中的存储方式 2、1 结构体在内存中的存储方式的引入 2、2 结构体的内存对齐 2、3 修改默认对齐数…

AcWing - 寒假每日一题2023(DAY 1——DAY 5)

文章目录一、AcWing 4261.孤独的照片(简单)1. 实现思路2. 实现代码二、AcWing 3400.统计次数(简单)1. 实现思路2. 实现代码三、AcWing 4366. 上课睡觉(简单)1. 实现思路2. 实现代码四、AcWing 3443. 学分绩…

程序员接私活最最完整攻略

接私活对于程序员这个圈子来说是一个既公开又隐私的话题,当你竭尽全力想要去接私活的时候一定做过这样的事情,百度搜索“程序员如何接私活”、“程序员在哪里接外包”等等问题,今天就送大家最完整攻略,千万别错过了。 做私活挣钱吗…

有趣且重要的Git知识合集(10)git stash操作

这种一般用于多分支,或者多人协同合作时会使用到的git命令 场景1: 当你在dev分支上写了很多代码,此时线上有bug,需要紧急在hotfix分支上修改,那直接git add提交又不太好,毕竟还没有开发完,那么…

JVM 学习笔记 内存结构

内存结构 程序计数器 作用:记录下一条JVM指令的执行地址 特点: 线程私有不存在内存溢出 虚拟机栈 每个线程运行时所需的内存称为虚拟机栈。每个栈由多个栈帧(Frame)组成,每个栈帧对应每次方法调用时占用的内存。每…

BIOS 的详细介绍

一、BIOS详解 对于不少新手,刷新BIOS还是比较神秘的。而对于一些BIOS相关的知识,不少人也是一知半解。在这里,我们将对BIOS作一次全面的了解。 1、什么是BIOS BIOS是英文"Basic Input Output System"的缩略语,直译…

NTN(三) Timing

微信同步更新欢迎关注同名modem协议笔记。这篇看下k_offset和k_mac,如38.300所述,k_offset是配置的调度偏移量,需要大于或等于service link RTT和Common TA之和;k_mac 是配置的偏移量,需要大于或等于 RP 和 gNB 之间的…

Chem. Eur. J.|针对细胞内靶点的环肽药物:肽药物发展的下一个前沿

​题目:Cyclic Peptides as Drugs for Intracellular Targets: The Next Frontier in Peptide Therapeutic Development 文献来源:Chem. Eur. J. 2021, 27, 1487 – 1513 代码:无(环肽综述) 内容: 1.简…

5-迷宫问题(华为机试)

题目 定义一个二维数组 N*M,如 5 5 数组如下所示: int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只…

通用模型切片处理过程 CesiumLab系列教程

我们前面把每种格式的模型参数设置已经讲解清楚,下面我们应该弄清楚通用模型切片剩下的流程,不管是人工模型,还是shp矢量面、bim模型,剩下的处理过程都是一样的,这里我们一起讲述。 资源库 ​通用模型处理分为两个过程…

基于JAVA的个人信息管理系统源码,含基于VUE的PC前端及移动端,用于管理个人消费、锻炼、音乐、阅读、健康、饮食等衣食住行信息

项目介绍 完整代码下载地址:基于JAVA的个人信息管理系统源码 用于管理个人消费、锻炼、音乐、阅读、健康、饮食、人生经历等各个衣食住行信息的系统,通过提醒、计划模块利用调度系统来统计分析执行情况。 并通过积分和评分体系来综合评估个人的总体状态…

【C++】类和对象【中篇】--C++六个默认成员函数以及const成员函数

文章目录一、类的6个默认成员函数二、构造函数1.概念2.特性2.1特征分析——自动生成2.2.特征分析——选择处理2.3特征分析——默认构造3.C11补丁——缺省值三、析构函数1.概念2.特征四、拷贝构造函数1.概念2.特征2.1引用分析——引用做参数2.2特征分析——深浅拷贝五、运算符重…

Clin Nutr | 浙大儿童医院-陈洁/倪艳揭示全肠内营养对儿童克罗恩病肠道菌群和胆汁酸代谢的影响...

全肠内营养对儿童克罗恩病肠道微生物群和胆汁酸代谢的影响The impact of exclusive enteral nutrition on the gut microbiome and bile acid metabolism in pediatric Crohns diseaseResearch article,2022年11月30日,Clinical Nutrition,7.…

Weblogic 任意文件上传漏洞(CVE-2018-2894)复现

目录 weblogic 漏洞环境准备 漏洞复现 修复建议 weblogic WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应…

Healthcare靶机总结

Healthcare靶机渗透总结 靶机下载地址: https://download.vulnhub.com/healthcare/Healthcare.ova 打开靶机,使用nmap扫描出靶机的ip和所有开放的端口 可以看到,靶机开放了21端口和80端口 21端口为ftp的端口,一般遇到这种,就可以考虑ftp的匿名登录,我们可以试一下 用户名anony…

【总结】华为、H3C、锐捷三家交换机配置命令详解

一直以来,对于华为、H3C、锐捷交换机的命令配置,不断的有朋友留言,三家交换机的配置命令容易弄混,经常在实际项目配置中出错,因此,本期我们将来介绍这三家交换机的基础配置命令,大家可以分别来看…

动手学区块链学习笔记(一):加密算法介绍

引言 本文根据实验楼以及自己查询到的一些资料(文末给出),模拟了一下区块链从诞生到交易的整个过程,也算是弥补了一下之前区块链的一些缺失知识。 哈希加密原理介绍 什么是比特币? 比特币是一种加密货币&#xff0c…

【Python百日进阶-数据分析】Day223 - plotly瀑布图go.Waterfall()

文章目录一、语法二、参数三、返回值四、实例4.1 简单瀑布图4.2 多类别瀑布图4.3 设置标记大小和颜色4.4 水平瀑布图4.5 Dash中的应用一、语法 绘制瀑布轨迹,这是一种有用的图表,可以在条形图中显示各种元素(正或负)的贡献。y如果…

一文读懂mybatis连接池原理

本文需要配合代码demo一起观看更佳,源码地址。 本源码中对 mybatis代码做了详尽的注释。对mybatis源码进行了详尽的注释,且可以对项目进行install,然后在ron-man-mybatis1项目中 src/main/java/iron/man/lyf/ironmanmybatis1/run_test/Mybat…