gpt4 book ai didi

c++ - Widevine session 更新无限循环

转载 作者:行者123 更新时间:2023-12-02 10:37:19 26 4
gpt4 key购买 nike

我正在使用 libwidevinecdm.so从 chrome 处理 DRM 保护的数据。我目前正在成功设置从许可证服务器获得的 Widevine 服务器证书。我还可以使用我试图解码的媒体的 pssh 框创建一个 session 。到目前为止,一切都很成功(所有 promise 都可以解决)。

( session 创建如下:_cdm->CreateSessionAndGenerateRequest(promise_id, cdm::SessionType::kTemporary, cdm::InitDataType::kCenc, pssh_box.data(), static_cast<uint32_t>(pssh_box.size()));)

然后我收到类型为 kLicenseRequest 的 session 消息我将其转发到相应的许可证服务器。许可证服务器以有效响应和与我在使用 Chrome 时在浏览器中看到的相同数量的数据进行响应。然后我将它传递给我的 session ,如下所示:

        _cdm->UpdateSession(promise_id, session_id.data(), static_cast<uint32_t>(session_id.size()),
license_response.data(), static_cast<uint32_t>(license_response.size()));

现在的问题是这个 promise 永远不会解决。它不断发布 kLicenseRequest一遍又一遍地向我的 session 发送消息,而从未返回。这是否意味着我的 react 是错误的?或者这是别的什么?


亚尼克

最佳答案

问题是由 CreateSessionAndGenerateRequest 中的所有内容引起的。同步完成 - 这意味着到 CreateSessionAndGenerateRequest返回您的 promise 将始终得到解决。

CDM 将发出 kLicenseRequest里面 CreateSessionAndGenerateRequest并且它不会以“fire & forget”的方式执行此操作,但该函数会在那里等待,直到您从 cdm::Host_10::OnSessionMessage 返回。 .自从我实现 OnSessionMessage之前正在创建对许可证服务器的同步 HTTP 请求 - 也是同步的 - 调用 UpdateSession整个链条最终都被阻塞了。

所以最终我调用UpdateSession还在里面CreateSessionAndGenerateRequest我假设 CDM 无法处理此问题,并通过使用给定 ID 创建新 session 并再次生成请求来使用react,这当然触发了另一个 UpdateSession等等。

最终,打破循环的最简单方法是使某些东西异步。我决定在收到 kLicenseRequest 时启动一个单独的线程, 等待几毫秒以确保 CreateSessionAndGenerateRequest有时间完成(不确定是否真的需要),然后向许可证服务器发出请求。

我必须做的唯一更改是添加周围的 std::thread :

    void WidevineSession::forward_license_request(const std::vector<uint8_t> &data) {
std::thread{
[=]() {
std::this_thread::sleep_for(std::chrono::milliseconds{100});

net::HttpRequest request{"POST", _license_server_url};
request.add_header("Authorization", fmt::format("Bearer {}", _access_token))
.byte_body(data);

const auto response = _client.execute(request);
if (response.status_code() != 200) {
log->error("Widevine license request not accepted by license server: {} {} ({})", response.status_code(), response.status_text(), utils::bytes_to_utf8(response.body()));
throw std::runtime_error{"Error requesting widevine license"};
}

log->info("Successfully requested widevine license from license server");
_adapter->update_session(this, _session_id, response.body());
}
}.detach();
}

关于c++ - Widevine session 更新无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59653928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com