【问题标题】:AVPlayer and AWS Services StreamingAVPlayer 和 AWS 服务流
【发布时间】:2015-04-23 03:13:20
【问题描述】:

我正在尝试从 AWS S3 存储桶流式传输视频。 我上传了几个具有“为所有人制作”权限的文件。

我还创建了一个 CloudFront 分配(我只是选择了我的存储桶,默认情况下让所有其他人选择)。 在网络浏览器中,我可以下载文件/阅读地址http://distribution.cloudfront.net/movie1.mov

在我的项目中,我启动了一个 AVPlayer,它从 tableview 获取路径(类似于 itune,但用于电影)。 每行的文件与在我的 Web 浏览器中测试的文件相同: http://distribution.cloudfront.net/movie1.mov 第 1 行 distribution.cloudfront.net/movie2.mov for row2 ...

播放器很好地选择了路径并开始播放,但它总是同时冻结。我必须暂停或前进/后退才能继续播放视频。

所以这似乎是一个缓冲区问题。

我想知道我是否很好地使用了 AWS Cloud Front,以及如何解决缓冲区问题。

我没有找到任何好的教程或答案。

感谢您的帮助。

问候

【问题讨论】:

  • Cloudfront 有一个分发设置,如果文件用于“下载”或“流式传输”,则默认为下载。您能否确认您已将其切换到流媒体?您是否还对云端设置了地理限制,以便它使用离您最近的区域的服务器?
  • 感谢您的回答。对于您的第一个问题:创建发行版时,我没有选择下载或流式传输。或者可能是 Web 和 RMTP 之间的选择。如果那我选择Web。 -> 我必须更改为 RMTP 吗?我没有地理限制。我在哪里可以找到它?
  • 我发现了地理限制并仅针对法国进行了设置(目前)。因此,如果我想将我的申请扩展到欧盟或美国,我必须添加更多国家。就这样?
  • 你有没有得到这个工作?如果是这样,解决方案是什么?
  • 不,总是同时冻结。我想知道将来自 AWS S3 的视频链接放在 AVPlayer 中是否是一件好事? AWS S3 只能用于流式传输视频?

标签: ios swift amazon-web-services amazon-s3 avplayer


【解决方案1】:

您是否在云端设置了地理限制,以便它使用离您最近的区域中的服务器?

在我的第一条评论中,我指的是网络和 RMTP。你想要网络,所以这是正确的。

现在它仅限于法国,请再次测试您的视频,看看它们的性能是否更好。

随着使用量的扩大,您将希望允许其他区域。请记住,不同的地区有不同的云端价格。欧盟和美国是一样的,但其他地区的价格可能会贵一倍或更多。

http://aws.amazon.com/cloudfront/pricing/

【讨论】:

  • 感谢您提供详细信息。我已经测试了限制,但几秒钟后视频仍然冻结 :( 选择 RMTP 无济于事?
  • 我也尝试在 vlc 中打开链接:distribution.cloudfront.net/movie1.mov,但它仍然很慢并且同时冻结。有什么想法吗?
  • 本地计算机上的 VLC 也失败了?你确定文件没有损坏?尝试将文件放在您的常规网络服务器(不是 s3)上,然后以这种方式观看电影进行测试。
  • 是的,文件没有损坏。我试图从网站上播放这个视频:v.cdn.vine.co/r/videos/… 和我的存储桶(我下载并上传到其中)。从 vine.co,avplayer 不会冻结,但从 aws 会冻结.. :( 有什么想法吗?或者我必须将 aws 更改为其他服务吗?
  • 也许我必须使用 wowza 之类的服务才能从 aws s3 流式传输?
【解决方案2】:

AVPlayer 可以在流式传输长视频时停止。

您需要为键playbackBufferEmpty 和playbackLikelyToKeepUp 注册观察者

[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];
[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];

然后,

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    if (!player)  {
        return;
    }

    else if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"])  {
        if (playerItem.playbackBufferEmpty) {
            //Other relevant code here, like adding spinner
        }
    }

    else if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])  {
        if (playerItem.playbackLikelyToKeepUp)  {
            [player play];
            //Other relevant code here, like removing spinner
        }
    }
}

【讨论】:

  • 它已经实现了,因为我从这里使用了播放器:github.com/piemonte/Player 但它总是同时冻结。还有其他想法吗?
  • 那我觉得这和App端部分没有关系。
猜你喜欢
  • 2021-09-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2020-01-18
相关资源
最近更新 更多