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_m3u8(void* session, const std::string& path) { void* m3u8 = s_playlists.find(path)->second->m3u8; assert(m3u8); void* bundle = http_bundle_alloc(4 * 1024); void* ptr = http_bundle_lock(bundle); assert(0 == hls_m3u8_playlist(m3u8, 0, (char*)ptr, 4 * 1024)); http_bundle_unlock(bundle, strlen((char*)ptr)); http_server_set_header(session, "content-type", HLS_M3U8_TYPE); http_server_set_header(session, "Access-Control-Allow-Origin", "*"); http_server_set_header(session, "Access-Control-Allow-Methods", "GET, POST, PUT"); http_server_send(session, 200, bundle); http_bundle_free(bundle); printf("load %s.m3u8 file\n", path.c_str()); return 0; }