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

Posted

技术标签:

【中文标题】如何在 iOS 中从没有文件扩展名的 URL 播放视频?【英文标题】:How to play a video from URL with no file extension in iOS? 【发布时间】:2015-10-05 17:09:29 【问题描述】:

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

视频的mime类型为:video/mp4

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

AVPlayer *player = [AVPlayer playerWithURL:adURL];

此代码适用于带有文件扩展名的网址。但是,如果我认为没有文件扩展名,AVPlayer 将无法识别 mime 类型。我该如何解决这个问题?

【问题讨论】:

如果是视频/mp4 mime 类型会播放,但不是。 您可以下载文件并附加您需要的扩展名 下载和附加扩展是可行的,但 Idk 是最好的解决方案 我敢打赌,如果 MIME 类型正确,AVPlayer 会处理它。该 URL 的内容类型为 application/octet-stream,它只是通用二进制数据。如果它是 video/mp4video/mpeg 之类的东西,那可能会很好。 AVPlayer 需要一些关于您提供的数据的线索。 【参考方案1】:

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

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

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

<video   controls>
    <source src="http://ep-lin-upload.s3.amazonaws.com/vupl_lin/F64/CDF/F64CDF3B0348471E95C244DE2DDDD3F3" type="video/mp4">
</video>

在不同的服务器上进行测试,即不使用 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 引荐来源网址的访问”部分,了解有关策略和引荐来源网址标头的更多信息:

http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-4

特别注意以下几点:

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

【讨论】:

我在一个iOS项目上实际测试过。可能它与 Safari 具有相同的系统。它仅在我下载视频并附加扩展名时才有效。 @lilbiscuit 不,我不能。我使用了我所说的解决方法:下载后附加文件扩展名。 @wrUS61 好的,谢谢。我在 htaccess 中使用 apache rewrite 来告诉 ios 获取 'file.mp4' 并将其重写为 'file'。

以上是关于如何在 iOS 中从没有文件扩展名的 URL 播放视频?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:从没有文件扩展名的 URL 捕获文件名

App Extension Swift:从没有 javascript 的任何应用程序中获取 url

如何在iOS Objective c中从没有文件名的目录中获取文件路径

从 URL 下载音频文件并在 iOS 应用程序中播放

从没有表单的URL保存图像(Symfony 3)

在 ios swift 中的 NotificationService 中播放流式 URL