嵌入式音视频开发面试过程遇到的问题!

news/2024/7/10 21:52:46 标签: 音视频, 面试, ffmpeg, 职场和发展

前言:

今天继续给大家分享音视频面试过程会被常问到的一些问题!


面试的具体题目:

1、说一下播放器的设计过程:

这里的话主要分以下几步完成:

885f5c5bbd2ced1c13b1d84a60db3586.png

开启一个线程进行解封装操作 , 这包括:读取音频、视频的压缩数据,并进行区分。若视频数据则插入视频队列,音频数据则插入音频队列。

再开启两个解码线程分别对音频、视频的压缩数据进行解码处理,比方说:视频解码线程主要从视频队列拿数据并进行解码。音频解码线程主要从音频压缩队列拿数据并进行音频解码,并进行音频时钟的计算。音频时钟的计算就是音频PTS的计算,而视频pts则跟音频pts进行校准,进行音视频的同步。

2、如何解决卡顿,花屏问题:

  • 花屏:花屏的本质是数据包不完整,要保证视频不出现花屏就要保证整个视频不能出现丢包情况。下面有几种方式能够防止花屏:

    • 2.1、高分辨率的情况下,若出现花屏则说明FFMPEG发送的数据超过了默认值,需要扩大接收端的缓冲区,防止丢包。在FFMPEG源码之中,找到udp.c并修改UDP_MAX_PKT_SIZE默认值。一般这个默认值扩大10倍,则播放器就基本上不会出现花屏。

01e2f5e6d58200564dae6015728f6477.png
  • 2.2、可能是YUV数据出错,在采集的时候要保证YUV准确无误

  • 卡顿问题:

    • 2.3、 码率问题:编码器输出码率超过实际网络带宽,此时网络可能突然变的很差,预估带宽很小,但其实解码出来的画面很复杂。而此时就会容易出现发送码率大于实际码率的情况。

    • 解决方法:最好使用CBR把码率严格控制起来,从而保证输出码率更好地贴合带宽。VBR的话输出码率会随着画面复杂程度,所以容易造成网络带宽的浪费

    • 2.4、机器性能不够:若机器本身性能不够,画面分辨率很高,若使用CPU处理则会导致耗时很严重。在这种情况下,则考虑用GPU进行前处理,并使用硬件进行编解码的工作加快处理速度。

3、对H264的结构有什么了解:

H264的封装一般分为VCL层和NAL层。

VCL(Video Coding Layer)视频编码层:包括了压缩引擎和块、片语法的定义,并设计目标独立于网络高效编码,它的作用是有效表示视频数据的内容。

NAL(NetWork Abstraction Layer)网络提取层:它主要负责的是将VCL产生的比特字符串适配到各种各样的网络和多源环境中,覆盖了片级别的语法;通常一个NALU单元是由[NALU HEADER] + [NALU Payload]组成。NAL本质上是对VCL进行封装包裹。

da4a4d55c50609e9898641eca60c5d4b.png
StartCode(0x000001或0x00000001)作为起始码。
NALU就是H264的实际数据部分。NALU = NALU Header + EBSP组成;
EBSP = 防竞争码 + RBSP;
RBSP = SODB + RBSP尾部

我们来看看NALU HEADER和NALU Payload的结构:

  • 3.1、NALU HEADER解析:

NALU Header一般分为两种流格式,一种是Annex-B格式,另外一种是RTP包流格式。

Annex-B格式是默认输出格式。数据单元的分割是通过[StartCode] (0x000001或0x00000001)作为起始码。

d51d9834245cfe70c6410f5d4d0916c6.png

F:禁止位,占1bit forbidden_zero_bit:F禁止位,占用NALU Header的第一个位,值默认0,值为1表示错误。

R:指示位,占2bit Nal_refreence_bit(2bits):NRI重要性指示位,占用NALU Header第二位、三位,用来表示NAL单元,取值越大,NAL越重要。

T:负荷数据类型,占5BIT nal_unit_type(5bits):Type类型,占用NALU Header第四到第八位,用来表示NAL单元类型,下面是具体的表格:

9f37ed64688b8410831a2feb423cb551.png
  • 3.2、NALU Payload:

