AppRTC 服务器 returns html 而不是 Json
AppRTC server returns html instead of Json
我正在 Android 中本地实现 WebRTC。我能够按照此处 http://www.webrtc.org/native-code/android 所述编译和运行代码,但我遇到了一个问题,其中 apprtc.appspot.com 显然没有 return 假设的通道令牌:
01-05 20:01:51.230 15488-15488/org.appspot.apprtc E/AppRTCDemoActivity﹕ Fatal error: Missing channelToken in HTML: <!DOCTYPE html>
<!--
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree.
-->
<html>
<head>
<title>WebRTC Reference App</title>
<meta charset="utf-8">
<meta name="description" content="WebRTC reference app">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script><link rel="canonical" href="https://apprtc.appspot.com/room/42272483?r=fh">
<link rel="stylesheet" href="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/css/A.main.css.pagespeed.cf.mluzaRyZGPUUQu3CIFwW.css">
</head>
<body><noscript><meta HTTP-EQUIV="refresh" content="0;url='https://apprtc.appspot.com/r/42272483?r=fh&PageSpeed=noscript'" /><style><!--table,div,span,font,p{display:none} --></style><div style="display:block">Please click <a href="https://apprtc.appspot.com/r/42272483?r=fh&PageSpeed=noscript">here</a> if you are not redirected within a few seconds.</div></noscript>
<div id="videos">
<video id="mini-video" autoplay muted></video>
<canvas id="remote-canvas"></canvas>
<video id="remote-video" autoplay></video>
<video id="local-video" autoplay muted></video>
</div>
<footer>
<div id="sharing">
<div id="room-link">Waiting for someone to join this room: <a href="https://apprtc.appspot.com/room/42272483?r=fh" target="_blank">https://apprtc.appspot.com/room/42272483?r=fh</a></div>
</div>
<div id="info"></div>
<div id="status"></div>
</footer>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/stats.js.pagespeed.jm.A-w15PL7V0sRNC026ANH.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/signaling.js.pagespeed.jm.QZ7VRUXKfNhiyV7jHkmW.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/infobox.js.pagespeed.jm.C9t_78UyYtO6bMRljt_L.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/sdputils.js.pagespeed.jm.DWy54ENwSOTLQKw10p1o.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/util.js.pagespeed.jm.q3iuB_S1TC2eBJC_RFlb.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/main.js.pagespeed.jm.mR4sH1O_ReNLDaNiS3o_.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/adapter.js.pagespeed.jm.-Ip1bBjviqtsxeGluAGS.js"></script>
<script type="text/javascript">var params={errorMessages:[],isLoopback:false,roomId:'42272483',roomLink:'https://apprtc.appspot.com/room/42272483?r=fh',mediaConstraints:{"audio":true,"video":true},offerConstraints:{"optional":[],"mandatory":{}},peerConnectionConfig:{"iceServers":[]},peerConnectionConstraints:{"optional":[{"googImprovedWifiBwe":true}]},turnRequestUrl:'https://computeengineondemand.appspot.com/turn?username=280585048&key=4080218913',turnTransports:'',audioSendBitrate:'',audioSendCodec:'',audioRecvBitrate:'',audioRecvCodec:'',isStereoscopic:'',opusMaxPbr:'',opusFec:'',opusStereo:'',videoSendBitrate:'',videoSendInitialBitrate:'',videoSendCodec:'',videoRecvBitrate:'',videoRecvCodec:'',wssUrl:'wss://apprtc-ws.webrtc.org:443/ws',wssPostUrl:'https://apprtc-ws.webrtc.org:443'};initialize();</script>
<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.cr
在此处检查 AppRTCClient.java 的源代码时 https://code.google.com/p/webrtc/source/browse/trunk/talk/examples/android/src/org/appspot/apprtc/AppRTCClient.java?r=5847 我在第 234ff 行发现了一个有趣的评论,正是应用程序失败的功能:
// Fetches |url| and fishes the signaling parameters out of the HTML via
// regular expressions.
//
// TODO(fischman): replace this hackery with a dedicated JSON-serving URL in
// apprtc so that this isn't necessary (here and in other future apps that
// want to interop with apprtc).
private AppRTCSignalingParameters getParametersForRoomUrl(String url)
throws IOException {
// ...
}
在函数中发生了很多 html 代码的解析,似乎通道令牌没有正确地从服务器的响应 html return 中解析出来(难怪).
我没有进一步调查频道令牌是否存在and/or是否正确。相反,我怀疑代码(主干!)可能已经过时,用谷歌搜索并在 Github 上找到了这个项目:https://github.com/pristineio/webrtc-android
相同的函数,在第 232ff 行,将 &t=json 作为参数传入,据说是因为它希望服务器 return Json。然后该函数在解析 Json 时失败,猜猜原因。答对了!因为相同的 html 页面是 returned,有或没有参数。
// Fetches |url| and fishes the signaling parameters out of the JSON.
private AppRTCSignalingParameters getParametersForRoomUrl(String url)
throws IOException, JSONException {
url = url + "&t=json";
// ...
}
为了完整起见,完整的 URL 失败了:
https://apprtc.appspot.com/?r=00000000&t=json
其中 00000000 是房间号。
看来 Google 的 Fischman 先生同时更新了代码,但是 webrtc 的代码不是最新的,Github 的 pristineio/webrtc-android 似乎知道曾经使 apprtc.appspot.com return Json 而不是 html 的参数,但它不再这样做了。
我用谷歌搜索但找不到 apprtc.appspot.com 的服务器代码,但我记得以前见过它(我相信它是一个 Python 项目)。
- 有人有那个源代码的 link 吗?
然后我搜索了那个 URL 的参数,我发现有两个页面列出了这些参数,包括 http://samdutton.github.io/webrtc/samples/web/content/apprtc/params.html,但它们都没有显示参数或替代 URL 来请求结果为 Json.
- 有人知道正确的参数(或 url)是什么吗?
- 或者有人知道完整的规格是什么吗?
- 或者有人 link AppRTCClient.Java 的最新可用源代码吗?
谢谢!
运行 和你一样的问题。我在这里找到代码:
https://github.com/GoogleChrome/webrtc/tree/master/samples/web/content/apprtc
目前正在查看更改以查看可能破坏它的内容。如果我发现了什么,我会更新这个答案。
更新:看起来他们在此提交中做了一些重大更改:
他们正在从 GAE 频道 api 转移到 websocket 频道。
我正在 Android 中本地实现 WebRTC。我能够按照此处 http://www.webrtc.org/native-code/android 所述编译和运行代码,但我遇到了一个问题,其中 apprtc.appspot.com 显然没有 return 假设的通道令牌:
01-05 20:01:51.230 15488-15488/org.appspot.apprtc E/AppRTCDemoActivity﹕ Fatal error: Missing channelToken in HTML: <!DOCTYPE html>
<!--
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree.
-->
<html>
<head>
<title>WebRTC Reference App</title>
<meta charset="utf-8">
<meta name="description" content="WebRTC reference app">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script><link rel="canonical" href="https://apprtc.appspot.com/room/42272483?r=fh">
<link rel="stylesheet" href="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/css/A.main.css.pagespeed.cf.mluzaRyZGPUUQu3CIFwW.css">
</head>
<body><noscript><meta HTTP-EQUIV="refresh" content="0;url='https://apprtc.appspot.com/r/42272483?r=fh&PageSpeed=noscript'" /><style><!--table,div,span,font,p{display:none} --></style><div style="display:block">Please click <a href="https://apprtc.appspot.com/r/42272483?r=fh&PageSpeed=noscript">here</a> if you are not redirected within a few seconds.</div></noscript>
<div id="videos">
<video id="mini-video" autoplay muted></video>
<canvas id="remote-canvas"></canvas>
<video id="remote-video" autoplay></video>
<video id="local-video" autoplay muted></video>
</div>
<footer>
<div id="sharing">
<div id="room-link">Waiting for someone to join this room: <a href="https://apprtc.appspot.com/room/42272483?r=fh" target="_blank">https://apprtc.appspot.com/room/42272483?r=fh</a></div>
</div>
<div id="info"></div>
<div id="status"></div>
</footer>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/stats.js.pagespeed.jm.A-w15PL7V0sRNC026ANH.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/signaling.js.pagespeed.jm.QZ7VRUXKfNhiyV7jHkmW.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/infobox.js.pagespeed.jm.C9t_78UyYtO6bMRljt_L.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/sdputils.js.pagespeed.jm.DWy54ENwSOTLQKw10p1o.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/util.js.pagespeed.jm.q3iuB_S1TC2eBJC_RFlb.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/main.js.pagespeed.jm.mR4sH1O_ReNLDaNiS3o_.js"></script>
<script src="https://1-ps.googleusercontent.com/sxk/j1xSZgZ8VRf8QgCJPihVzk5mBR/s.apprtc.appspot.com/apprtc.appspot.com/js/adapter.js.pagespeed.jm.-Ip1bBjviqtsxeGluAGS.js"></script>
<script type="text/javascript">var params={errorMessages:[],isLoopback:false,roomId:'42272483',roomLink:'https://apprtc.appspot.com/room/42272483?r=fh',mediaConstraints:{"audio":true,"video":true},offerConstraints:{"optional":[],"mandatory":{}},peerConnectionConfig:{"iceServers":[]},peerConnectionConstraints:{"optional":[{"googImprovedWifiBwe":true}]},turnRequestUrl:'https://computeengineondemand.appspot.com/turn?username=280585048&key=4080218913',turnTransports:'',audioSendBitrate:'',audioSendCodec:'',audioRecvBitrate:'',audioRecvCodec:'',isStereoscopic:'',opusMaxPbr:'',opusFec:'',opusStereo:'',videoSendBitrate:'',videoSendInitialBitrate:'',videoSendCodec:'',videoRecvBitrate:'',videoRecvCodec:'',wssUrl:'wss://apprtc-ws.webrtc.org:443/ws',wssPostUrl:'https://apprtc-ws.webrtc.org:443'};initialize();</script>
<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.cr
在此处检查 AppRTCClient.java 的源代码时 https://code.google.com/p/webrtc/source/browse/trunk/talk/examples/android/src/org/appspot/apprtc/AppRTCClient.java?r=5847 我在第 234ff 行发现了一个有趣的评论,正是应用程序失败的功能:
// Fetches |url| and fishes the signaling parameters out of the HTML via
// regular expressions.
//
// TODO(fischman): replace this hackery with a dedicated JSON-serving URL in
// apprtc so that this isn't necessary (here and in other future apps that
// want to interop with apprtc).
private AppRTCSignalingParameters getParametersForRoomUrl(String url)
throws IOException {
// ...
}
在函数中发生了很多 html 代码的解析,似乎通道令牌没有正确地从服务器的响应 html return 中解析出来(难怪).
我没有进一步调查频道令牌是否存在and/or是否正确。相反,我怀疑代码(主干!)可能已经过时,用谷歌搜索并在 Github 上找到了这个项目:https://github.com/pristineio/webrtc-android
相同的函数,在第 232ff 行,将 &t=json 作为参数传入,据说是因为它希望服务器 return Json。然后该函数在解析 Json 时失败,猜猜原因。答对了!因为相同的 html 页面是 returned,有或没有参数。
// Fetches |url| and fishes the signaling parameters out of the JSON.
private AppRTCSignalingParameters getParametersForRoomUrl(String url)
throws IOException, JSONException {
url = url + "&t=json";
// ...
}
为了完整起见,完整的 URL 失败了:
https://apprtc.appspot.com/?r=00000000&t=json
其中 00000000 是房间号。
看来 Google 的 Fischman 先生同时更新了代码,但是 webrtc 的代码不是最新的,Github 的 pristineio/webrtc-android 似乎知道曾经使 apprtc.appspot.com return Json 而不是 html 的参数,但它不再这样做了。
我用谷歌搜索但找不到 apprtc.appspot.com 的服务器代码,但我记得以前见过它(我相信它是一个 Python 项目)。
- 有人有那个源代码的 link 吗?
然后我搜索了那个 URL 的参数,我发现有两个页面列出了这些参数,包括 http://samdutton.github.io/webrtc/samples/web/content/apprtc/params.html,但它们都没有显示参数或替代 URL 来请求结果为 Json.
- 有人知道正确的参数(或 url)是什么吗?
- 或者有人知道完整的规格是什么吗?
- 或者有人 link AppRTCClient.Java 的最新可用源代码吗?
谢谢!
运行 和你一样的问题。我在这里找到代码:
https://github.com/GoogleChrome/webrtc/tree/master/samples/web/content/apprtc
目前正在查看更改以查看可能破坏它的内容。如果我发现了什么,我会更新这个答案。
更新:看起来他们在此提交中做了一些重大更改:
他们正在从 GAE 频道 api 转移到 websocket 频道。