最近在做自定義Chromecast Receiver的項目,但是在開發過程中,暫時沒有真實的裝置和APP ID,是以隻好找一個模拟器對開發的Receiver進行測試。
模拟器Chromecast Device Emulator:https://github.com/ajhsu/chromecast-device-emulator
一、模拟器工作原理
首先我們來看一下真實Google Cast的使用流程。如下圖所示,左側是在真實場景中Sender、Cast device、Receiver的之間的通信圖。我們可以看到Sender app中,使用者可能執行加載視訊(load)、播放(play)、暫停(pause)等操作。當執行這些動作時,Sender app會通過Sender SDK把這些資訊通過發送IPCMessages的方式發送到Cast device中。而Cast device隻是轉發了這些IPCMessages給Receiver App。Receiver接受到資訊後則做出響應。
在無真實裝置開發的場景中,我們所需要的模拟器實作的功能就是轉發IPCMessages。但是因為沒有真實的裝置,是以我們需要預先把使用者可能執行的操作的資訊記錄下來,讓模拟器轉發,確定Receiver能收到IPCMessages即可。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL31ERNBTTE90dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxQjM4UDM0AjMyEDMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、安裝方法
2.1 全局安裝/CLI:
npm install chromecast-device-emulator -g
安裝後,将iIPCMessages内容寫入一個json檔案中,啟動CLI即可向Receiver發送IPCMessages。啟動方法以下兩種任選其一:
chromecast-device-emulator start scenario.json
cde start scenario.json
2.2 局部安裝/Node
在項目中的開發環境中安裝chromcast-device-emulator的node api,如下:
npm install chromecast-device-emulator --save-dev
然後在項目中引入cde的包并建立一個模拟器:
var CastDeviceEmulator = require('chromecast-device-emulator');
// 建立一個instance
var emulator = new CastDeviceEmulator();
// 加載預記錄IPCMessages的json檔案
emulator.loadScenario(require(your_json_path));
// 啟動模拟器
emulator.start();
// do something
// 關閉模拟器
emulator.stop();
三、scenario.json
像github中提供的文檔,是建議使用IPC Message Recorder去記錄來自真實裝置的資訊内容。但是暫時還未申請SDK的情況下,而且我在項目中隻是需要擷取一個URL,是以我就參考example中的例子,僅寫了一個特簡單的LOAD類型IPCMessage,大家也可以依據自己的項目情況編寫scenario.json檔案。以下是我寫的:
{
"timeline": [{
"time": 844,
"ipcMessage": "{\"data\":\"{\\\"applicationId\\\":\\\"4F8B483\\\",\\\"applicationName\\\":\\\"testing app\\\",\\\"closedCaption\\\":{},\\\"deviceCapabilities\\\":{\\\"bluetooth_supported\\\":true,\\\"display_supported\\\":true,\\\"focus_state_supported\\\":true,\\\"hi_res_audio_supported\\\":false},\\\"launchingSenderId\\\":\\\"7f8b100d-a1fe-e60b-5a35-6feaa22976df.2:sender-l4koe754cbxf\\\",\\\"messagesVersion\\\":\\\"1.0\\\",\\\"sessionId\\\":\\\"46fd154e-f03d-4d58-986d-4998c43639a7\\\",\\\"type\\\":\\\"ready\\\",\\\"version\\\":\\\"1.30.113131\\\"}\",\"namespace\":\"urn:x-cast:com.google.cast.system\",\"senderId\":\"SystemSender\"}"
},
{
"time": 1064,
"ipcMessage": "{\"data\":\"{\\\"type\\\":\\\"LOAD\\\",\\\"requestId\\\":889570262,\\\"sessionId\\\":\\\"46fd154e-f03d-4d58-986d-4998c43639a7\\\",\\\"media\\\":{\\\"contentId\\\":\\\"http://localhost/source/test.mp4\\\"},\\\"autoplay\\\":true}\",\"namespace\":\"urn:x-cast:com.google.cast.media\",\"senderId\":\"7f8b100d-a1fe-e60b-5a35-6feaa22976df.2:152792770056491611\"}"
}]
}
其中contentId就是需要傳送的URL,type是操作類型,autopaly:true指定加載視訊完成後自動播放。