normandie播放框架

KittoHamiltion 发布于1年前
0 条问题

normandie是什么?

它是一个用c/c++/java实现的一个播放框架,完全基于android sdk/ndk开发,并且挂载了ffmpeg,openssl,drm等开源库和相关协议实现.
设计上90%多的API,行为模式,生命周期与android mediaplayer保持一致,学习成本低,无缝切换。
持续迭代,优化,多项指标超过android原生框架。
支持系统feature,又支持很多系统支持起来比较费劲或支持不了或运营难度高的feature
支持从android4.0到android9.0,flyme4到flyme7。
支持32bit and 64bit。

normandie的用途?

最初的目的是为了统一处理国内市场众多的音视频播放格式的支持问题,不依赖android框架不跟随android版本迭代,自行迭代一步步完善,解放繁琐的适配android框架的人力。
后来发展为,支持众多格式,支持本地,在线流媒体等多种播放业务的SDK,支持了flyme的多个产品。

normandie的一生?

对自己做的东西还是有感情的,所以稍微拟人化了,相信很多工程师程序员都有这样的经历。
一生说的不太恰当,可能到了中年吧。
从开始调研立项到设计实现,中间经历了团队成员离开开发人员从3减到最后剩下一个,最后终于发布了1.0版本,在质疑下与cp sdk进行pk,任何需求都满足提供保姆式服务,再老的机型也提供优化支持比如mx2(android4.0 1g ram),不但在指标上达到业内水平,做到无微不至的服务,拿下了第一个业务音乐。
随着flyme业务的发展,它也迎来了高光时刻,支持了音乐的本地/在线业务以及各种定制的免流,drm等需求,支持了资讯,浏览器,短视频应用,应用中心等流媒体,短视频的播放需求,兼容接入的各种cp。部分产品的月活在千万级别。

clipboard.png
最初的框架设计

clipboard.png

player对象的生命周期设计

history

v1.0.0 Normandie

Support video formats: mkv, mpeg4, flv, rmvb, avi, wmv, 3gp, asf, vob, ts, mts, m2ts, mov etc
Support video decoders: h263,h264,hevc,mpeg,vp6,vp8,vp9 etc
Support HW avc and hevc decoders.
Support video rescale.
Support audio formats: mp3, m4a, aac, flac, ape, ac3, dts, wav, wma, mka,ogg,ra,amr,mpa etc.
Support audio decoders: aac,mpeg,mp3,aac,ape,flac,pcm,dpcm etc.
Support audio resample.
Support MIDI.
Support subtitle internal and external, such as srt etc.
Support protocols: http,https,rtps,hls etc.
Support player operations: start, stop, pause, resume, seek, switch audio channel, switch subtitle, get position, get duration, get play state, get media metadata, get information of audio track and subtitle, buffering for online media, etc.
Support playback loop mode.
Support input using path, url, uri and fd.
Support DLNA.
Support video seek preview which is not supported by AOSP.
Support android surfaceview.
Support two kinds of audio render: audiotrack and opensl es.
Support two kinds of video render: ANativeWindow and opengl es.
Support video shot.
Support Music/Video apps switch to Normandie quickly from android.
Support record audio/video frames, pcm and yuv to file for debug.
Support a demo app with full features.

v2.0.0 Normandie

解决v1.0.0遗留和新发现的bug
重构online stream buffering线程.
重构parser(data extractor)线程.
重构"实现具体player的对象的生命周期".
FFMpegEngine分解.
MediaCodec硬解支持视频旋转.
重构audio decoder线程.
重构video decoder线程.
旗舰机型上支持HD音效.(现在大于16bit的音频全部重采样的16bit播放).新的机型不再有HD音效这个概念,删除这个需求。
重构audio render线程.
重构video render线程.
优化rtsp播放.
优化m3u8播放.
稳定性健壮性测试(在线本地长时间播放,且过程中交互,播放结束交互)及优化.
内存使用测试(在线本地长时间播放),及内存优化,比如重复使用event减少malloc次数.
CPU使用对比(与android框架)及优化.
性能对比(之1启动时间与android框架)及优化.
Demo播放器增加播放框架选择菜单, 可以选择normandie或android框架播放某一个媒体文件.
Demo播放器增加app进程自身物理内存使用实时显示.
Demo播放器增加app进程自身cpu占比实时显示.

v2.6.1 Normandie

