【发布时间】:2015-01-25 21:59:31
【问题描述】:
我正在构建一个 iOS 应用,用于将视频内容从 DLNA/UPnP 媒体服务器投射到 Chromecast。当我为字幕添加媒体轨道数据时出现问题。以下作品:
### Media Manager - LOAD: {
"type":"load",
"I":false,
"defaultPrevented":false,
"kb":true,
"data":
{
"currentTime":0,
"requestId":3,
"autoplay":true,
"media":
{
"metadata":
{
"title":"movie.mp4",
"subtitle":"Unknown",
"images":
[{
"url":"http://192.168.1.15:8895/resource/625/COVER_IMAGE",
"width":200,
"height":100
}],
"metadataType":0
},
"textTrackStyle":
{
"windowRoundedCornerRadius":8,
"windowType":"ROUNDED_CORNERS",
"foregroundColor":"#FFFFFFFF",
"fontFamily":"Helvetica",
"fontGenericFamily":"SANS_SERIF",
"fontStyle":"BOLD",
"fontScale":1,
"windowColor":"#000000FF",
"backgroundColor":"#000000FF"
},
"contentId":"http://192.168.1.15:8895/resource/338/MEDIA_ITEM/AVC_MP4_MP_SD_AAC_MULT5-0/ORIGINAL",
"contentType":"video/mp4",
"streamType":"NONE",
"duration":0
}
},
"senderId":"33:3EA56D16-D18E-4D13-87A0-717DC188F8AF"}
但是当我添加自己的字幕或例如从 CastVideos 示例应用程序添加字幕时(以确保它启用了 CORS),它不适用于:
### Media Manager - LOAD: {
"type":"load",
"I":false,
"defaultPrevented":false,
"kb":true,
"data":
{
"currentTime":0,
"requestId":4,
"autoplay":true,
"media":
{
"tracks":
[{
"trackId":1,
"trackContentId":"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/GoogleIO-2014-CastingToTheFuture2-en.vtt",
"language":"en-US",
"subtype":"CAPTIONS",
"type":"TEXT",
"trackContentType":"text/vtt",
"name":"English Subtitle"
}],
"contentId":"http://192.168.1.15:8895/resource/338/MEDIA_ITEM/AVC_MP4_MP_SD_AAC_MULT5-0/ORIGINAL",
"streamType":"NONE",
"contentType":"video/mp4",
"duration":0,
"metadata":
{
"title":"movie.mp4",
"subtitle":"Unknown",
"images":
[{
"url":"http://192.168.1.15:8895/resource/625/COVER_IMAGE",
"width":200,
"height":100
}],
"metadataType":0
},
"textTrackStyle":
{
"windowRoundedCornerRadius":8,
"windowType":"ROUNDED_CORNERS",
"foregroundColor":"#FFFFFFFF",
"fontFamily":"Helvetica",
"fontGenericFamily":
"SANS_SERIF",
"fontStyle":"BOLD",
"fontScale":1,
"windowColor":
"#000000FF",
"backgroundColor":"#000000FF"
}
}
},
"senderId":"11:9D7D43C2-CD85-4143-82AA-2D0056AA62FC" }
我明白了:
[cast.receiver.MediaManager] Load metadata error cast_receiver.js:18
但是,示例应用程序可以在我的自定义接收器中使用字幕,没有任何问题,而且我没有发现太大的区别(除了视频/图像 http URL,我只是收到警告):
### Media Manager - LOAD: {
"type":"load",
"I":false,
"defaultPrevented":false,
"kb":true,
"data":
{
"currentTime":0,
"requestId":3,
"autoplay":true,
"media":
{
"tracks":
[{
"trackId":1,
"trackContentId":"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/DesigningForGoogleCast-en.vtt",
"language":"en-US",
"subtype":"CAPTIONS",
"type":"TEXT",
"trackContentType":"text/vtt",
"name":"English Subtitle"
}],
"contentId":"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/DesigningForGoogleCast.mp4",
"streamType":"NONE",
"contentType":"video/mp4",
"duration":0,
"metadata":
{
"title":"Designing For Google Cast",
"subtitle":"Google IO - 2014",
"images":
[{
"url":"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images_480x270/DesigningForGoogleCast2-480x270.jpg",
"width":200,
"height":100
}],
"metadataType":0
},
"textTrackStyle":
{
"windowRoundedCornerRadius":8,
"windowType":"ROUNDED_CORNERS",
"foregroundColor":"#FFFFFFFF",
"fontFamily":"Helvetica",
"fontGenericFamily":"SANS_SERIF",
"fontStyle":"BOLD",
"fontScale":1,
"windowColor":"#000000FF",
"backgroundColor":"#000000FF"
}
}
},
"senderId":"46:F162E34A-1A6D-4C0C-A0A3-DB584C92CDF5" }
有什么想法吗?
提前致谢。
【问题讨论】:
-
当你说它不起作用时,这是什么意思?请注意,当您添加字幕时,CORS 不仅成为字幕的要求,而且成为您的视频流的要求(即使它是非自适应的,如 mp4)。您需要解释您看到的问题以及来自控制台等的日志。
-
它不起作用意味着它无法加载并且投射被中断。这很可能是因为视频流未启用 CORS。如何获得有关媒体加载的更详细错误?目前,来自 JS 库的“加载元数据错误”太简短了。视频流 (mp4) 由媒体服务器托管或在网络中可用,例如服务。有解决方法吗?由于我想翻译字幕并将它们挂在另一台服务器上,所以它将是跨服务器的。我无法将字幕添加到媒体服务器。什么时候总是需要字幕/字幕 CORS?
-
如果您在接收器上打开登录,您应该能够看到 CORS 错误以及有关错误的更多信息。我认为您提到如果您将视频流指向我们示例中的视频流(因为具有 CORS 标头),那么相同的设置(即您的接收器 + 您的字幕)可以工作,对吗?您还可以验证您的流是否具有 CORS(例如,使用 curl -v ...)
-
感谢您到目前为止的帮助。好的,问题已确定。提供视频的媒体服务器(例如 Serviio)不支持 CORS。使用示例应用程序视频和我在另一台服务器(具有 CORS)上的翻译字幕一起工作。是否有任何解决方法可以用于来自不支持 CORS 并且在 Chromecast 中有字幕的 http 服务器的视频,或者我无能为力?
-
如果您有能力在 LAN 中运行本地服务器,您可以考虑运行代理服务器,以便一切都通过您的代理服务器,您可以在其中添加 CORS 标头。除此之外,您无能为力。