Analysis of Video Playback Failure in ByteDance iOS Client Cache
A bug in ByteDance's iOS client caused 1080p videos to become unplayable after 1 hour 53 minutes due to a downloader component truncating files beyond the int type limit, which was resolved by upgrading to a longlong type.
【问题反馈】1月2号运营后台收到用户反馈,某应用的《我和我的家乡》影片结尾部分观看不了;经过确认,场景是被下载缓存到本地的电影。
【排查】1 我们首先考虑的是播放器自身的问题,例如播放器在特定视频帧或GOP下的崩溃。但是在线播放的该视频没有接到这样的反馈,所以问题应该跟缓存到本地的过程有关。
2 接下来我们排查了下载源的文件完整性,以及本地文件的完整性。我们发现,源站的文件是完整的,而本地缓存的文件却不完整。
3 所以我们的目光来到了网络库中的下载组件。该组件是字节自研的downloader。此时我们发现,该应用的低版本中,使用了较老版本的downloader;该downloader的研发表示,这个老版本有一个已知问题(已经被后续版本修复):
downloader对获取到的文件长度,使用了int型;这样,超过int长度的文件将会被截断,从而出现文件不完整的情况。这是该bug的根本原因。
【解决】由于该应用升级到新版downloader有困难,涉及到大量回归测试。所以针对旧版本downloader,专门修复了该bug,并且快速集成发布;定位、排查、修复、发布用时大约3天。
【一些后继问题】【int类型到底有多大?】以此次问题为例,1GB=1073741824字节(1KB=1024字节 1M=1024KB 1G=1024MB),int有符号2^31-1=2147483647(约20亿),约为2G。此时如果强制将一个大于2G的视频进行截断,会导致视频的最大值不符合预期,导致失败。修复方案中,将int变为longlong类型,最大为9223372036854775807,可以认为无限大。
【这个Bug为什么没测出来?】该应用上线电影属于运营活动,对于缓存电影的功能,RD同学因为任务紧急,只进行了自测和业务QA回归,未周知网络库QA。而在此之前,由于认为缓存超过2G的文件场景并不存在,所以网络库方面认为这个bug风险不大,也没有要求应用侧升级到新版downloader。
该Bug实际测试时,如果纯粹用手工测试,覆盖难度较大。一方面需要缓存1080p电影到结束,另一方面需要观看到电影结束;单纯缓存该电影,缓存低清画质,或者只播放开头,都是无法发现的。
Byte Quality Assurance Team
World-leading audio and video quality assurance team, safeguarding the AV experience of hundreds of millions of users.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.