目录

部分视频边缓存边播放失败

问题现象

使用AVPlayer实现视频的播放,使用OhosVideoCache视频缓存库部分视频无法边缓存边播放,必须完全缓存完成才可以播放,如何排查?

背景知识

问题定位

  1. mp4文件是由多个“盒子”(Box)组成的,这些盒子可以嵌套,形成一个层次结构。每个盒子都有一个4字节的标识符(通常是4个ASCII字符,如ftyp、moov),以及指明盒子大小和类型的信息。
    • ftyp:用于说明当前媒体文件的类型、版本号及兼容的协议类型。它是mp4文件的第一个盒子,且只能有一个。
    • moov:用于存储文件的元数据,包括创建时间、修改时间、整体播放时长等全局信息,以及音视频流的具体信息(如轨道信息、编码格式等)。它也是一个容器盒子,可以包含多个子盒子。
    • mdat:用于存储实际的音视频数据。一个mp4文件可以有一个或多个mdat盒子,也可以没有(当媒体数据全部引用其他文件时)。媒体数据的结构由metadata进行描述。
  2. 对无法播放的视频文件进行结构解析,发现moov信息排在最后面。

分析结论

视频数据中moov信息排在后面的不支持边下载边播放。moov中存放了视频的相关信息,比如时长、分辨率、帧率,mdat中存放的是媒体数据,只有加载完moov信息之后才能开始播放,所以想要提升播放加载速度,必须要将moov信息排在mdat前面。如果视频的moov信息在最后面,需要下载完成后才能播放。

修改建议

常见FAQ

Q:ijkPlayer播放视频,调用seekTo后进度条出现卡顿或跳动现象。

A:该问题是由于视频资源的moov信息在视频的结构末尾导致,可以在服务端将moov信息移到前面解决。