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

#### 问题现象

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

#### 背景知识

*   AVPlayer是一个功能较完善的音视频播放API，集成了流媒体和本地资源解析，媒体资源解封装，视频解码和渲染功能，可直接播放mp4、mkv等格式的视频文件。
*   OhosVideoCache是一个支持边播放边缓存的库，只需要将音视频的url传递给OhosVideoCache处理之后再设置给播放器，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信息在最后面，需要下载完成后才能播放。

#### 修改建议

*   对无法播放的视频文件重新排列文件结构，把moov信息移到mdat前面。
*   实现mp4文件moov信息前置，技术实现方案可参考音视频编解码服务。

#### 常见FAQ

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

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