int StHlsTask::DownloadTS(StHttpClient& client, M3u8TS& ts){ int ret = ERROR_SUCCESS; HttpUrl url; if((ret = url.Initialize(ts.ts_url)) != ERROR_SUCCESS){ Error("initialize ts url failed. ret=%d", ret); return ret; } Info("[TS] url=%s, duration=%.2f, delay=%.2f", url.GetUrl(), ts.duration, delay_seconds); statistic->OnSubTaskStart(GetId(), ts.ts_url); if((ret = client.DownloadString(&url, NULL)) != ERROR_SUCCESS){ statistic->OnSubTaskError(GetId(), (int)ts.duration); Error("http client download ts file %s failed. ret=%d", url.GetUrl(), ret); return ret; } int sleep_ms = StUtility::BuildRandomMTime((delay_seconds >= 0)? delay_seconds:ts.duration); Trace("[TS] url=%s download, duration=%.2f, delay=%.2f, size=%"PRId64", sleep %dms", url.GetUrl(), ts.duration, delay_seconds, client.GetResponseHeader()->content_length, sleep_ms); st_usleep(sleep_ms * 1000); statistic->OnSubTaskEnd(GetId(), (int)ts.duration); return ret; }
int StHttpClient::on_headers_complete(http_parser* parser){ StHttpClient* obj = (StHttpClient*)parser->data; obj->OnHeaderCompleted(parser); // see http_parser.c:1570, return 1 to skip body. return 1; }
int StHlsTask::ProcessM3u8(StHttpClient& client){ int ret = ERROR_SUCCESS; string m3u8; if((ret = client.DownloadString(&url, &m3u8)) != ERROR_SUCCESS){ Error("http client get m3u8 failed. ret=%d", ret); return ret; } Trace("[HLS] get m3u8 %s get success, length=%"PRId64, url.GetUrl(), (int64_t)m3u8.length()); string variant; vector<M3u8TS> ts_objects; if((ret = HlsM3u8Parser::ParseM3u8Data(&url, m3u8, ts_objects, target_duration, variant)) != ERROR_SUCCESS){ Error("http client parse m3u8 content failed. ret=%d", ret); return ret; } if (!variant.empty()) { if ((ret = url.Initialize(variant)) != ERROR_SUCCESS) { Error("parse variant=%s failed, ret=%d", variant.c_str(), ret); return ret; } return ret; } if((ret = ProcessTS(client, ts_objects)) != ERROR_SUCCESS){ Error("http client download m3u8 ts file failed. ret=%d", ret); return ret; } return ret; }