解决v2.0.0遗留和新发现的bug.
实现向前的x2,x4倍数快速播放.
实现向前的x2,x4倍数慢速播放.
优化opengles render对非规则比例视频不用内存对齐拷贝就可以直接render,减少内存和cpu使用.
解决部分视频播放抖动到问题.
优化音轨切换效果更为平滑.(平滑程度优于android)
优化字幕(内嵌/外挂)切换效果更为平滑.
在amlogic平台适配了硬解.
修复添加外挂字幕只能在start之前,之后添加失效的问题.
允许setNextPlayer的参数为null.
优化http/https读数据和reconnect机制并启用.
优化hls播放大大提升在服务器(比如代理服务器)不稳定情况下缓冲概率高的体验.
实现了http的代理功能.支持代理服务器需要验证用户名和密码.
实现了hls的代理功能.支持代理服务器需要验证用户名和密码.
提供了Envrionment类实现全局代理,通过该类基于http传输的协议都可以实现代理(支持代理服务器需要验证用户名和密码);提供了MediaPlayer.setDataSource(url,map)接口用于实现单个MediaPlayer的播放代理.
优化ffmpeg库的大小,为音乐专门裁剪ffmpeg库,并实现脚本编译时根据发布对象动态裁剪.
修复极端情况下多线程导致的looper线程退不出的问题(ANR).
优化硬解调用,通过标准api查询是否对应的avc/hevc profile是否支持硬件解码器.
向前兼容android5.0以下的android版本,android4.0,android4.2,android4.4.
SDK发布由jar包变更为发布aar包,更好的配合Android studio的使用.

v2.8.0 Normandie

解决v2.6.1遗留和新发现的bug.
解决浏览器调用硬解播放的时候偶现有声音无图像黑屏.
解决浏览器软解播放的时候多次(大于8)在网页窗口和悬浮窗口之间切换后有声音无图像(黑屏)的问题.
新功能:分屏显示同一视频图像的多个拷贝(软解).
解决SDK在低版本yunos(只在该版本)上接口被反射时抛出异常的问题.
优化m3u8:增加对EXT-X-DISCONTINUITY时间戳变化的处理.
优化线程的优先级.
优化log打印.
优化性能不佳的场景下音乐播放卡顿问题.
优化ANR,保证API接口不阻塞主线程.
新功能:音乐裁剪铃声制作,主要功能:
可以根据时间选择裁剪mp3,flac,aac,ac3设置成铃声
音乐波形数据的生成和显示
自动识别音乐高潮部分,推荐给用户裁剪位置
也可以裁剪mp4视频
支持音乐上架应用中心(已经上架).

v2.8.6 Normandie

解决v2.8.0遗留和新发现的bug
去掉开源库ffmpeg的ape file version检查的限制.
优化开源库ffmpeg的ape demuxer解析ape 3.99 insane导致的seek时间长的问题.
修复开源库ffmpeg的ra demuxer文件结束时不返回eof返回eio的bug.
支持gsm,gsm-ms音频格式.
声音输出支持flyme固件在旗舰机型的hifi音效.

v2.9 Normandie (release)

解决一些遗留,反馈问题.
修复"amr播放结束后ffmpeg返回eio不返回eof"的问题.
修复ffmpeg开源库hls中断机制缺失.
音视频SDK-机型兼容M96-当播放器使用nextplayer时避开M96 audioflinger修改的根据audiotrack更新采样率的逻辑:
目前只有96上的audioflinger这样改了,据说为了更好的hifi效果,三星平台,mtk平台上,针对hifi效果,mtk有相关逻辑实现,没有这个问题,但这样m96对第三方应用使用就有限制了,使用不兼容就会出这个问题.
[音频框架]【M96】播放采样率为44.1KHz以上的歌曲,播放到10秒左右会卡顿一下.
修复升级android sdk后运行app报错“com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0”【demo】.
兼容系统框架非hifi机型上均衡器开启强制把float转换成int导致的音乐电流声问题:
app根据是否hifi机型在创建MediaPlayer对象的时候传下来
后续机型结合system property判断.
修复audiotrack flush调用不起作用的问题.
[normandie]优化在系统资源紧张的情况下,视频播放中的音频的流畅性.
MediaPlayer API release加锁解决app多线程release重入的问题.
[代码优化]移植NDK没有的AOSP的AutoMutex到sdk.
兼容非hifi pad上audioflinger固定分配给audiotrack内存不不够大的问题,在audiotrack对象申请失败后减小申请buffer个数继续申请.
性能优化:将数据链条为空埋点从logi降到logd.
反射android.os.SystemProperties.get获取phone机型名称和hifi属性.
重命名normandie私有libcrypto,libssl,解决音乐在Android N上作为系统app时不能运行的问题.
修复normandie demo在android N上由于mediacontroller回调变化导致的seek位置一直为0的问题【demo】.
解决player切成midiplayer后不能切回nmdplayer.
[音视频sdk]优化,通过缓存减少sdk中反射的调用次数.
修复android n上pthread_cond_timedwait对小于1s无感造成的程序异常问题.
【normandie】【demo】把normandie加入打开文件的程序列表.
修复[USB HOST]【M1793&M1792】无法选中OTG设备中的音乐文件播放.
[优化]在用fd打开文件时,不使用sonivox库的eas接口判断fd是否midi,反过来判断nmd是否支持midi.
修复音视频SDK[MTK反馈]播放.imy格式音频文件,点击播放暂停按钮功能异常.
支持代理digest鉴权,并且digest和basic动态兼容.
采用新的发布方式aar包打包so+artifactory在线接入.

