如何在iOS中播放没有文件扩展名的URL视频?

Utk*_*kuS 6 video objective-c ios avplayer

我需要在这个网址上播放视频:http://ep-lin-upload.s3.amazonaws.com/vupl_lin/F64/CDF/F64CDF3B0348471E95C244DE2DDD3F3

视频的mime类型是:video/mp4

NSURL *adURL = [NSURL URLWithString:@"http://ep-lin-upload.s3.amazonaws.com/vupl_lin/F64/CDF/F64CDF3B0348471E95C244DE2DDDD3F3"];

AVPlayer *player = [AVPlayer playerWithURL:adURL];
Run Code Online (Sandbox Code Playgroud)

此代码适用于具有文件扩展名的网址.但是,如果我认为没有文件扩展名,AVPlayer无法识别mime类型.我怎么能绕过这个?

Mic*_*ick 2

注意:我认为 Tom 的评论是正确的,如果服务器在响应中包含正确的 MIME 类型,那么播放器几乎肯定会正确处理文件。

话虽如此,浏览器中的行为很有趣,即使您的用例是基于 iOS 客户端的,正如您所指出的:

以下小提琴在 Mac 上的 Chrome 和 Windows 上的 IE 上运行良好,但在 Safari 上不起作用:

<video width="320" height="240" controls>
    <source src="http://ep-lin-upload.s3.amazonaws.com/vupl_lin/F64/CDF/F64CDF3B0348471E95C244DE2DDDD3F3" type="video/mp4">
</video>
Run Code Online (Sandbox Code Playgroud)

在不同的服务器上进行测试,即不使用 Amazon S3,并且使用不同的 mp4 视频(例如 BigBuckBunny)会产生相同的结果:即使扩展不存在,Chrome 和 IE 也很满意,但 Safari 似乎需要它,否则它不会播放视频。

更新 (或更准确地说,更新的更新):查看 Safari 和 Chrome 中的请求和响应,似乎 Safari 也没有在请求消息中发送任何标头。经过一番搜索后,这似乎是一个以前见过的问题,S3 将拒绝没有引用标头的请求。您可以更新 S3 策略以允许特殊的引用标头“空” - 请参阅下面的信息。

然而,考虑到相同的行为存在于不同的服务器上,Chrome 和 IE 似乎更有可能认为 HTML 中的“type=video/mp4”信息是正确的,因此以这种方式解释内容,而 Safari 则查看响应中的内容类型来做出决定(即 Chrome 将返回的文件作为视频播放,即使响应标头显示“Content-Type:application/octet-stream”而不是“video/mp4”)。

有关上述 S3 标头策略的更多信息,请查看此 S3 策略页面中的“限制访问特定 HTTP Referrer”部分,以获取有关策略和 Referrer 标头的更多信息:

特别是以下注意事项:

假设您有一个域名为(www.example.com 或 example.com)的网站,其中包含指向您的 S3 存储桶 examplebucket 中存储的照片和视频的链接。默认情况下,所有 S3 资源都是私有的,因此只有创建资源的 AWS 账户才能访问它们。要允许从您的网站对这些对象进行读取访问,您可以添加一个存储桶策略,允许 s3:GetObject 权限,但条件是使用 aws:referer 键,获取请求必须源自特定网页。