void hls_segmenter_flv(const char* file) { hls_m3u8_t* m3u = hls_m3u8_create(0, 3); hls_media_t* hls = hls_media_create(HLS_DURATION * 1000, hls_handler, m3u); void* flv = flv_reader_create(file); flv_demuxer_t* demuxer = flv_demuxer_create(flv_handler, hls); int r, type; uint32_t timestamp; static char data[2 * 1024 * 1024]; while ((r = flv_reader_read(flv, &type, ×tamp, data, sizeof(data))) > 0) { flv_demuxer_input(demuxer, type, data, r, timestamp); } // write m3u8 file hls_media_input(hls, STREAM_VIDEO_H264, NULL, 0, 0, 0, 0); hls_m3u8_playlist(m3u, 1, data, sizeof(data)); FILE* fp = fopen("playlist.m3u8", "wb"); fwrite(data, 1, strlen(data), fp); fclose(fp); flv_demuxer_destroy(demuxer); flv_reader_destroy(flv); hls_media_destroy(hls); hls_m3u8_destroy(m3u); }
static int hls_server_onhttp(void* http, void* session, const char* method, const char* path) { // decode request uri void* url = url_parse(path); std::string s = url_getpath(url); url_free(url); path = s.c_str(); if (0 == strncmp(path, "/live/", 6)) { std::vector<std::string> paths; Split(path + 6, "/", paths); if (strendswith(path, ".m3u8") && 1 == paths.size()) { std::string app = paths[0].substr(0, paths[0].length() - 5); if (s_playlists.find(app) == s_playlists.end()) { hls_playlist_t* playlist = new hls_playlist_t(); playlist->file = app; playlist->m3u8 = hls_m3u8_create(HLS_LIVE_NUM); playlist->hls = hls_media_create(HLS_DURATION * 1000, hls_handler, playlist); playlist->i = 0; s_playlists[app] = playlist; thread_create(&playlist->t, hls_server_worker, playlist); } return hls_server_m3u8(session, app); } else if (strendswith(path, ".ts") && 2 == paths.size()) { if (s_playlists.find(paths[0]) != s_playlists.end()) { return hls_server_ts(session, paths[0], paths[1]); } } } else if (0 == strncmp(path, "/vod/", 5)) { if (path_testfile(path+5)) { return hls_server_reply_file(session, path + 5); } } return hls_server_reply(session, 404, ""); }