咨询:如何为Nest电池摄像头生成有效OfferSdp?
生成Nest Camera Live Stream的有效OfferSdp(附curl命令和Python脚本)
我明白你想要一个更直观的方式来生成符合Nest要求的OfferSdp,尤其是类似其他Nest API请求的curl命令,还有封装好的Python脚本对吧?官方文档里这块确实没讲透,下面给你直接上可用的方案:
先明确OfferSdp的核心要求
Nest的GenerateWebRtcStream接口需要的OfferSdp是符合WebRTC标准的SDP字符串,必须包含视频(优先H.264编码)和音频(OPUS编码)的媒体描述,同时要适配Nest设备的能力。这里给你一个简化但有效的模板,你可以直接用或者按需调整:
v=0 o=- 12345 12345 IN IP4 0.0.0.0 s=- t=0 0 m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 c=IN IP4 0.0.0.0 a=rtcp-mux a=ice-ufrag:abc123 a=ice-pwd:def456 a=fingerprint:sha-256 AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99 a=setup:actpass a=mid:video a=sendrecv a=rtpmap:96 H264/90000 a=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f a=rtpmap:97 VP8/90000 a=rtpmap:98 VP9/90000 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp-mux a=ice-ufrag:abc123 a=ice-pwd:def456 a=fingerprint:sha-256 AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99 a=setup:actpass a=mid:audio a=sendrecv a=rtpmap:111 opus/48000/2 a=fmtp:111 minptime=10;useinbandfec=1
1. 直接用curl命令调用接口
把上面的SDP模板作为offerSdp的值,替换掉下面的占位符(${ENTERPRISE_ID}、${DEVICE_ID}、${OAUTH_TOKEN}),直接运行即可:
curl -X POST "https://smartdevicemanagement.googleapis.com/v1/enterprises/${ENTERPRISE_ID}/devices/${DEVICE_ID}:generateWebRtcStream" \ -H "Authorization: Bearer ${OAUTH_TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "offerSdp": "v=0\n\no=- 12345 12345 IN IP4 0.0.0.0\n\ns=-\n\nt=0 0\n\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98\n\nc=IN IP4 0.0.0.0\n\na=rtcp-mux\n\na=ice-ufrag:abc123\n\na=ice-pwd:def456\n\na=fingerprint:sha-256 AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99\n\na=setup:actpass\n\na=mid:video\n\na=sendrecv\n\na=rtpmap:96 H264/90000\n\na=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\n\na=rtpmap:97 VP8/90000\n\na=rtpmap:98 VP9/90000\n\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126\n\nc=IN IP4 0.0.0.0\n\na=rtcp-mux\n\na=ice-ufrag:abc123\n\na=ice-pwd:def456\n\na=fingerprint:sha-256 AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99\n\na=setup:actpass\n\na=mid:audio\n\na=sendrecv\n\na=rtpmap:111 opus/48000/2\n\na=fmtp:111 minptime=10;useinbandfec=1" }'
⚠️ 注意:SDP里的换行符要转义为\n,否则JSON格式会报错。
2. 封装成Python脚本(自动生成有效SDP)
如果想更灵活,用Python脚本可以自动生成符合WebRTC标准的OfferSdp(依赖aiortc库生成真实的SDP,比手动写模板更可靠):
首先安装依赖:
pip install requests aiortc
然后是脚本:
import requests import asyncio from aiortc import RTCPeerConnection, MediaStreamTrack async def generate_valid_offersdp(): # 创建WebRTC PeerConnection实例,自动生成符合标准的SDP pc = RTCPeerConnection() # 添加虚拟的视频、音频轨道(不需要真实媒体,只为生成SDP结构) class DummyVideoTrack(MediaStreamTrack): kind = "video" pc.addTrack(DummyVideoTrack()) class DummyAudioTrack(MediaStreamTrack): kind = "audio" pc.addTrack(DummyAudioTrack()) # 创建Offer并获取SDP offer = await pc.createOffer() await pc.setLocalDescription(offer) offersdp = pc.localDescription.sdp await pc.close() return offersdp def call_nest_stream_api(enterprise_id, device_id, oauth_token, offersdp): api_url = f"https://smartdevicemanagement.googleapis.com/v1/enterprises/{enterprise_id}/devices/{device_id}:generateWebRtcStream" headers = { "Authorization": f"Bearer {oauth_token}", "Content-Type": "application/json" } payload = {"offerSdp": offersdp} response = requests.post(api_url, json=payload) response.raise_for_status() # 捕获API请求错误 return response.json() if __name__ == "__main__": # 替换成你的实际参数 ENTERPRISE_ID = "your-enterprise-id" DEVICE_ID = "your-nest-device-id" OAUTH_TOKEN = "your-oauth-access-token" # 生成OfferSdp并调用API获取AnswerSDP offersdp = asyncio.run(generate_valid_offersdp()) result = call_nest_stream_api(ENTERPRISE_ID, DEVICE_ID, OAUTH_TOKEN, offersdp) print("获取到的AnswerSDP:\n", result["answerSdp"])
关键注意事项
- 如果你不想用
aiortc,可以直接用前面的SDP模板,但建议每次请求更换ice-ufrag、ice-pwd和fingerprint的值(随机生成即可)。 - 确保你的OAuth Token拥有
https://www.googleapis.com/auth/sdm.service权限。 - 如果遇到SDP无效的错误,优先检查视频编码是否为H.264,音频是否为OPUS——这是Nest设备优先支持的格式。
内容的提问来源于stack exchange,提问作者user1446797
相关产品推荐
相关产品推荐

