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

标签 ios objective-c video avplayer

我需要在这个网址播放视频: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 类型。我该如何解决这个问题?

最佳答案

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

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

以下 fiddle 在 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>

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

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

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

有关上述 S3 header 策略的更多信息,请查看此 S3 策略页面中的“限制对特定 HTTP 引荐来源网址的访问”部分,以获取有关策略和引荐来源网址 header 的更多信息:

特别注意以下几点:

Suppose you have a website with domain name (www.example.com or example.com) with links to photos and videos stored in your S3 bucket, examplebucket. By default, all the S3 resources are private, so only the AWS account that created the resources can access them. To allow read access to these objects from your website, you can add a bucket policy that allows s3:GetObject permission with a condition, using the aws:referer key, that the get request must originate from specific webpages.

关于ios - 如何在 iOS 中播放来自没有文件扩展名的 URL 的视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32954091/

相关文章:

objective-c - 从主视图更改 subview 上的 UILabel 文本

ios - AVPlayerViewController 中的完成按钮单击事件

ios - iOS:如何获取Youtube视频流网址?

node.js - 上载Youtube视频成功,但YouTube channel 上没有视频

iOS4 : how do I use video file as an OpenGL texture?

ios - 我什么时候应该使用 "performBlock"方法?

ios - 使用 dataTask 在 func 上快速显示和隐藏事件指示器

ios - iphone 6s 上的 tableview 滚动条断断续续

ios - 更新 View Controller 的 UI,然后关闭它

iphone - ios 在字典或数组中存储 ^block?