1,基本上找到播放cctv直播的解决方案了。这网站用了wasm,但代码是加密的。我找了个emscripten的代码:
G:\emsdk\upstream\install\emscripten\node_modules\wasm2c\wasm2c.js
G:\emsdk\upstream\install\emscripten\src\preamble.js
终于找到那句failed to load wasm binary file at xx的来源了。原来是mb的fetch在面对data url的时候,实现有点问题。可能是版本太老导致。
mb的fetch还没等data url的response stream返回,有可能因为gc,导致一些类被回收了:
这里会意外析构SharedMemoryDataConsumerHandle::ReaderImpl
> node.dll!net::SharedMemoryDataConsumerHandle::ReaderImpl::~ReaderImpl() 行 456 C++ 已加载符号。
node.dll!net::SharedMemoryDataConsumerHandle::ReaderImpl::`scalar deleting destructor'(unsigned int) C++ 非用户代码。已加载符号。
[内联框架] node.dll!WTF::OwnedPtrDeleter<blink::WebDataConsumerHandle::Reader>::deletePtr(blink::WebDataConsumerHandle::Reader * ptr) 行 52 C++ 非用户代码。已加载符号。
[内联框架] node.dll!WTF::OwnPtr<blink::WebDataConsumerHandle::Reader>::{dtor}() 行 55 C++ 非用户代码。已加载符号。
node.dll!blink::`anonymous namespace'::WebToFetchDataConsumerHandleAdapter::ReaderImpl::`scalar deleting destructor'(unsigned int) C++ 非用户代码。已加载符号。
[内联框架] node.dll!WTF::OwnedPtrDeleter<blink::FetchDataConsumerHandle::Reader>::deletePtr(blink::FetchDataConsumerHandle::Reader *) 行 52 C++ 已加载符号。
[内联框架] node.dll!WTF::OwnPtr<blink::FetchDataConsumerHandle::Reader>::clear() 行 116 C++ 已加载符号。
[内联框架] node.dll!blink::Body::ReadableStreamSource::createDrainingStream() 行 65 C++ 已加载符号。
[内联框架] node.dll!blink::Body::createDrainingStream() 行 364 C++ 已加载符号。
node.dll!blink::Body::readAsync(blink::ScriptState * scriptState, blink::Body::ResponseType type) 行 233 C++ 已加载符号。
node.dll!blink::Body::arrayBuffer(blink::ScriptState * scriptState) 行 310 C++ 已加载符号。
[内联框架] node.dll!blink::ResponseV8Internal::arrayBufferMethod(const v8::FunctionCallbackInfo<v8::Value> &) 行 254 C++ 已加载符号。
解决方案是把一些类的生命周期丢给SharedMemoryDataConsumerHandle来管。
解决了这问题,目前还有response['ok']没设置、音频无法播放的问题。音频的问题比较麻烦点。因为音频的一部分实现在content层。需要挪过来