使用 MediaRecorder 录制的视频仅在三星设备中播放第一帧

Recorded videos with MediaRecorder play only the first frame in Samsung devices

我收到来自不同三星设备(J6、S6、S7 等)的多个用户的报告,其中录制的视频无法播放,因此似乎已损坏。 播放似乎在第一帧 stuck/frozen,而音频播放正确。

使用 Android 的 MediaRecorder API 录制的视频会出现此问题。

我能收集到的信息是当设备进入深度睡眠时会发生这种情况,因此请关闭屏幕并在几分钟内不使用设备。当设备再次激活时,由于某些仍然未知的原因,新的记录在第一帧和第二帧之间产生了过大的增量持续时间,给人的印象是播放时被冻结或有只有 1 帧。

我在互联网上发现了不同站点报告的问题,但没有合适的解决方案。有没有人找到解决方法?三星似乎没有承认这个问题。

进一步调查表明,该问题可能是由部分三星机型的系统错误引起的。

通过检查一些用户发送的损坏视频,我可以确认在所有受影响的设备中,第一帧都有夸大的大增量持续时间。

因此,如果增量时间不正确,给人的印象是视频被冻结,而实际上只是根据其定义的增量持续时间在屏幕上显示第一帧,这对于损坏的视频来说非常长。

为了修复这些样本,我用第二帧的值替换了第一帧的增量时间(只有第一帧受到影响)。然后视频按预期正确播放。我用 IsoParser 来完成这个任务。

但这不是一个合适的解决方案,因为这意味着必须检查每个视频并在受影响时重新打包,因为没有办法就地修复它。该操作需要创建一个新的视频文件,将原文件的内容复制到正确的增量时间,并用固定的文件替换原文件。

正确的解决方案是找出 MediaRecorder API 如何计算增量时间,以及为什么在某些情况下受影响的设备会为第一帧生成无效值。

我唯一的猜测是,如果 MediaRecorder 实现有任何机会使用 System.nanoTime 时钟,那么我在一些 Whosebug 帖子中读到,当从深度设备返回时,这个系统时钟有时会给出一个奇怪的值-睡觉。如果那是真正的问题,那么唯一真正的解决方案就是三星修复它们的实现。