UI动画专项聊完,进入音视频专项。音视频是资深岗高薪方向——腾讯微视、腾讯会议、微信视频号都涉及大量音视频技术。面试需要理解编码原理、采集流程、音频处理、实时通信。纯应用层经验不够,需要往底层和协议层延伸。今天8道题覆盖四大方向。
Q1:MediaCodec硬编解码原理?跟软编解码区别?
MediaCodec:Android系统提供的硬件加速编解码器。调用GPU/DSP专用电路做编解码,CPU几乎不参与。
硬编解码优势:性能高(1080p 60fps实时编码无压力)、功耗低(专用电路比CPU效率高数倍)、延迟低。
软编解码:用FFmpeg/x264等纯CPU编解码。优势是兼容性好(不依赖硬件实现)、编码质量可控(码率控制更精细)、支持更多格式。缺点是CPU占用高、功耗大。
MediaCodec流程:createEncoderByType("video/avc") → configure配置参数 → start() → 循环:dequeueInputBuffer填充YUV → queueInputBuffer送入 → dequeueOutputBuffer拿H.264数据。
追问:MediaCodec的同步和异步模式?同步模式用dequeueInput/OutputBuffer轮询(简单但效率低),异步模式设Callback回调(高效但代码复杂)。实时编码推荐异步模式。
Q2:CameraX和Camera2区别?什么时候用哪个?
Camera2(Android 5.0+):底层API,完全控制Camera硬件。手动配置曝光、对焦、白平衡、帧率。灵活但复杂——一个简单的拍照功能要写几百行代码处理状态机。
CameraX(Jetpack库):在Camera2上封装的高层API。用例驱动设计——Preview(预览)、ImageCapture(拍照)、ImageAnalysis(帧分析)、VideoCapture(录像)。生命周期感知(自动跟Activity/Fragment绑定)。代码量是Camera2的1/5。
选择:普通拍照/扫码/人脸检测用CameraX。需要深度控制Camera参数(专业相机App、自定义3A算法)用Camera2。
追问:CameraX的ImageAnalysis怎么用?设置ImageAnalysis.setAnalyzer(executor, analyzer),analyzer的analyze(ImageProxy)回调每帧YUV数据。可以做实时人脸检测、二维码识别、美颜处理。处理完必须调imageProxy.close()否则后续帧不会来。
Q3:AudioRecord和MediaRecorder区别?音频采集流程?
MediaRecorder:高层API,录制音视频一体(Camera+Mic→MP4文件)。一行代码搞定录制。缺点是不能获取原始音频数据——直接输出编码后的文件。
AudioRecord:底层API,获取原始PCM音频数据。适合需要实时处理音频的场景(语音识别、降噪、变声、实时传输)。
AudioRecord流程:getMinBufferSize算buffer → new AudioRecord(MIC, sampleRate, channelConfig, audioFormat, bufferSize) → startRecording() → 循环read(buffer)读PCM → 处理(编码/降噪/传输) → stop()+release()。
追问:音频采样率选多少?电话8kHz够用,语音识别16kHz,音乐CD质量44.1kHz。更高的采样率数据量更大但不一定听得出差别。
Q4:WebRTC在Android怎么用?核心组件有哪些?
WebRTC:Google开源实时通信框架,支持音视频通话和数据传输。
核心组件:PeerConnection管理音视频流和数据通道,内部处理ICE打洞+DTLS加密+SRTP媒体加密。MediaStream封装本地Camera+Mic数据发送。DataChannel点对点数据通道,低延迟不保证顺序。
ICE/STUN/TURN:NAT穿透方案。STUN发现公网IP,TURN打洞失败时中继转发。
Q5:视频编码的I帧、P帧、B帧区别?
I帧(Intra/关键帧):完整帧,不依赖其他帧可独立解码。体积最大。GOP(Group of Pictures)的起始帧。
P帧(Predictive):参考前面的I帧或P帧,只编码差异部分。体积是I帧的1/5-1/10。
B帧(Bi-predictive):参考前后两个帧做双向预测。压缩率最高但编码复杂度高、延迟大(需要后面的帧先编码)。
实际应用:直播场景通常不用B帧(低延迟优先)。录播场景可以用B帧(追求高压缩率)。GOP大小影响seek精度和码率——GOP小seek准但码率高(I帧多),GOP大码率低但seek不准。
追问:H.264和HEVC(H.265)区别?HEVC压缩率比H.264高40-50%(同画质文件小一半),但编码复杂度高2-3倍。移动端HEVC硬编解码已广泛支持(Android 5.0+大部分芯片)。Apple力推HEVC,直播行业正在迁移。
Q6:音视频同步怎么做?
音视频不同步是最常见的体验问题——嘴巴动了声音没来或反过来。
时间戳同步:音频和视频各自有PTS(Presentation Time Stamp),播放时按PTS对齐。音频时钟作为主时钟(人耳对音频延迟比视觉更敏感),视频根据音频时钟调整播放节奏。
视频追音频:视频PTS比音频PTS大(视频落后),加速播放视频或丢帧追赶。
音频追视频:视频PTS比音频PTS大(音频落后),暂停视频等音频或重复播放当前视频帧。
Android实现:MediaSync/MediaClock管理音视频同步。ExoPlayer内部用DefaultAudioSink的时间戳做主时钟,视频渲染器根据音频时钟调整帧输出。
Q7:ExoPlayer架构?跟MediaPlayer区别?
ExoPlayer(Google推荐,现改名Media3):可定制的播放器框架。支持DASH/HLS/SmoothStreaming自适应流、DRM数字版权管理、自定义数据源和渲染器。
跟MediaPlayer区别:MediaPlayer是系统内置黑盒,功能固定不支持流媒体协议。ExoPlayer模块化设计——DataSource(数据源)→ Extractor(解封装)→ Decoder(解码)→ Renderer(渲染),每个环节可替换。
架构核心:ExoPlayerImpl协调各组件,TrackSelector选择轨道(多音轨/多字幕),LoadControl控制缓冲策略,RenderersFactory创建渲染器。
追问:ExoPlayer怎么做预加载?LoadControl的setBufferForPlaybackMs(1500)缓冲到1.5秒起播,后台继续缓冲到2.5秒。首帧秒开关键是预加载和缓冲策略调优。
Q8:直播推流怎么做?RTMP和WebRTC区别?
RTMP:TCP协议的直播推流标准。延迟1-3秒。流程:Camera采集→MediaCodec编码H.264→AAC音频编码→FLV封装→RTMP推流到CDN。CDN转码后分发HLS/FLV给观众。
WebRTC:UDP协议的实时通信。延迟<500ms。适合连麦互动、视频会议。不支持大规模分发(P2P模式),需要SFU/MCU服务器做多人转发。
选择:普通直播(一个主播对万观众)用RTMP推流+HLS/FLV拉流。互动直播(连麦/PK)用WebRTC低延迟通信。混合模式:主播间用WebRTC连麦,观众端用RTMP/HLS观看。
面试Tips:音视频专项考底层原理+实战。MediaCodec编解码流程必考、CameraX vs Camera2必考、WebRTC核心组件必考。编码原理(I/P/B帧)和音视频同步考深度。有直播推流或视频通话项目经验比背理论值钱十倍。
下一篇进入跨平台专项,Flutter渲染管线原理?Dart FFI怎么用?React Native新架构Fabric?小程序容器怎么实现?
做过音视频开发的同学评论区报到,MediaCodec踩过最大的坑是什么?
本系列连载中,关注不迷路,下一篇:腾讯高级Android(跨平台专项)面试真题
系列简介:Android大厂面经连载,覆盖字节跳动、腾讯、阿里、美团等40+企业,从初级到架构师全岗位覆盖。每篇文章包含真实面试题+详细答案+代码示例,帮你拿到大厂Offer。