使用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.mpd和this question)最坏的情况是有没有办法在Chromecast上播放单独的音频流播放视频流?
Chromecast无法播放这些视频类型吗?
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上的播放问题,它注定不能正常工作吗?
具有单独音频轨道的HLS解决方案
根据最新日志中的信息,所选的段格式与流中使用的实际格式不匹配。该流在https://v.redd.it/3hyw7hwoajn21/audio中使用,而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.org,Access-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
,GET
和OPTIONS
标题,并暴露Content-Type
,Range
。如果由远程服务器提供,则删除重复的标头。
结论
最合乎道德的答案是与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://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。请注意,最后两个标头是您之前可能不需要的其他标头。