Chromecast是否支持从Reddit投射视频? (HLS和短跑视频)

问题描述 投票:5回答:2

使用URL调用代理qazxsw poi使用URL调用代理qazxsw poi使用URL调用代理http://192.168.xx.xx:8080/3hyw7hwoajn21/HLSPlaylist.m3u8使用URL调用代理http://192.168.xx.xx:8080/3hyw7hwoajn21/HLS_540_v4.m3u8

以下是Reddit视频的一个示例:http://192.168.xx.xx:8080/3hyw7hwoajn21/HLS_AUDIO_160_K_v4.m3u8

通过http://192.168.xx.xx:8080/3hyw7hwoajn21/HLS_224_v4.m3u8查看,它有几个视频源选项:

https://www.reddit.com/r/me_irl/comments/b3vrs4/me_irl

虽然我似乎可以让其他HLS / m3u8视频与Chromecast SDK一起使用(例如the JSON),但我似乎无法获得任何这些来源。

我已经尝试了将流类型设置为“live”或“buffered”的"reddit_video": { "dash_url": "https://v.redd.it/3hyw7hwoajn21/DASHPlaylist.mpd", "duration": 76, "fallback_url": "https://v.redd.it/3hyw7hwoajn21/DASH_720?source=fallback", "height": 720, "hls_url": "https://v.redd.it/3hyw7hwoajn21/HLSPlaylist.m3u8", "is_gif": false, "scrubber_media_url": "https://v.redd.it/3hyw7hwoajn21/DASH_240", "transcoding_status": "completed", "width": 1280 } ,我已经尝试将内容类型设置为“application / x-mpegURL”,并且我已经尝试使用内容类型为破折号网址Google's own example HLS video键入“application / dash + xml”也无济于事。我发现https://v.redd.it/3hyw7hwoajn21/HLSPlaylist.m3u8似乎表明了一些可能性?

