查看原文
其他

压箱底的音视频学习资料以及面经整理

程序喵大人 程序喵大人 2022-08-22

大家好,我是程序喵。


本人是主要从事音视频相关的开发工作,但发现网上关于音视频的学习资料都比较零散,而且也没有一套比较全面的面经,所以我把自己这几年整理的相关资料都掏出来给大家。(获取完整版pdf文档请在公众号后台回复“微信”,添加我微信领取)


咳咳:这篇文章我本来都想开付费阅读了,因为真的耗费了我极大精力。后来想想还是算了,支持的就点个赞、转发、在看吧。


温馨提示,文末更精彩。


废话不多数,直接上干货,内容都是自己整理的,有些地方难免有错误,大家见谅哈。

  • 音频处理需要理解的概念有哪些?

    • 采样率:每秒采集声音的数量HZ,一般为44100HZ

  • 采样精度:每次采样的精度位数,位数越多,能记录的范围就越大,一般为16bit。

  • 通道:单声道,双声道,四声道等。

  • 比特率:也叫码率,比特率 = 采样率 x 采样精度 x 通道数

  • 采样率44100,采样精度16,通道2的比特率为44100*16*2bps。

  • wav格式:前44字节(有可能比44字节多)记录采样率通道等信息,后面就是pcm裸数据。【http://soundfile.sapp.org/doc/WaveFormat/

  • aac格式:一般packet为adts头+编码数据;如果是将aac封装到mp4容器中,则不需要为每个aac packet添加adts,音频信息和偏移量可以存储到moov中,然后直接存储aac packet即可。

  • https://zhuanlan.zhihu.com/p/34295106

  • https://blog.csdn.net/yuhengyue/article/details/91443191

  • PCM音频数据是如何组织的?

    • PCM数据是指未经压缩的音频采样数据裸流,它是模拟信号经过采样、量化、编码转换成的标准数字音频数据。

  • 一般都是LRLR方式

  • https://www.jianshu.com/p/e568f94cdf6a

  • https://blog.csdn.net/qq_31186123/article/details/80060102

  • https://www.zhihu.com/question/29721784

  • https://blog.csdn.net/lifei092/article/details/80990813



  • pcm数据经过AAC编码器编码后,直接写文件会怎么样?

    • 不能播放,需要为aac对每一个packet添加adts头,形成adts帧,即可播放。

  • 还有一种方式是ADIF格式,头信息只在文件头部,解码必须从头部开始,获取头信息后,剩下全是音频数据,但是这种格式的解码必须在开头位置进行。

  • https://blog.51cto.com/u_15072920/3950445【adts一般为7字节,也有可能9字节】

  • https://blog.csdn.net/user_jiang/article/details/108033848

  • https://juejin.im/post/5d6b83646fb9a06af7124c40

  • 将AAC封装到mp4容器中,是否需要为每个AAC packet添加ADTS?

    • 不需要,因为moov里存储里aac的具体声音信息和每个packet的偏移量,可以不需要adts。

  • https://www.cnblogs.com/chyingp/p/mp4-file-format.html【mp4格式介绍】

  • https://zhuanlan.zhihu.com/p/374140861【mp4格式介绍】

  • https://www.cnblogs.com/zhangxuan/p/8809245.html

  • https://blog.csdn.net/skdkjzz/article/details/40506473

  • AAC(Advance Audio Coding)封装有哪些规格,ADTS帧头包含哪些字段和含义

    • ADIF格式,头信息只在文件头部,解码必须从头部开始,获取头信息后,剩下全是音频数据,但是这种格式的解码必须在开头位置进行。

  • ADTS格式,每个packet都有个header,可以从任何位置开始。

  • 如图 https://zhuanlan.zhihu.com/p/162998699

  • WAV格式,WAV的数据头的最小大小和作用

    • 上面介绍过,前44字节(有可能比44字节多)记录采样率通道等信息,后面就是pcm裸数据。

  • 介绍信号的时域和频域?

    • 时域:信号在时间轴随时间变化的总体概括,时间和振幅的关系【横轴是时间,纵轴是信号的变化幅度】

  • 频域:频谱图,频率和振幅的关系【横轴是频率,纵轴是信号的变化幅度】

  • https://www.zhihu.com/question/21040374

  • RTP数据包格式

    • real-time transport protocol实时传输协议。

  • https://zhuanlan.zhihu.com/p/86919417

  • 简述H264格式

    • 目标:高的视频压缩比、良好的网络亲和性,适用于各种传输网络

  • 分层:目的是?

    • 视频编码层VCL:VCL数据是编码处理的输出,表示被压缩编码后的视频数据序列。【编码/压缩、切分】

  • 网络提取层NAL:VCL数据传输和存储之前,这些VCL数据,会被封装进NAL单元中。【打包】

  • NALU结构

  • Header有一个字节,8个比特位(1,2,5)

    • 1(forbidden_zero_bit):正常为0,当前NALU存在错误时才为1

  • 2(nal_ref_idc):NALU的重要性,0-3,值越大越重要,0表示非参考帧(其他帧解码时不需要参考该帧),如果NALU是参考帧或SPS、PPS重要数据时会大于0。

  • 5(nal_unit_type):当前NALU的类型,具体类型如下图:

  • NALU Body,如图:

  • NALU = header + EBSP = header  + 0x03 + RBSP = header + 0x03 + SODB + 补齐字节

  • 一个NALU可以代表一个完整的帧吗?

    • 不可以,看nal_unit_type,5代表完整帧,1-4不一定是完整帧。

  • 多个NAL单元组成一个Access Unit,多个Access Unit再组成一个视频编码序列(即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列)。

  • nal_unit_type的第9位才表示是不是一个完整帧结束。

  • SPS:序列参数集,保存编码序列的全局参数,主要是profile(baseline、main、extended profile)

  • PPS:图像参数集,保存整体图像相关的参数,每一帧可能有不同的设置信息,初始QP,分块信息等。

  • IDR:后面的帧不会参考IDR之前的帧,可以刷新缓冲队列。

  • Slice:主要就是表示IBP帧。

  • SEI:补充增强帧,可以增加图像参数、用户信息等。

  • https://www.yuque.com/keith-an9fr/aab7xp/vng2pb

  • https://zhuanlan.zhihu.com/p/71928833

  • https://www.yuque.com/keith-an9fr/aab7xp/uzazfb

  • 主流格式:两者的差别很小,就是视频数据单元分割方式不同

    • Annexb:即以start code来分割NALU,打包方式如下:[startCode]--[NALU]--[startCode]--[NALU]...

  • avcc的格式:不使用startCode,而使用[size]--[NAL]--[size]--[NAL],mp4的h264就是这种格式。

  • https://www.cnblogs.com/linuxAndMcu/p/14533228.html

  • IBP帧和GOP

    • I:帧内编码图像帧,不参考其他帧,只利用本帧的信息进行编码,压缩比最低。

  • P:利用之前的I帧和P帧,采用运动预测的方式进行帧间编码,压缩比略高。

  • B:既利用前面的帧,也参考后面的帧,进行帧间双向预测编码,压缩比最高。

  • GOP:两个I帧之间的间隔。GOP越大,PB帧就越多。

  • https://zhuanlan.zhihu.com/p/112635240

  • 如何通过SPS内部的 pic_width_in_mbs_minus1和pic_height_in_map_units_minus1 计算宽高

    • 假设pic_width_in_mbs_minus1=21,pic_height_in_map_units_minus1=17,则宽为(21+1)*16=352,高为(17+1)*16=288

  • 列举几种profile

    • baseline profile:基本画质,支持I/P帧

  • main profile:主流画质,支持I/B/P帧

  • extended profile:进阶画质,支持I/B/P/SP/SI帧

  • IDR帧与I帧的理解

    • IDR帧一定是I帧,但I帧不一定是IDR帧。一个序列中可以有很多I帧,但是I帧后的图像也可以引用I帧前的图像做参考。如果是IDR帧,则可以将参考帧队列清空,后面的图像一定不会参考IDR帧之前的图像。

  • 编码I P B帧存储和显示顺序问题。


    无法复制加载中的内容

    • H264 over rtp 如何实现?

      • 就是h264的另一种形式,size-nal-size-nal格式

    • mp4封装

      • ftyp 文件类型

      • 格式【MP4格式的矢量图和html文件大家可以关注我公众号然后加我微信私聊我获取哈】

    • moov 存放媒体信息

    • mdat 存放媒体数据

    • stbl Sample Table Box 描述每个sample的信息

    • stsd sample的宽高 pps等

    • https://www.jianshu.com/p/529c3729f357

    • https://segmentfault.com/a/1190000039270533

    • 音视频同步的做法

      • https://zhuanlan.zhihu.com/p/51924640



    • AudioTrack与MediaPlayer的对比

      • 都用于播放声音,都有Android Java API,AudioTrack的实现原理?

    • AudioTrack只能播放已经解码的PCM裸流

    • MediaPlayer可以播放多种格式的音频,比如mp3、aac、wav、midi等,它会在framework层创建对应的解码器,解码成pcm后再利用AudioTrack播放

    • MediaPlayer会创建AudioTrack,把解码后的pcm给AudioTrack,AudioTrack再给AudioFlinger进行混音,然后给硬件播放。

    • 还有个SoundPool

      • MediaPlayer适合在后台长时间播放本地音乐文件或在线的流式资源

    • SoundPool适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等,可以同时播放多个音频

    • AudioTrack更接近底层,支持低延迟播放,适合流媒体和语音通话场景

    • Native层用的opensl或oboe

    • AudioFlinger

      • AudioFlinger和AudioPolicyService是Android音频系统的两大基本服务。AudioPolicyService是音频系统策略大制定者,负责音频设备切换的策略抉择、音量调节策略等;AudioFlinger是音频系统策略的执行者,负责音频流设备的管理及音频流数据的处理传输,包括重采样、混音、音量调节、音效处理、start、stop、pause等,所以 AudioFlinger 也被认为是 Android 音频系统的引擎。

    • 【Android音频好文】https://blog.csdn.net/zyuanyun/article/details/60890534

    • MediaRecorder和AudioRecord的对比

      • 都用于录制音频

    • AudioRecord录制的是PCM裸数据,需要AudioTrack播放

    • MediaRecorder录制的音频是经过压缩后的,需要设置编码器,录制的音频文件可以直接播放

    • MediaRecorder录制音频时会先创建AudioRecord进行录制,然后再使用编码器编码

    • MediaCodec

      • 用途:音视频编解码

    • 原理如图:Codec模块不停的从输入缓冲区拿数据做处理,处理完毕后把数据吐到输出缓冲区。

    • 状态图

    • 流程

      • 创建MediaCodec对象

    • 配置MediaCodec

    • 不停的循环

    • 如果输入缓冲区就绪,拿到一块输入缓冲区,把数据送到输入缓冲区中

    • 如果输出缓冲区就绪,拿到输出缓冲区,把数据从输出缓冲区中拷贝出来

    • 释放MediaCodec对象

    • Q&A

      • 6.0以上基本可以解码4路,以下有2路有1路的

      • 最多能解码几路?怎么优化?快速seek。

    • SE以上4路,以下2路

    • 视频用硬解,音频软解

    • 快速seek

      • 提前做缓存,前M后N张纹理

    • 判断seek频率,如果较快时,直接调用seek到I帧,只解码IDR帧

    • 如果同一文件,只起一路解码器?

    • https://www.cnblogs.com/renhui/p/7478527.html

    • https://www.jianshu.com/p/7cdf5b495ada

    • 声音或者视频慢的解决办法

      • 声音慢:让视频帧再多显示一会

    • 视频慢:丢视频帧

    • 介绍Opengl渲染管线流程和各个步骤的工作【https://blog.csdn.net/zhaotianyu950323/article/details/79955805 这个不错】

    • https://learnopengl-cn.readthedocs.io/zh/latest/【好资料】

    • 纹理

      • 可以理解为纹理就是一张贴纸画布,这个纹理可以用来存储大量的数据,可以将数据发送到着色器上。

      • 什么是纹理

    • Texture中环绕方式有几种可选,都是什么效果

      • 纹理环绕方式(当纹理坐标超出默认范围时,每个选项都有不同的视觉效果输出)

    • GL_REPEAT 默认行为,重复纹理图像

    • GL_MIRRORED_REPEAT 和REPEAT一样,但每次重复都是镜像放置

    • GL_CLAMP_TO_EDGE 纹理坐标会约束在0-1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果

    • GL_CLAMP_TO_BORDER 超出的坐标为用户指定的边缘颜色

    • 纹理过滤方式

      • 纹理过滤(纹理坐标不依赖于分辨率,OpenGL需要知道怎样将纹理像素映射到纹理坐标。当一个很大的物体但是纹理的分辨率很低,过滤方式很重要)

    • GL_NEAREST(邻近过滤)选择中心点最接近纹理坐标的那个像素

    • GL_LINEAR(线性过滤)基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些像素之间的颜色

    • https://zhuanlan.zhihu.com/p/143377682

    • https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/06%20Textures/

    • 几个概念

      • 光栅化:也叫栅格化或像素化,就是把矢量图形转化成像素点的过程。

    • 渲染管线:渲染过程中从几何体到最终渲染图像、数据传输处理的过程。实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。

    • https://positiveczp.github.io/%E7%BB%86%E8%AF%B4%E5%9B%BE%E5%BD%A2%E5%AD%A6%E6%B8%B2%E6%9F%93%E7%AE%A1%E7%BA%BF.html

    那什么是光栅化呢?首先我们需要明白一个概念,就是计算机只能处理离散的数据,而我们现实世界都是连续的,所以如何将我们输入的连续数据进行离散化呢?答案就是光栅化!
    其实光栅化就是个离散化的过程,现在一般都是硬件来处理的,效率很高!我们通过光栅化得到了离散的片段或像素后,那到底该像素显示什么颜色呢?
    答案就是用着色器来控制像素的颜色!着色器可以理解为上色,好比你画画,你需要给画图上各种颜色,着色器道理也是一样的!只不过它可以用来控制GPU的着色效果,实现屏幕上各种酷炫的效果!

    • 着色器:先打线稿,再上色

      • 顶点着色器:如何打线稿,如何处理顶点等数据

    • 片元着色器:如何上色,如何处理光、阴影、遮挡、环境等对物体表面的影响,最终生成一幅图像。

    • 说出FrameBuffer的用处,如何渲染到纹理

      • FrameBuffer Object,称为FBO,通常用作离屏渲染。

    • 可将FBO和texture绑定,fbo像画板,texture像画纸,在上面画东西后,texture上自然就有了数据。

    • FBO 本身不能用于渲染,只有添加了纹理或者渲染缓冲区之后才能作为渲染目标,它仅且提供了 3 个附着(Attachment),分别是颜色附着、深度附着和模板附着。

    • 说出几个GLSL中常用类型和限定符

      • GLSL,在我们普通人理解就是一个用于写shader的语言,称为着色器语言。

    • 数据类型:int、float、double、uint、bool、vector、matrix

    • 输入和输出:in和out关键字

    // vertex shader#version 330 core
    layout (location = 0) in vec3 aPos; // 位置变量的属性位置值为0out vec4 vertexColor; // 为片段着色器指定一个颜色输出void main(){gl_Position = vec4(aPos, 1.0); // 注意我们如何把一个vec3作为vec4的构造器的参数vertexColor = vec4(0.5, 0.0, 0.0, 1.0); // 把输出变量设置为暗红色}
    // fragment shader#version 330 coreout vec4 FragColor;in vec4 vertexColor; // 从顶点着色器传来的输入变量(名称相同、类型相同)void main(){FragColor = vertexColor;}


    • uniform:一种从CPU向GPU传递数据的方式,uniform是全局的,如果fragment里有个uniform变量,不需要通过vertexshader作为中介,直接就可以传递数据。存储着色器需要等各种数据,如变换矩阵、光参数和颜色等。uniform 变量存储在常量存储区,因此限制了 uniform 变量的个数,OpenGL ES 2.0 也规定了所有实现应该支持的最大顶点着色器 uniform 变量个数不能少于 128 个,最大的片元着色器 uniform 变量个数不能少于 16 个。

    • samplers:一种特殊的uniform,用于呈现纹理,可用于顶点着色器和片元着色器。

    • const:编译时常量

    • attribute:只用于顶点着色器中,存储每个顶点的信息,比如坐标、法向量、纹理坐标和颜色等。

    • varying:由顶点着色器传递给片段着色器中的插值数据。两个shader拥有相同的varying字段。

    • 精度限定符:highp、mediump、lowp

    • https://colin1994.github.io/2017/11/11/OpenGLES-Lesson04/

    • GLContext是否可以进行共享?如何实现

      • 可以共享,直接创建sharedcontext就行,创建第二个GLContext时,把第一个GLContext传入进去。

    • VAO、VBO、EBO、FBO、PBO、TBO、UBO都是啥

      • VBO:Vertex Buffer Object,顶点缓冲区对象

      • VBO、EBO

    • EBO:Element Buffer Object,图元索引缓冲区对象

    • 这两个其实都是Buffer,都是通过glGenBuffers生成的,只是按照用途的不同称呼

    • 2.0中,用于绘制的顶点数组首先保存在CPU内存中,glDrawArrays时需要将数据从CPU传到GPU中,没必要每次绘制的时候都去拷贝,可以提前在GPU中缓存这块数据。

    • 3.0中,引入了VBO、EBO,用于提前在GPU中开辟一块内存,来缓存顶点数据或者图元索引数据,减少CPU和GPU间的数据拷贝。

    • VAO:Vertex Array Object,顶点数组对象,用于管理VBO或EBO,减少glBindBuffer、glEnableVertexAttribArray等操作


    // 是不是精简了很多?glUseProgram(m_ProgramObj);glBindVertexArray(m_VaoId);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void *)0);

    • UBO:Uniform Buffer Object,装载Uniform变量数据的缓冲区对象。

    • FBO:Frame Buffer Object,帧缓冲区对象。FBO 本身不能用于渲染,只有添加了纹理或者渲染缓冲区之后才能作为渲染目标,它仅且提供了 3 个附着(Attachment),分别是颜色附着、深度附着和模板附着。

    • RBO:Render Buffer Object,渲染缓冲区对象,2D图像缓冲区,可用作FBO中的颜色、深度、模版附着。

    • TBO:Texture Buffer Object,Android API >= 24,纹理缓冲区对象。

    • PBO:Pixel Buffer Object,像素缓冲区对象,主要用于异步像素传输操作,用于像素传输,不连接到纹理,与FBO无关。可用于GPU的缓存间快速传递像素数据,不影响CPU时钟周期。

    • https://juejin.cn/post/6915341825515454478

    • glDrawElements和glDrawArrays区别

      • glDrawArrays指定的数据是最终的真实数据,绘制时效能更好。

    • glDrawElements指定的是真实数据的索引,如果很多顶点被重复使用,可以采用索引的方式,避免重复。

    • 如果画的图形较少或图形虽多但很多相同,可采用glDrawArrays更节省数据占用的空间;如果图形多,而且形状大不相同的时候,可以优先考虑采用glDrawElements函数。

    • https://blog.csdn.net/leon_zeng0/article/details/89291860

    • 如何render to texture

      • 拿到一个FBO,FBO绑定一个texture,然后把src 纹理画上去,就完成了RTT的需求。

    • texture和framebuffer,是否必须要一一对应

      • 不需要一一对应,是绑定的关系,可以将某一texture绑定到某一framebuffer上。

    • 绘制模式

      • GL_LINES

    • GL_LINE_LOOP

    • GL_LINE_STRIP

    • GL_POINTS

    • GL_TRIANGLES

    • GL_TRIANGLE_STRIP

    • GL_TRIANGLE_FAN

    • 坐标系统

      • 局部空间:对象所在的坐标空间。

    • 世界空间:世界空间的坐标是指顶点相对于世界的坐标。物体变换到的最终空间就是世界坐标系,将世界中的物体分散开来。

    • 观察空间:也称为摄像机空间,将对象的世界空间的坐标转换为观察者视野前面的坐标。

    • 裁剪空间:opengl的坐标会落在一个范围内,超过这个范围的点都会被裁剪掉,将顶点坐标从观察空间转换到裁剪空间,需要Projection Matrix。

    • 屏幕空间:换个坐标系。

    • 都可使用glm

    • https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/08%20Coordinate%20Systems/

    • 简单实现灰度效果的 frament shader

      • float luminance  = 0.2125*col.r+0.7154*col.g+0.0721*col.b;

    • 然后rgb分量都变成luminance,出来都就是灰度图

    • 三分屏效果 frament shader 实现【https://juejin.cn/post/6860646728568143879

      • 就是动一动y坐标x坐标的事

    • GLContext是什么

      • opengl的上下文,存储此opengl关联的所有状态。glcontext是线程局部变量,每个进程有多个线程,每个线程都有自己独立的上下文。

    • 不同上下文在多个线程中进行渲染,需要注意什么

      • 它们需要是shared context,只有这样,才可以共享纹理等。

    • 某个fbo创建和销毁都要在同一个线程,跨线程会有gl内存泄漏。

    • opengl是?egl是?

      • opengl是个操作GPU的API,它通过驱动向GPU发送相关指令,控制图形渲染管线状态机的运行状态,但当涉及到与本地窗口系统交互时,需要一个中间层,这个中间层就是EGL,作为OpenGL和窗口系统之间的桥梁。【Android是EGL,iOS是EAGL】

    • EGL可以

      • 与设备原生窗口通信

    • 查询绘制surface的可用类型和配置

    • 创建绘制surface

    • 渲染

    • 管理纹理等渲染资源

    • 为什么要有YUV这种数据出来?(YUV相比RGB来说的优点)

      • 相比于rgb,能够节省内存空间

    • 解决与黑白电视机等兼容问题,使黑白电视机也能接受彩色电视信号,Y和UV分离,Y是亮度,UV是色度。

    • https://zhuanlan.zhihu.com/p/75735751

    • 说一下ffmpeg?

      • 开源程序,主要功能有音视频采集、转码、滤镜、编解码、裁剪、播放等等。

    • H264/H265有什么区别?

      • 都是编码协议,h265是h264的升级版。

    • h264每个宏块是固定的16x16像素,h265从8x8到64x64都有。

    • 帧内预测模式h264支持8种,h265支持33种,提供了更好的运动补偿处理和矢量预测方法。

    • 相同图像质量下,h265视频大小较h264的大小减少大于39%-44%。

    • 平常的视频格式?

      • mp4、mov、wmv、flv、avi

    • 视频或者音频传输,你会选择TCP协议还是UDP协议?为什么?

      • 各种传输协议之间的区别,见https://zhuanlan.zhihu.com/p/27442401

    • 何为直播?何为点播?

      • 直播:实时。

    • 点播:提前录制好的,可随时观看。

    • 简述推流、拉流的工作流程?

      • https://cloud.tencent.com/developer/news/122941



    • 直播推流中推I帧与推非I帧区别是什么?

      • https://www.dnsdizhi.com/224.html

    • 常见的直播协议有哪些?之间有什么区别?

      • RTMP FLV HLS ARTC

    • https://help.aliyun.com/document_detail/49785.html

    • 点播中常见的数据传输协议主要有哪些?

      • MP4 HLS FLV

    • https://blog.csdn.net/MillerKevin/article/details/80100839

    • 简述RTMP协议,如何封装RTMP包?

      • https://juejin.cn/post/6956240080214327303

    • m3u8构成是?直播中m3u8、ts如何实时更新?

      • https://www.jianshu.com/p/e97f6555a070

    • 何为音视频同步,音视频同步是什么标准?

      • 就是视频和音频要对应的上,比如电视剧声音和嘴形需要匹配(排除演员念123456的情况)

    • 标准:以视频为主、以音频为主(主流方案)、以外部时钟为主

    • 播放器暂停、快进快退、seek、逐帧、变速怎么实现?

    • 说说你平时在播放过程中做的优化工作?

    • 视频编码标准两大系统是什么?

      • ITU-T:国际电信联盟,h.264,h.265等

    • ISO:国际标准化组织,MPEG-1,MPEG-2,MPEG-4等

    • 什么是音视频编码格式?什么是音视频封装格式?

      • h264、mp3、aac就是编码格式

    • mp4、rmvb、flv就是封装格式

    • 平时说的软解和硬解,具体是什么?

      • 软解:CPU解码

    • 硬解:GPU解码

    • openGL渲染模式

      • 立即渲染模式:使用简单,但是效率低

    • 核心模式:使用困难,效率高,灵活性高,对开发者的要求也高,需要更深入的理解图形编程。

    • 纹理的大小可以动态改变吗

    • MediaCodec连环炮:MediaCodec报错,只有错误码,没有任何其它信息,如何解决?使用MediaCodec遇到了哪些问题?同步使用和异步使用有什么区别?

    • 如何计算音频帧,一帧音频帧有多大

      • 音频帧其实概念没那么清晰,音频帧可以理解为采样了一次,帧大小是指每帧的采样数

    • 每帧的持续时间 frametime = samplesize / samplerate * 1000

    • 采样数1152,采样率为44100HZ的音频长度为1152 / 44100 * 1000 = 26ms

    • Surface和SurfaceTexture区别

      • https://www.jianshu.com/p/4eff3913628a

    • SurfaceView和TextureView区别

      • SurfaceView:可以在子线程中更新UI的View,且不影响主线程。但和常规View不同,它没有动画或者变形等特效。

    • GLSurfaceView:比SurfaceView多了个GL环境,无需自己swapBuffer。

    • SurfaceTexture:相机中得到的数据可以画到SurfaceTexture中的外部纹理上,方便对外部纹理进行二次处理。

    • TextureView:可以进行平移缩放等操作,必须开启硬件加速,但是没法自己拿纹理进行自定义绘制。

    无法复制加载中的内容

    • OpenGL ES相关问题,MVP矩阵左乘和右乘有什么区别,什么是外部纹理,为什么叫外部。

      • Android的MediaPlayer和Camera数据能转纹理显示,这就需要OES纹理。OES可以跨越GL环境传递纹理数据,通过OES纹理可以创建SurfaceTexture。

    • OpenGL如何渲染一个View

      • 通过EGL。

    • blend

      • 可以通过blend开启混合效果,完成一定透明度的混合。

    • 帧内预测,帧间预测

      • 帧内预测:解决的是空域数据冗余问题,一幅图中有很多肉眼很难察觉的数据,可以认为这些是冗余数据,直接压缩掉。

    • 帧间预测:解决的是时域数据冗余问题,一段时间内捕捉的数据没有较大的变化,可以针对这一时间内相同的数据做压缩,叫时域数据压缩。

    • glUseProgram和glBindFramebuffer这玩意有顺序要求吗?

      • 貌似没啥顺序,glUseProgram是在更新uniform等之前调用,因为它是在当前激活等着色器程序中设置的。如果当前没有program的情况下调用glUniform之类的函数,会报错。

    • 其他(上面的链接里都介绍过)

      • FLV封装

    • FLV的组成

    • FLV怎么获取sps,pps

    • 如何获取onMetaData,并解析metadata

    • TS封装

    • TS封装的第一个字节是什么,一个TS数据是多少?

    • TS的组成?

    • TS的内容通过什么标识的?

    • HLS HTTP Live Streaming

    • HLS是依靠什么工作的?

    • HLS点播和直播的区别?

    • m3u8有哪些字段和含义?

    • udp质量控制

    • 如何控制udp的传输质量

    • RTSP Real Time Streaming Protocol

    • rtsp包含哪些方法,rtsp的流程

    • RTMP Real Time Messaging Protocol

    • rtmp是可靠的传输协议吗?

    • rtmp一般采用那种封装格式?

    • rtmp的握手流程

    资料推荐

    • 好文:https://juejin.cn/post/6844903463051247629

    • Android音视频专栏:https://www.cnblogs.com/renhui/p/7452572.html

    • MediaCodec https://www.jianshu.com/p/f5a1c9318524

    • iOS https://www.jianshu.com/p/5d555aa55ea1

    • 音视频技能图谱:https://codechina.gitcode.host/developer-roadmap/av/intro/

    • 雷神学习资料:https://blog.csdn.net/leixiaohua1020/article/details/15811977

    • 分离h264成多个NALU:https://blog.csdn.net/leixiaohua1020/article/details/50534369

    • AAC分离成多个ADTS,同步字为0xFFF(二进制“111111111111”)

    https://blog.csdn.net/leixiaohua1020/article/details/50535042

    • 音视频编解码学习列表:https://blog.csdn.net/leixiaohua1020/article/details/17934487

    • 字节播放器技术分享:https://zhuanlan.zhihu.com/p/51371354

    • 开发小白到音视频专家:https://zhuanlan.zhihu.com/p/31650105

    • Android音视频之路:https://zhuanlan.zhihu.com/p/28518637

    • 音视频技术社区:https://www.zhihu.com/column/c_1281633204223877120

    • 视频处理:https://zhuanlan.zhihu.com/p/231577193

    • 音频处理:https://zhuanlan.zhihu.com/p/248659886

    • 视频压缩与编解码原理:https://zhuanlan.zhihu.com/p/67305755

    • h264基本原理:https://zhuanlan.zhihu.com/p/257179183

    • mp4:https://www.cnblogs.com/chyingp/p/mp4-file-format.html

    • ffmpeg视频学习:https://www.bilibili.com/video/BV1bT4y1w78z?p=2

    • 字节流动:https://github.com/githubhaohao/LearnFFmpeg

    • 开源项目【资料整理]:https://github.com/0voice/audio_video_streaming

    • 转场:https://gl-transitions.com/editor/polar_function

      • https://www.shadertoy.com/

    • 调试shader的软件:KodeLife



    往期推荐



    2021程序喵技术年货

    【性能优化】lock-free在召回引擎中的实现

    定下来了!

    SDK开发的一些思考

    Linux中对【库函数】的调用进行跟踪的 3 种【插桩】技巧

    【线上问题】P1级公司故障,年终奖不保

    防御性编程技巧

    C++的全链路追踪方案,稍微有点高端

    喵哥吐血整理:软件开发的51条建议

    函数返回值的行业潜规则



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存