Android面试题——掘金-音视频之音视频处理(9.6)

一 概述

1
2
3
4
5
1.视频前处理的常见场景?如降噪、美颜、滤镜?
2.如何降低视频延迟?推流端 vs 播放端?
3.如何进行音频降噪(Noise Suppression)?
4.如何压缩录制的视频?有哪些算法?
5.Android 中如何监控音视频性能(帧率、耗时等)?

二 音视频处理

2.1 视频前处理的常见场景?如降噪、美颜、滤镜?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
一、概念
视频前处理是指在编码/推流前对原始图像进行处理的过程,
常见于直播、拍摄、美颜类 App 中,主要场景包括:

二、常见视频前处理场景:
2.1 美颜磨皮
-平滑皮肤、祛痘、美白等
-常用算法:双边滤波、高斯模糊、SkinDetect + LUT

2.2 滤镜效果
-调整色调、对比度、曝光、胶片风格等
-实现方式:LUT(查找表)、GPU Shader(GLSL)

2.3 降噪处理
-去除图像噪点,提升画质
-算法:时域+空域降噪、3D 降噪

2.4 美型/瘦脸/大眼
-基于人脸关键点(如 106 点)变形矫正
-实现:图像 mesh 变形(Vertex Shader)

2.5 虚化背景
-类似人像模式,突出前景
-实现:人像分割+背景模糊(OpenGL/AI)

2.6 水印/贴纸/字幕
-添加动态贴纸、文字、图片水印
-实现:OpenGL 图层合成、Canvas 绘制

三、实现方式:
-多数通过 GPU/OpenGL ES + GLSL 着色器 实现实时处理;
-高级效果使用 AI 人脸识别/语义分割模型;
-常见框架:FaceUnity、SenseTime、Agora Video SDK、GPUImage、RenderScript(过时)。

四、总结:
视频前处理提升用户视觉体验,是视频类应用的核心功能之一,尤其在直播、电商、短视频场景中广泛使用。
一般结合 GPU 实现实时渲染、低延迟、高性能处理。

2.2 如何降低视频延迟?推流端 vs 播放端?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
降低视频延迟是直播和实时视频应用中的重要目标,推流端和播放端的优化策略有所不同。

一、推流端降低延迟的策略:
1.1 编码设置优化
-使用低延迟编码器(如 H.264 的 libx264,H.265 的 x265);
-设置低延迟模式(如 ultrafast 编码预设、降低 GOP(组帧)大小)。

1.2 调整缓冲区大小
-减少音视频缓冲区大小,避免过多的缓存等待。

1.3 实时推流协议
-使用 RTMP 或 WebRTC 等低延迟协议,避免 HLS 等拉流协议的高延迟。

1.4 网络优化
使用 CDN(内容分发网络)加速推流,降低网络波动对延迟的影响。

1.5 硬件加速
-使用硬件编码(如 MediaCodec 或硬件编码器)来加速视频编码,减少 CPU 负担,提高效率。

二、播放端降低延迟的策略:
2.1 选择低延迟播放器
-使用 ExoPlayer 或 IjkPlayer 等支持低延迟播放的播放器,优化缓冲策略。

2.2 合理设置缓冲策略
-控制播放器的缓冲区大小,避免过多缓冲导致播放延迟。
-使用 低延迟模式(如 ExoPlayer 的 LIVE 模式)。

2.3 选择合适的流协议
-使用支持低延迟播放的协议(如 WebRTC、RTMP),避免 HLS 或 DASH 等长延迟协议。

2.4 网络优化
-优化网络状况,选择较低延迟的 CDN,避免高延迟的网络路径。

3.总结:
-推流端 通过优化编码、推流协议和网络连接来减少延迟。
-播放端 通过合理的缓冲策略、低延迟播放器和流协议选择来减少播放延迟。

2.3 如何进行音频降噪(Noise Suppression)?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
音频降噪(Noise Suppression)是指在音频信号中去除不必要的噪声,以提高语音或音乐的清晰度。
常见的音频降噪方法如下:

一、 常见音频降噪技术:
1.1 频谱减法(Spectral Subtraction)
-基于频谱分析,估算并去除噪声频率成分。
-适用于稳定背景噪声的去除,如风噪、机械噪音。

1.2 Wiener 滤波
-使用信噪比(SNR)来动态调整噪声估计,保留语音信号的同时抑制噪声。
-适用于语音信号中的动态噪声环境。

1.3 深度学习(Deep Learning)
-使用神经网络(如卷积神经网络、LSTM)进行噪声抑制,能更智能地识别并去除复杂的噪声类型。
-适用于复杂噪声环境下的降噪。