我还注意到DASH文件中有一个单独的视频和音频流(https://v.redd.it/3hyw7hwoajn21/DASHPlaylist.mpdthis question)最坏的情况是有没有办法在Chromecast上播放单独的音频流播放视频流?

Chromecast无法播放这些视频类型吗?

UPDATE

Jesse和aergistal建议它与缺少CORS标头有关。我构建了一个自定义接收器应用程序,以便能够获得更好的调试日志,这确实是(第一个)问题; Chromecast抱怨CORS。

使用nginx我构建了一个本地反向代理,添加了所有CORS头,然后我给Chromecast代替了代理URL,这个CORS错误就消失了。

但是,使用HLS / m3u8链接它仍然不会流。现在它抱怨以下内容:

[cast.player.hls.PackedAudioParser]在0处找不到ID3和ADTS标头

[cast.player.api.Host]错误:cast.player.api.ErrorCode.NETWORK/315

[cast.receiver.MediaManager]加载元数据错误:错误

完整日志:

https://v.redd.it/3hyw7hwoajn21/DASH_720

这导致它仍然没有发挥。有任何想法吗?

添加CORS问题允许DASHPlaylist.mpd变量加载(之前不会),这很好,但同时也不是很好,因为反向代理要求您先下载整个响应,以及DASH URL它只是一个完整的MP4(而HLS是字节范围),这意味着反向代理必须在显示之前先下载整个DASH视频,这与HLS相比需要很长时间。

因此,由于速度的原因,让HLS工作仍然是最佳的,但是由于Chromecast上的播放问题,它注定不能正常工作吗?

chromecast google-cast hls mpeg-dash google-cast-sdk
2个回答
4
投票

具有单独音频轨道的HLS解决方案


根据最新日志中的信息,所选的段格式与流中使用的实际格式不匹配。该流在https://v.redd.it/3hyw7hwoajn21/audio中使用enter image description here,而Cast SDK尝试将其解析为打包音频。

Cast问题跟踪器上的AAC显示,如果流被多路复用,则MPEG-TS默认为reply,否则为HlsSegmentFormat

CAF接收器的建议解决方案是拦截加载请求并使用MPEG2_TS覆盖段格式。一个略微修改的例子:

MPEG_AUDIO_ES

loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS

<html> <head> </head> <body> <cast-media-player id="player"></cast-media-player> <script type="text/javascript" src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"> </script> <script> const context = cast.framework.CastReceiverContext.getInstance(); const playerManager = context.getPlayerManager(); // intercept the LOAD request playerManager.setMessageInterceptor( cast.framework.messages.MessageType.LOAD, loadRequestData => { loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS; return loadRequestData; }); context.start(); </script> </body> </html>

CORS解决方案


Original source为您提供解决方案:

如果您在Cast设备上播放流时遇到问题,则可能是CORS的问题。使用公共可用的CORS代理服务器来测试您的流

公开可用代理的问题在于,由于带宽问题,它们会强制执行大小限制,因此请自行创建或使用开源代理。如果应用程序在移动设备上运行,您也可以将其设置为本地服务器。

当前流不受DRM保护。如果他们添加CDN身份验证或使用DRM保护流,这将变得更加复杂或完全不可能。


关于CORS标头,您必须确保支持预检请求:客户端可能首先发送Yet another example以检查CORS支持(包括允许的方法和标头)。

您的流也必须支持HTTP范围请求,这意味着必须授权和公开相应的标头。

来自Google Cast reference的示例预检请求配置:

OPTIONS

你需要至少允许:https://enable-cors.orgAccess-Control-Allow-Origin: * Access-Control-Allow-Methods: GET,POST,OPTIONS Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range Access-Control-Expose-Headers: Content-Length,Content-Range GETOPTIONS标题,并暴露Content-TypeRange。如果由远程服务器提供,则删除重复的标头。


6
投票

结论

最合乎道德的答案是与Reddit合作以确保他们设置正确的CORS标头。 Google文档中需要CORS标头。

模拟你的问题

使用此测试仪:

Content-Length

它模拟了您使用Chromecast SDK在代码中获得的一些相同体验。没有Playready DRM设置的Google视频播放,但reddit视频没有(在大多数浏览器中)。

MS EDGE和jwplayer

如果您选择Playready并为Playready网址添加任何内容,即使将其留空,也适用于M3U8。

Internet Explorer和jwplayer

错误,232011没有正确的跨域凭据的清单请求。无法加载M3U8:拒绝跨域访问。由于技术错误,无法播放此视频。

这表明在reddit服务器上可能未启用CORS。更多关于以下内容。

Firefox和jwplayer

似乎没有任何东西可以与jwplayer一起使用。

Chrome和jwplayer

不适用于jwplayer。

Safari和jwplayer播放器

您表明它无需设置任何DRM设置即可运行。

iPhone / Apple TV

我试过了,m3u8视频可以直接使用AirPlay从我的手机投射到Apple TV(4K)。

模拟摘要

通过Airplay,所有M3U8视频都可以从iPhone流式传输到AppleTV。它似乎适用于Edge,也适用于Safari,所以也许它只能起作用,因为Reddit已经通过airplay作为服务接受Apple流媒体,而不是Chromecast。不太确定,但还有什么可以解释?某人的更多澄清会很棒。

根本原因分析

请注意,您分享的Google链接包含以下标头:

Content-Range

它被设置为*(aka.all),这意味着服务器将与Internet上的任何域共享所请求的资源。

https://developer.jwplayer.com/tools/stream-tester/

reddit链接没有该标头,这意味着CORS未启用以允许资源共享,这意味着它不能用于工作。

CORS头Access-Control-Allow-Origin 的描述

Access-Control-Allow-Origin标头允许服务器指定其资源与外部域的共享方式。当发出GET请求以访问服务器A上的资源时,服务器A将使用Access-Control-Allow-Origin标头的值进行响应。很多时候,此值将为*,这意味着服务器A将与Internet上的任何域共享所请求的资源。其他时候,此标头的值可以设置为特定域(或域列表),这意味着服务器A将与该特定域(或域列表)共享其资源。 Access-Control-Allow-Origin标头对资源安全至关重要。

有几个资源表明必须从服务器端启用CORS:

https://tools.geekflare.com/report/cors-test/https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/hls/DesigningForGoogleCast.m3u8

https://www.codecademy.com/articles/what-is-cors

甚至Google也说需要设置这些标题:https://stackoverflow.com/a/28360045/9105725

CORS要求对于自适应媒体流,Google Cast需要存在CORS标头,但即使简单的mp4媒体流也需要CORS(如果它们包含轨道)。如果要为任何媒体启用“曲目”,则必须为曲目流和媒体流启用CORS。因此,如果您的服务器上没有可用于简单mp4媒体的CORS标头,然后添加一个简单的字幕轨道,除非您更新服务器以包含相应的CORS标头,否则您将无法传输媒体。此外,您需要至少允许以下标题:Content-Type,Accept-Encoding和Range。请注意,最后两个标头是您之前可能不需要的其他标头。

© www.soinside.com 2019 - 2024. All rights reserved.