v2.9.1 Normandie

【优化】getDurationSlow增加中断机制.

v2.9.2 Normandie

修复“495968 【Flyme6】【全机型】【音乐】【6.0.03】邮件中点击midi格式音乐播放失败“.

v2.9.3 Normandie

将使用write float接口的条件从API Level21提高到API Level22,修复“525540 6.3.02[MX4Pro适配]---播放在线无损音乐或者下载无损音乐到本地播放----出现很大的杂音”.

v2.9.6 Normandie

实现android libc没有的pthread_cancel.
隔离libc,由于android版本差异,造成libc不同,有些可以通过实现处理掉,有些无法实现,需要隔离.

V2.9.8 Normandie

修复流程优化引入的一个内存问题.

V2.9.10 Normandie

【快省稳】需要的时候再开启subtitlerender线程.

V3.0 Normandie

实现在线播放缓存功能.
接口如下:
//在setDataSource之后,prepare或prepareAsync之前调用.
public void setMusicCacheFileInfo( String path, OnMusicCacheFileListener listener, int bufferSizeLevel) public interface OnMusicCacheFileListener { public void onMusicCacheFileComplete(MediaPlayer mp); public void onMusicCacheFileIOError(MediaPlayer mp); }
【快省稳】优化IO出错后的打印,减少打印输出.
优化内存使用,更合理.
修复ffmpeg flac mux问题.
修复ffmpeg muxer某种情况下会处以0造成崩溃的问题.

V3.0.1 Normandie

强制不信任不支持得分小于等于2的文件播放.

V3.0.2 Normandie

【优化】优化mp3 seek到0位置的处理
1.Faster
2.skip dirty data

V3.1.0 Normandie

[optimze] change android ndk version from 9 to 21 to compile ffmpeg 32bit so
fix issue pthread_cond_wait_timeout of libc hit not 100%
a better solution for 10s chorus of Music faster and save more data flow review 9 songs at the same time

V3.2.0 Normandie

满足aar新的发布要求,keep不需要混淆的class
【需求】音乐DRM(存储加密,解密播放,机器imei,过期时间等drm数据管理)

V3.2.1 Normandie

Fix 稳定性[6.7.00]执行Monkey时出现错误 unknown exception: the drm manager object pointer is not innitialized at the beginning

V3.2.6 Normandie

为资讯的视频,短视频居多,裁剪,根据需求提供合适的库,裁剪掉dlna,drm,以及ffmpeg部分模块,和相应的类
解决快速滑动视频播放列表(快速切换短视频)过程出现的崩溃问题: handle the process after abort by itself
动态编译是否支持hls EXT-X-DISCONTINUITY标签,并为video of news打开,only for video of news now
【优化】音乐试听9首副歌流量优化, tcp socket cache is too big

V3.2.11 Normandie

【资讯客户端】【3.14.0】【Android4.4.4】流内播放:点击播放按钮必现闪退
【音频视频SDK】【优化】android mediaplayer异步接口的使用, add libmessagehelper.so
资讯短视频“秒播”优,UC, kuaishou, 360

V3.2.16 Normandie

support the dirty flac,支持一些头部损坏的flac

V3.2.20 Normandie

重构setNextPlayer接口为异步接口,fix AAF crash
expose exception to the up layer in MidiPlayer

V3.2.26 Normandie

[short video]优化seek后的视频出帧策,let first frame render directly and the second frame wait for the first audio frame

V3.2.28 Normandie

用户反馈[1.0.0]偶现首页多次播放,视频界面出现花
update dlna, fix some issues
[short video]fix AAF ANR, add getVideoHeight() in MediaPlayer java state machine

V3.2.29 Normandie

fix memory leak of decoder object which was introduced by a patch

V3.2.32 Normandie

兼容flyme5/android5.1的一个固件的音频框架的audiotrack的writefloat接口工作异常导致的大面积破音问题
完善gltexture生命周期
【海外音乐】优化接口鲁棒性,保证resetAsync/pauseAsync先后同时调用时pause无效
【demo】simulate the short video user operations: repeating “create player, play, release player” for object/normal memory/graphic memory check under user mode

v3.2.38 Normandie

pause时候增加audiotrack pause接口调用,影响蓝牙耳机状态,有一款蓝牙耳机只能发出media pause没有media play
fix视频详情页,播放完毕后,锁屏,再解锁,重新点播放按钮不起作用
new hifi rules on android p

hifi原始数据
clipboard.png

hifi输出到audioflinger数据
clipboard.png

查看原文: normandie播放框架

  • greendog
  • crazymeercat
  • blacktiger
  • ticklishtiger
  • organickoala
  • lazygoose
需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。