1.4 自适应滤波(Adaptive Filtering)
-根据输入信号和噪声的变化,动态调整滤波器参数,从而实现实时降噪。
-常用于实时通信中的降噪,如电话和视频通话。

1.5 回声消除(Echo Cancellation)
通过估算和去除回声(如电话中的回音)来提高语音质量。

二、常用工具与库:
-WebRTC 提供了高效的 Noise Suppression 和 Echo Cancellation 功能,适合实时通信场景。
-SpeexDSP 提供噪声抑制模块,适用于语音信号处理。
-Adobe Audition 和 Audacity 等音频编辑软件支持降噪功能,适用于后期处理。

2.4 如何压缩录制的视频?有哪些算法?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
压缩录制的视频是为了减少视频文件的大小,同时尽量保持视频质量。
常用的压缩算法和方法包括:

一、 常见的视频压缩方法:
1.1 视频编码算法(Video Codec)
-H.264/AVC:最常用的视频编码标准,平衡压缩率和画质,广泛应用于直播、视频会议等。
-H.265/HEVC:
相比 H.264,H.265 提供更高的压缩率(约 50% 的压缩效率提升),适合 4K 视频和高质量视频压缩。
-VP9:Google 推出的开源视频编码标准,提供类似 H.265 的压缩效率,广泛用于 YouTube 等平台。
-AV1:一种新兴的视频编码标准,具有比 H.265 更高的压缩效率,适合未来的 4K/8K 视频压缩。

1.2 帧内和帧间压缩
-帧内压缩(Intra-frame Compression):
对每一帧图像单独进行压缩,减少数据冗余。常见算法有 JPEG 和 PNG。
-帧间压缩(Inter-frame Compression):
利用视频帧之间的相似性进行压缩,只有不同的部分(即 P 帧、B 帧)会被压缩,减少存储空间。

1.3 自适应比特率编码(ABR)
根据网络带宽或存储空间动态调整视频的比特率,平衡压缩率和质量,常用于视频流媒体。

1.4 去冗余压缩(Redundancy Reduction)
利用视频帧中的冗余信息进行去除(如背景和静态场景的部分),从而减小文件大小。

二、常用工具:
-FFmpeg:开源命令行工具,支持多种视频编码格式和压缩选项,适用于批量视频压缩。
-HandBrake:开源视频转码工具,支持多种编码格式的压缩设置。

三、总结:
压缩视频主要依靠高效的视频编码算法(如 H.264、H.265),
结合帧内和帧间压缩等技术,实现高压缩比和良好视频质量。
视频压缩是减少存储和带宽使用的重要手段,广泛应用于流媒体、视频存储和传输等场景。

2.5 Android 中如何监控音视频性能(帧率、耗时等)?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
在 Android 中监控音视频性能(如帧率、耗时等)对于优化应用的性能至关重要。
常见的监控方法包括以下几种:


一、监控音视频性能的方法:
1.1 使用 Choreographer 监控帧率
-Choreographer是Android提供的一个 API,用于同步 UI 绘制和帧率的更新。
通过监听帧的渲染时机,可以计算出每秒钟显示的帧数(FPS)。

示例:
Choreographer.getInstance().postFrameCallback(frameTimeNanos -> {
long elapsedTime = frameTimeNanos - lastFrameTime;
lastFrameTime = frameTimeNanos;
float frameRate = 1000000000.0f / elapsedTime;
});

1.2 自定义测量视频编码解码耗时

使用 System.nanoTime() 或 System.currentTimeMillis()
来记录编码、解码、渲染等过程的时间,帮助分析视频处理流程中的耗时瓶颈。

示例:

long startTime = System.nanoTime();
// 执行视频解码
long endTime = System.nanoTime();
long duration = endTime - startTime; // 耗时(纳秒)

1.3 使用 Log 打印性能数据

在音视频的关键点,如帧的解码、播放、
渲染时使用 Log.d() 打印出每一帧的处理时间、帧率、缓冲等信息,便于调试。

例如,打印每一帧的解码耗时和帧率:
Log.d("VideoPerformance", "Frame decoded in: " + (endTime - startTime) + " ms");
使用 Android Profiler 监控 CPU 和 GPU 使用情况

1.4 Android Studio 提供了 Profiler 工具,
可以实时监控应用的 CPU 使用、GPU 渲染、内存分配等情况。
可以用来分析视频播放或处理过程中的性能瓶颈。

1.5 第三方工具:
-FFmpeg:FFmpeg 可以通过日志输出每个视频处理的时间,帮助分析解码和编码的性能。
-MediaPlayer 和 ExoPlayer 也提供了一些接口用于监听视频的播放状态和缓冲情况。

三 参考

  • 掘金—知识库的大纲