Android中高级进阶开发面试题冲刺合集(七)

以下主要针对往期收录的面试题进行一个分类归纳整理,方便大家统一回顾和参考。本篇是第七集~

强调一下:因篇幅问题:文中只放部分内容,全部面试开发文档需要的可在公众号获取。

第一篇面试题在这: Android中高级进阶开发面试题冲刺合集(一)

第二篇面试题在这: Android中高级进阶开发面试题冲刺合集(二)

第三篇面试题在这: Android中高级进阶开发面试题冲刺合集(三)

第四篇面试题在这: Android中高级进阶开发面试题冲刺合集(四)

第五篇面试题在这: Android中高级进阶开发面试题冲刺合集(五)

第六篇面试题在这: Android中高级进阶开发面试题冲刺合集(六)

音视频开发面试题

1.为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?

参考答案:

  • 1)空间冗余:图像相邻像素之间有较强的相关性
  • 2)时间冗余:视频序列的相邻图像之间内容相似
  • 3)编码冗余:不同像素值出现的概率不同
  • 4)视觉冗余:人的视觉系统对某些细节不敏感
  • 5)知识冗余:规律性的结构可由先验知识和背景知识得到

2.怎么做到直播秒开优化?

参考答案:

  • DNS 解析慢 为了有效降低 DNS 解析对首开的影响,我们可以提前完成播放域名->IP 地址的解析, 并缓存起来,播放的时候,直接传入带 IP 地址的播放地址,从而省去了 DNS 解析的耗时。 如果要支持用 IP 地址播放,是需要修改底层 ffmpeg 源码的。
  • 播放策略 很多侧重点播的播放器,为了减少卡顿,会有一些缓冲策略,当缓冲足够多的数据之后 ,再送入解码播放。

而为了加快首开效果,需要对播放的缓冲策略做一些调整,如果第一帧还没有渲染出来的情况下, 不要做任何缓冲,直接送入解码器解码播放,这样就可以保证没有任何因为「主动」缓冲带来的首开延时。

  • 播放参数设置 所有基于 ffmpeg 的播放器,都会遇到avformat_find_stream_info这个函数耗时比较久, 从而增大了首开时间,该函数主要作用是通过读取一定字节的码流数据, 来分析码流的基本信息,如编码信息、时长、码率、帧率等等,它由两个参数来控制其读取的数据量大小和时长, 一个是 probesize,一个是 analyzeduration。

减少 probesize 和 analyzeduration 可以有效地减少avformat_find_stream_info的函数耗时, 从而加快首开,但是需要注意的是,设置地太小可能会导致读取的数据量不足,从而无法解析出码流信息,导致播放失败, 或者出现只有音频没有视频,只有视频没有音频的问题。

  • 服务端优化
  • 服务器关键帧缓冲
  • CDN最近策略

3.直方图在图像处理里面最重要的作用是什么?

参考答案:

  1. 灰度直方图的定义:灰度级的函数,描述图像中该灰度级的像素个数或该灰度级像素出现的频率。反映了图像灰度分布的情况。
  2. 灰度直方图只能反映图像的灰度分布情况,不能反映图像像素的位置,即所有的空间信息全部丢失。
  • 直方图的应用:
  • a.数字化参数:判断一幅图像是否合理的利用了全部被允许的灰度级范围。一般一幅图应该利用全部或几乎全部可能的灰度级,否则等于增加了量化间隔,丢失的信息将不能恢复。
  • b.边界阈值选取(确定图像二值化的阈值):假定某图像的灰度直方图具有二峰性,则表明这个图像的较亮区域和较暗区域可以很好地分离,以这一点为阈值点,可以得到很好地2值处理效果(区分物体与背景)。
  • c.当物体部分的灰度值比其他部分的灰度值大时,可利用直方图统计图像中物体的面积。
  • d.计算图像的信息量H。

4.说一说ffmpeg的数据结构?

参考答案:

ffmpeg的数据结构可以分为以下几类:
Android中高级进阶开发面试题冲刺合集(七)_第1张图片

  • (1)解协议(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。 URLProtocol存储输入音视频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)

  • (2)解封装(flv,avi,rmvb,mp4) AVFormatContext主要存储视音频封装格式中包含的信息 ffmpeg支持各种各样的音视频输入和输出文件格式(例如FLV, MKV, MP4, AVI),而 AVInputFormat和AVOutputFormat 结构体则保存了这些格式的信息和一些常规设置。

  • (3)解码(h264,mpeg2,aac,mp3) AVStream是存储每一个视频/音频流信息的结构体。 AVCodecContext: 编解码器上下文结构体,存储该视频/音频流使用解码方式的相关数据。 AVCodec: 每种视频(音频)编解码器(例如H.264解码器)对应一 个该结构体。

    三者的关系如下图:
    Android中高级进阶开发面试题冲刺合集(七)_第2张图片

  • (4)存数据 对于视频,每个结构一般是存一帧;音频可能有好几帧

    • 解码前数据:AVPacket
    • 解码后数据:AVFrame

5

你可能感兴趣的:(android,面试,性能优化,Android进阶,音视频)