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

news2025/1/10 20:03:21

前言:

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


面试的具体题目:

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.coloradmin.cn/o/561777.html

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

相关文章

chatgpt赋能Python-python_ps图片

Python PS图片的SEO指南 Python在数字图像处理中广泛应用。其中,Photoshop文件(psd)是一种常见的图像文件格式。但是,如何在搜索引擎上优化Python PS图片并提高其排名仍然是一个挑战。 什么是Python PS图片? Python…

数据结构和算法基础学习1

​​​​​​​ 网址第01周b--1.1数据结构研究_哔哩哔哩_bilibili

学C的第十九天【实用调试技巧:1. 调试;2. Windows环境调试介绍;3. 一些调试的实例;4. 一些调试的实例】

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com) 接上期:学C的第十八天【指针初阶:5. 指针和数组、6. 二级指针、7. 指针数组;初识结构体:1. 结构体的声明、2. 结构体成员的访问、3. 结构体传参&#xff1b…

java中的栈、堆、方法区

栈(stack) Java栈与堆不同每一个线程都有一个stack,栈的区域非常小,大概只有1M左右,但是存储速度非常快,所以我们把快速执行的任务存储在stack。 特点:自动分配,连续空间&#xff0…

如何从文档中提取结构化数据?parsio.io

parsio.io 产品名:Parsio电子邮件解析器 技术:采用人工智能技术的电子邮件解析器。 支持多种格式: 可以解析电子邮件和附件中的数据,包括PDF、HTML、XLSX(Excel)、CSV、DOCX、XML、TXT等格式。 提取模版&am…

FANUC机器人作为EtherCAT通信从站的相关配置方法

FANUC机器人作为EtherCAT通信从站的相关配置方法 基本介绍: 前提条件: 硬件部分: 机器人需要使用EtherCAT从站板卡 A20B-8101-0821。使用带屏蔽层的网线连接板卡和PLC的网口。 本例中使用的网络接口为EC-IN(CD38Y) 软件部分: 机器人需要安装软件:1A05B-2600-J743! Et…

NLog使用

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

程序员的 Windows 工具箱「GitHub 热点速览」

作者:HelloGitHub-小鱼干 如何精简 Windows 并快速配置开发环境呢?本周特推的 winutil 是一个程序员的 Windows 工具箱,它提供了开发工具的一键安装以及减少系统垃圾的功能,一切为了简洁、高效。同样高效的还有 C 日志库 spdlog&a…

对讲机亚音是什么?有什么作用?

一、对讲机亚音是什么? 对讲机亚音又被称为亚音频。是比音频信号频率更低的一种特殊信号,目的在于检查信号是否合法,是否对信号进行响应。 亚音是一种特殊的振幅信号,人耳无法感觉也无法听闻到这些信号,所以对于无线…

mac mongodb 安装及配置

1.官网下载地址:MongoDB: The Developer Data Platform | MongoDB 2.下载好压缩包,解压后放在想放的地方,例如: /Users/xiaokeai/environment/mongodb-macos-x86_64-5.0.18 3.打开终端后,在家目录中打开.bash_profil…

Linux系统编程学习 NO.4 ——基础指令学习、操作系统时间的概念、文件压缩包的概念

1.时间相关的概念以及指令 1.1.时间相关的指令 1.1.1.date指令 date可以指定时间显示的格式:date 指定格式 选项 %H:小时 %M:分钟 %S:秒数 %Y:年份 %m:月份 %d:日 %F:相当于%Y-%m-%d %X:相当…

java网络编程从0到1快速上手

目录 网络编程概述 网络基础 网络编程的目的 网络通信要素概述 通信要素1:ip地址及端口号 IP 地址:InetAddress 端口号 InetAddress类 通信要素2:网络协议 网络协议概述 TCP/IP协议簇 TCP 和 UDP ​Socket Socket类的常用构造…

都什么年代了你还不学习postgreSQL(入门篇)

postgreSQL学习 一,简介 1.什么是postgresql https://www.postgresql.org/#官网​ PostgreSQL 是一个功能强大的开源对象关系数据库系统,它使用和扩展了 SQL 语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL的起源可…

消息队列对比

目录 什么是消息队列 常用的消息队列工具对比 1 、ActiveMQ 2 、RabbitMQ 3、Kafka 4、 RocketMQ 什么是消息队列 消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走。通过消息队列&#xff0…

docker 镜像和容器

一、简述 win系统常用Ghost技术来做镜像,把系统和系统上安装的应用程序一起打包做备份,在别的电脑上安装这个GHO镜像则会有和源系统一摸一样的系统和应用。 docker功能类似,而且是分层的,在拉取镜像时候可见。 docker镜像拉取下…

4、js - 闭包

1、闭包的概念 闭包:函数嵌套函数,内层函数访问了外层函数的局部变量。 // 闭包 function func1() {let a 9;let b 8;function func2() {console.log("a", a); // a 9}func2(); } func1(); 分析: 需要访问的变量会被放到闭包…

用YOLOv5和MobileViTs骨干网络革新目标检测:高效准确AI视觉的未来

目录 一、YOLOv51、YOLOv5介绍2、YOLOV5的整体架构图3、MobileViT介绍 二、YOLOv5与MobileViT的结合1、YOLOv5网络结构回顾2、MobileViT网络结构介绍3、YOLOv5替换骨干网络为MobileViT的优势 三、MobileViT的细节与实现1、ViT与MobileNetV3的结合2、MobileViT网络结构细节3、Mo…

最高奖金100万!第二届广州·琶洲算法大赛火热报名中

第二届广州琶洲算法大赛以“优选AI算法 让世界更智能”为主题,聚焦前沿 AI 技术,推进算法领域的学术交流、人才培养、技术发展及应用,面向算法领域的开发者、创业机构、企事业单位,招募具有原创性、独创性、引领性的算法模型和应用…

c++ 11标准模板(STL) std::map(二)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…

【JavaScript】ES6新特性(3)

10. Symbol 使用 Symbol&#xff0c;表示独一无二的值 每个 Symbol 是不一样的 不能进行运算 可以显式调用 toString() 可以隐式转换 boolean <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-eq…