Android 音视频开发总结

01、多媒体基础概念

视频分辨率

•标清、高清、720P…

视频编码

•H.264、H.265…

音频编码

•AAC、MP3、AC3…

视频封装格式

•TS、RMVB 、MKV

多媒体播放组件(Android)

•MediaPlayer、MediaCodec、OMX、Stagefright

视频

分辨率

一帧视频的大小,表示长宽像素个数(720x576, 1280x720, 1920x1080 …)

帧率

每秒钟视频帧数(24/25/30/48/60 FPS)

编码格式

编码:目的是压缩数据量,采用编码算法压缩冗余数据

MPEG(MPEG-2, MPEG-4)

H.26X(H.263, H.264/AVC, H.265/HEVC)

封装格式

•把编码后的音、视频数据以一定格式封装到一个容器

•MKV/AVI/TS …

02、Android平台播放器

多媒体播放器基本组成

组成.jpg

MediaPlayer状态周期

状态周期.gif

MediaPlayer简介

简介.jpg

什么是MediaCodec

在Android中用于访问底层的媒体编解码器的类,是Android底层多媒体基础框架的一部分,通常与MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTrack一起使用

•它本身并不是Codec,它是通过调用底层编解码组件具有Codec能力

•适用的Android版本

•Android 4.1以后的版本(API 16+)

MediaCodec状态

MediaPlayer状态.jpg

MediaCodec解码方式

同步解码

同步解码.png

异步解码(Android5.0后)

异步解码.png

03、常见音视频开发中的问题总结

黑屏

播放过程中黑屏

当播放器遇到不支持的视频格式,或者数据内容/格式异常,则会解码失败,从而导致无解码视频输出

定位:播放器播放时的报错日志,用合适的播放模式播放。数据异常,需要分析码流文件本身,送入解码器的帧数据不完整,H.264 的视频码流,缺失了 SPS,PPS 等必要的信息头,部分 Android 机型硬编出来的数据有额外的 NALU 头

重新起播/进入时黑屏

这时是由于没有渲染出帧,进入时黑屏,可以增加loading动画,直到渲染出首帧,loading动画消失,另外一种是应用退到后台,再回到应界播放界面时黑屏,可以在pause时,保存视频最后播放的帧,重新进来时,看到时之前退出时的画面,等播放器重新缓冲好后,开始画面连续播放

卡顿/卡死

卡顿分网络差,数据跟不上造成的卡顿,还有一种就是画面很慢的变化卡顿。卡死一般是卡住不动

分析:网络差的卡顿,可以在播放器加入数据代理,用于缓存足够多的数据。画面解码卡顿,可以降低清晰度或用其他播放模式播放。卡死,有时是调用某个方法后,一直得不到回调引起,如我们在VLC上发现,stop时,迟迟得不到onStopped状态。导致时间过长无相应ANR

马赛克

马赛克,这里指局部/半局部马赛克,常出现在很高画质视频,给播放器播放出现。如果画面偶尔出现马赛克,通常是数据错误造成的。注意区分

分析:视频帧中主要是一个一个宏块组成,频编码算法以宏块为单位,逐个宏块进行编码,组织成连续的视频码流。解码同样也是。画质越高,压缩越厉害

H.264 有四种画质级别

•Baseline profile

•Extended profile

•Main profile

•High profile

画质越高,对解码能力要求也越高

花屏/绿屏

播放画面出现图像紊乱,像被刮花了一样。大面积的异常颜色的方块图,绿屏或其他颜色现象

丢失参考帧导致, I 帧由于是帧内压缩,因此可以独立解码播放,而 B 帧,一旦丢失了 I 帧或者后面的 P 帧,则会解码失败,而 P 帧一旦丢失了前面的 I/B/P 帧,也会导致解码失败。不要丢弃编码后、解码前的视频帧数据,实在要丢,一次丢一整个 GOP(一个I帧到下一个I帧中间的数据)

GOP.png

音画不同步

遇到log中大量打印“Past duration XXX too large”且伴有frame drop相关信息的打印

分析方法:将输入视频包的时间戳信息打印出来,发现一些视频帧未设置DTS/PTS,这些视频帧携带的时间戳都是默认值为AV_NOPTS_VALUE,代码中对该值的定义如下

•#define AV_NOPTS_VALUE ((int64_t)UINT64_C(0x8000000000000000))

而这些帧在编码输出之前会被Drop掉,为了满足设定的帧率,后面的有效时间戳的帧会提前输出,导致视频提前而音频滞后

解决方法:由于我们为这些未设置时间戳的输入帧填充有效时间戳不是一件很容易的

04、播放方案

1、ExoPlayer

ExoPlayer 是一个Google开源项目,它不属于Android framework,独立于Android SDK

Android支持通过MediaExtractor和MediaCodec实现自定义播放。ExoPlayer介于MediaPlayer和自定义播放器之间的播放器,比MediaPlayer更强的扩展能力

ExoPlayer可以通过进一步扩展来处理多种媒体格式

由于它是内置于app中,所以可以随着app进行升级事(需要结合输入视频是否采用B帧等),因此在输入输出帧率相同时,我们可以将这些携带无效时间戳的帧正常送至编码器编码并输出,而不是丢弃

ExoPlayer优点

•支持 Dynamic Adaptive Streaming over HTTP (DASH) 和SmoothStreaming,更多支持请参阅支持的格式)详细信息页面。

•支持高级 HLS (HTTP Live Streaming)功能,如正确处理 #EXT-X-DISCONTINUITY的标签

•ExoPlayer缺点

•ExoPlayer的音频和视频组件依赖Android的 MediaCodec接口,该接口发布于Android4.1(API 等级16)。因此它不能工作于之前的Android版本

•ExoPlayer

•YouTube(Android平台客户端)使用ExoPlayer

•资料

http://developer.android.com/guide/topics/media/exoplayer.html

https://github.com/google/ExoPlayer

2、Ijkplayer

是基于ffmpeg开源的轻量级视频播放器,跨平台

封装ffplay、MediaPlayer,MediaCodec,ExoPlayer

支持几乎所有视频封装格式

音频AudioTrack,OpenSL ES

Ijkplayer

Ijkplayer.png

Ijkplayer应用

B站和主流直播软件都在使用

资料

https://github.com/Bilibili/ijkplayer

•可以重点关注issue区

3、VLC

VLC(Video Lan Client)是一个完整的多媒体框架,最大特点是可以根据需要动态加载许多插件模块,支持视频传输,封装和编码格式。框架核心是利用程序将各模块链接起来。对输入媒体数据,经过各模块处理后输出

•可在所有平台运行:Windows, Linux, Mac OS X, Unix, iOS, Android ..

•支持Dolby,及多音轨,多字幕

•内置MediaCodec,ffmpeg,有自己专门的Demuxing,和自己接入OpenMax组件

VLC

vlc.jpeg

小米Android ROM集成VLC作为播放器

资料

http://www.videolan.org/vlc/

git://git.videolan.org/vlc.git

名人语录:

格局,布局,步局。心中有多大,舞台就有多大。 —— 郭台铭

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容