html - iOS 设备上的 MP4 浏览器内视频播放间歇性中断
问题描述
这真是令人费解,我们怀疑是 iOS 错误。
情况:
我们有一个视频内容网站,我们在其中托管视频mp4
,用户可以播放它们。这些视频在浏览器的 HTML5 播放器中内嵌显示。通常,用户会在同一页面上显示多个视频。
问题
我们开始收到一些用户的报告,所有用户都是在 iOS 设备上,这些视频中有一小部分显示为无法播放,如下所示:
再说一次,这不会发生在他们屏幕上的所有视频上,只有少数。在非 iOS 设备上观看视频时,一切正常;所有视频都可以播放。对于这些用户来说,无论他们在该设备上使用什么浏览器,都会发生同样的问题。
我们调查的内容
首先,我们研究了与 Safari(和 iOS)相关的常见 HTML5 视频播放问题。诸如确保服务器响应Range
请求并包含playsinline
等等之类的事情。请求和响应看起来不错,这是有道理的,因为这些视频都被转码为相同的格式并托管在同一服务器(Digital Ocean Spaces)上。
一旦我们能够在 iOS 上重现这个问题,我们发现它不是视频标签;即使mp4
在浏览器中直接访问(无 HTML)(不管是哪一个)也不起作用:
这将支持它不适用于任何浏览器的想法。以下是我们在测试中发现的一些令人费解的细节(我们正在使用提供 iOS 模拟器访问权限的在线服务进行测试):
- 这只发生在某些(我们的一小部分)视频中,大多数视频将始终有效
- 对于不起作用的视频,每次模拟器重新启动时,它是否会起作用的几率大约为 50/50。如果它有效(或无效),它将保持该状态,直到再次重新启动
- 在同一个模拟器会话中,没有任何次数的 **device* 重启将状态从不工作变为工作
- 它似乎发生在 iOS 12.4 及更高版本、iPad 和 iPhone 上(使用模拟器测试)
当您搜索 Apple 论坛时,最近有不少关于视频播放的问题,更多集中在 13.4 更新上。
例子
我们能够使用库存视频重新创建它。就上下文而言,我们花了大约 16 个视频才出现 1 个失败。
当我们在 iOS 模拟器(iPhone XS、iOS 12.4)中访问“不工作”链接时,每次都会失败。
无论如何,我们对于如何解决这个问题已经没有想法了,也许只是在寻找这可能是一个已知的 iOS 问题的确认。有没有人经历过这个?
解决方案
非工作文件是 yuv422 颜色空间(见Chroma subsampling : 4:2:2
下文)。大多数硬件(因此是移动)解码器只能播放 yuv420。该文件必须转码为支持的色彩空间。
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High 4:2:2@L3.1
Format settings : CABAC / 4 Ref Frames
Format settings, CABAC : Yes
Format settings, Reference frames : 4 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 16 s 984 ms
Bit rate : 2 760 kb/s
Width : 720 pixels
Height : 496 pixels
Display aspect ratio : 4:3
Frame rate mode : Constant
Frame rate : 29.970 (30000/1001) FPS
Color space : YUV
Chroma subsampling : 4:2:2
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.258
Stream size : 5.59 MiB (100%)
Writing library : x264 core 157 r2969 d4099dd
Encoding settings : cabac=1 / ref=1 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=2 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=0 / threads=15 / lookahead_threads=3 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=1 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=10 / rc=crf / mbtree=1 / crf=23.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
Color range : Full
Codec configuration box : avcC
模拟器有时会起作用,因为它们在软件中模拟解码器。而且很多软件解码器确实支持4:2:2
推荐阅读
- python - PySpark program is throwing error "TypeError: Invalid argument, not a string or column"
- angular - 每当我的画布加载时,它只需要全宽而不是全高
- swift - 在不修改原始节点的情况下编写 Dijkstra 算法
- android - 服务运行较长时间后,Android URL 无法连接
- sql-server - 在 SQL Sever 2012 表中插入多行数据;表是无效对象
- php - 如何在PHP中制作“显示当前页面的所有父母和唯一的孩子”侧边栏
- angular - 如何处理角度反应形式验证变得过时
- node.js - 如何解决 node.js “JavaScript heap out of memory” 问题?
- python - 使用 eclipse、python、远程系统资源管理器、raspberrypi 进行远程开发和调试:导入错误
- javascript - 如果文件太多,Gulp 吞下 eslint 输出