NALU的主体涉及到几个重要的名词,分别为EBSP、RBSP和SODB。其中EBSP基本上是NALU主体,这三者的关系式EBSP包含RBSP,RBSP包含SODB:

  • SODB:String of Data Bits原始数据比特流,就是原始的编码/压缩得到的数据

  • RBSP:Raw Byte Sequence Payload,也称之为字节序列载荷,SODB +RBSP Trailing Bits引入RBSP Trailing Bits做8位字节补齐

  • EBSP:Encapsulated Byte Sequence Payload 扩展字节序列载荷

下面这张图是SODB、RBSP、EBSP的结结构图:

f85ee975b72bd0fd398f7212659a22c1.png

下面这张图是SODB、RBSP、EBSP的结结构图

96d6e4dc4591ab3ec87417fa967c2c69.png

最后:

关于音视频的实践学习,目前我开了一个rv1126的音视频开发实践星球课程内容,有解答群和视频教程:

d168f1cdf7bb0c7031da8d2c30b5c318.png

前两部分偏ai识别处理,第三部分关于音视频实战内容,如果你想提高自己的动手能力,或者你学习了很多理论知识,但是缺少项目经验,那么本项目非常适合你,下面是具体的内容:

cd71af4b7056a7fc3dad0da718416045.pngbda748c6184606b4a9685f51965d5cd6.png8c0ebb51cbc2aeaa0afd911757a764b9.png10aa0d5d26a8ffa636fe8ddb4b83c346.png

很多人,觉得课程稍微有点贵,但是换个思维来想,如果学习的技术点对你有提升,跳槽的时候,也是给你涨薪带来更多的信心;同时如果少外出吃一顿大餐,转为为学习技术知识上来,那么长期对你来说,都是非常有利的!

购买课程,可以直接加我微信进行买:

15e5cf2d9f9c572227a32361b06bbb90.png

http://www.niftyadmin.cn/n/354056.html

相关文章

CodeForces.1810B.糖果.[中等][ifelse选择][注意输出格式]

题目描述: 解题思路: 题目解读: 初始状态只有一个糖果,即x1,给定想要获得的总糖果数y。 只能进行两种操作,分别是做2x-1和2x1。给出从 x1 到 目标数字 y 的操作步数和具体步骤。 示例1 从1到2&#xff…

函数式接口入门简介(存在疑问,求解答)

这里写目录标题 引子四种函数式接口-简单Demo四种函数式接口介绍函数式接口实战-代码对比关于Consumer赋值问题(疑问,求解答) 引子 只包含一个抽象方法的接口,就称为函数式接口。来源:java.util.function 我想在方法…

在Linux中为Simulink添加ROS自定义消息类型

在Linux中为Simulink添加ROS自定义消息类型 基于Matlab/Simulink的ROS自定义消息类型的添加方法 ROS与Simulink联合仿真(三):自定义Message 1、下载 ROS Toolbox Interface for ROS Custom Messages 将 roscustommsg.mlpkginstall 文件放入 MATLAB 工作空间 双击 roscustommsg…

通知可以根据切入点表达式来进行增强,也可以根据自己的注解值来进行增强

通知可以根据切入点表达式来进行增强,也可以根据自己的注解值(例如 Before、After、Around 等)来进行增强。 如果要根据切入点表达式来进行增强,需要在通知注解中使用 Pointcut 注解来引用切入点表达式。例如,在以下示…

绝世内功秘籍《调试技巧》

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 内容专栏:这里是《C知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,希望可以帮到读者们哦。 内…

2023.5.14Ubuntu忘记MySQL密码

如果您忘记了MySQL的密码,可以按照以下步骤重置MySQL的密码: 停止MySQL服务: sudo service mysql stop启动MySQL服务,并跳过授权表: sudo mysqld_safe --skip-grant-tables &使用MySQL客户端连接到MySQL&#x…

NLog使用

Nlog 日志组件的使用 这个博文关注 .net framework下的NLog日志组件的使用. 在项目中需要将日志写到日志文件中, 另外一些重要信息要显示在界面上. 使用 NLog 可以轻松做到这点.NLog wiki 页面 nuget 安装两个主要组件 NLogNLog.Windows.Forms 使用总结 日志文件 layout 按照 j…

java版企业工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…