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 STDCALL hls_server_worker(void* param) { int r, type; time64_t clock; uint32_t timestamp; hls_playlist_t* playlist = (hls_playlist_t*)param; std::string file = playlist->file + ".flv"; while (1) { void* flv = flv_reader_create(file.c_str()); void* demuxer = flv_demuxer_create(flv_handler, playlist->hls); clock = 0; static unsigned char packet[2 * 1024 * 1024]; while ((r = flv_reader_read(flv, &type, ×tamp, packet, sizeof(packet))) > 0) { time64_t now = time64_now(); if (0 == clock) { clock = now; } else { if (timestamp > now - clock) system_sleep(timestamp - (now - clock)); } assert(0 == flv_demuxer_input(demuxer, type, packet, r, timestamp)); } flv_demuxer_destroy(demuxer); flv_reader_destroy(flv); } hls_media_destroy(playlist->hls); //hls_m3u8_destroy(playlist->m3u8); //s_playlists.erase(); //delete playlist; return thread_destroy(playlist->t); }