Video 为什么赢了';t不带扩展名的Safari播放文件在<;视频>;?
我有文件名为52bbb58c,没有文件扩展名,它是mp4视频 当我尝试将其添加为属性类型(video/mp4)为Video 为什么赢了';t不带扩展名的Safari播放文件在<;视频>;?,video,safari,mp4,Video,Safari,Mp4,我有文件名为52bbb58c,没有文件扩展名,它是mp4视频 当我尝试将其添加为属性类型(video/mp4)为&的时,它不会播放 这适用于Chrome和Firefox。如何修复Safari?在其他地方详细研究了这个问题后(见下面的链接),我认为最可能的原因是Chrome和IE假设HTML中的“type=video/mp4”信息是正确的,因此以这种方式解释服务器返回的内容,而Safari则查看响应中的内容类型以做出决定 换句话说,Chrome将返回的文件作为视频播放,即使来自服务器的HTTP响应
&
的
时,它不会播放
这适用于Chrome和Firefox。如何修复Safari?在其他地方详细研究了这个问题后(见下面的链接),我认为最可能的原因是Chrome和IE假设HTML中的“type=video/mp4”信息是正确的,因此以这种方式解释服务器返回的内容,而Safari则查看响应中的内容类型以做出决定 换句话说,Chrome将返回的文件作为视频播放,即使来自服务器的HTTP响应的标题是“Content-Type:application/octet-stream”,而不是“Content-Type:video/mp4” 您可以通过查看示例的响应头,查看内容类型是否设置为“application/octet stream”,而不是“video/mp4”,来检查这一点
相关回答:我遇到过类似的问题。在我的例子中,它在Chrome和Firefox上运行良好,或者在我为文件添加扩展名时运行良好。如果我正确地更改mime类型,它仍然无法通过 实际上,我有一个服务器,我们部署了返回响应头,如下所示
HTTP/1.1 206 Partial Content
Date: Mon, 05 Mar 2018 08:33:49 GMT
Server: gunicorn/19.7.1
X-Powered-By: Express
content-type: video/mp4
accept-ranges: bytes
content-length: 2
content-range: bytes 0-1/37475549
Cache-Control: public, max-age=0
Connection: keep-alive
响应头本身肯定是正确的
但是,服务器实际返回的大小与内容长度
和内容范围
之间存在差异。所以到目前为止,它工作得很好,因为我解决了这个问题。如果您与我处于相同的情况,则会使用curl--0-1范围复制该错误
它会这样说错误18:传输关闭,未完成的读取数据剩余
因此,答案是正确确认服务器返回的值
参考文献
Safari在播放视频和音频等流媒体时非常挑剔。它有以下要求
- 承载介质的服务器/应用程序必须支持字节范围。Safari将尝试下载2个字节以确定媒体长度,然后根据文件大小将媒体分为一个或多个块进行下载。如果你把所有的数据都发送给它,那就不好了
- 从媒体服务器返回的内容范围必须包括媒体总大小的数字,而不仅仅是“*”
- 媒体URL必须具有与媒体类型匹配的后缀。就像IE一样:正确使用mime类型是徒劳的,因为Safari不会遵守这里的规则,它会忽略mime类型
请注意,Safari不会告诉您问题所在,如果播放失败,只会出现媒体错误,没有进一步的信息
对于mpeg 4视频/h.264,后缀.mp4起作用
对于mpeg 4音频/aac,后缀.aac起作用
如果你是一名狩猎爱好者,请考虑修理这些东西。
这是在Safari 11.1.2上测试的。实际上,Safari浏览器并不支持所有MP4格式的视频
MP4只是一种文件格式,而不是视频编解码器类型
您可以使用ffmpeg获取视频的信息
对我来说,我发现Safari可以播放以下视频编解码器的MP4视频:
ffmpeg -i demo3.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo3.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
description : Codec by Bilibili XCode Worker v4.7.18(fixed_gap:False)
Duration: 00:00:54.44, start: 0.000000, bitrate: 772 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 852x480 [SAR 640:639 DAR 16:9], 635 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
At least one output file must be specified
您应该注意到关键字视频:h264(高)
对于无法在Safari上播放的视频:
ffmpeg -i demo3_mask.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo3_mask.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:54.33, start: 0.000000, bitrate: 630 kb/s
Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuvj444p(pc), 852x480, 627 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
关键字是视频:h264(高4:4:4预测)
。至于编解码器类型,您可以参考或
如果是这种情况,可以使用以下命令使用ffmpeg转换视频编解码器类型:
ffmpeg -i demo3_mask.mp4 -vf "scale=2*trunc(iw/2):-2,setsar=1" -profile:v high -pix_fmt yuv420p out2.mp4
您可以查看新视频的信息:
ffmpeg -i out2.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out2.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:54.33, start: 0.000000, bitrate: 221 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 852x480 [SAR 1:1 DAR 71:40], 218 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
At least one output file must be specified
希望有帮助。我的视频API内容类型已经是video/mp4,但是这些视频没有在Safari/MacOs中播放。@SibeeshVenu-看看David最近的回答。它有更多的最新信息和更多的细节,可能会帮助你。如果不是的话,那么最好打开一个问题,如果可能的话,包括一个链接到一个不会播放的示例视频。