| 1 | #include <fstream>
|
|---|
| 2 | #include <time.h>
|
|---|
| 3 | #include <string.h>
|
|---|
| 4 |
|
|---|
| 5 | extern "C" {
|
|---|
| 6 | #include "libavformat/avformat.h"
|
|---|
| 7 | #include "libavutil/avutil.h"
|
|---|
| 8 |
|
|---|
| 9 | }
|
|---|
| 10 |
|
|---|
| 11 | using namespace std;
|
|---|
| 12 |
|
|---|
| 13 | std::ofstream logfile;
|
|---|
| 14 |
|
|---|
| 15 | string Log(string msg) {
|
|---|
| 16 | char tmpbuf[128];
|
|---|
| 17 | _strtime_s(tmpbuf, 128);
|
|---|
| 18 | string tmpstr(tmpbuf);
|
|---|
| 19 |
|
|---|
| 20 | return "[" + tmpstr + "]: " + msg;
|
|---|
| 21 | }
|
|---|
| 22 |
|
|---|
| 23 | void FFmpegLog(void * ptr, int level, const char* fmt, va_list valist) {
|
|---|
| 24 | char buffer[10 * 1024];
|
|---|
| 25 | int prefix = 1;
|
|---|
| 26 | av_log_format_line2(ptr, level, fmt, valist, buffer, 10 * 1024, &prefix);
|
|---|
| 27 | logfile << Log(buffer);
|
|---|
| 28 | }
|
|---|
| 29 |
|
|---|
| 30 | int main()
|
|---|
| 31 | {
|
|---|
| 32 | int ret;
|
|---|
| 33 | logfile.open("log.txt", ios_base::app);
|
|---|
| 34 | logfile << "\r\n============================================[STARTED]===================================================\r\n";
|
|---|
| 35 |
|
|---|
| 36 | av_log_set_level(AV_LOG_INFO);
|
|---|
| 37 | av_log_set_callback(FFmpegLog);
|
|---|
| 38 |
|
|---|
| 39 | AVFormatContext* fmtCtx = avformat_alloc_context();
|
|---|
| 40 |
|
|---|
| 41 | AVDictionary* opt = NULL;
|
|---|
| 42 | av_dict_set(&opt, "resync_size", "0", 0);
|
|---|
| 43 | ret = avformat_open_input(&fmtCtx, "https://cph-p2p-msl.akamaized.net/hls/live/2000341/test/level_3.m3u8", NULL, &opt);
|
|---|
| 44 | if (ret < 0) { logfile << Log("Error avformat_open_input " + ret + '\r\n'); return -1; }
|
|---|
| 45 |
|
|---|
| 46 | ret = avformat_find_stream_info(fmtCtx, NULL);
|
|---|
| 47 | if (ret < 0) { logfile << Log("Error avformat_find_stream_info " + ret + '\r\n'); return -1; }
|
|---|
| 48 |
|
|---|
| 49 | for (int i = 0; i < fmtCtx->nb_streams; i++)
|
|---|
| 50 | fmtCtx->streams[i]->discard = AVDISCARD_ALL;
|
|---|
| 51 |
|
|---|
| 52 | fmtCtx->streams[0]->discard = AVDISCARD_DEFAULT;
|
|---|
| 53 |
|
|---|
| 54 | fmtCtx->ctx_flags &= ~AVFMTCTX_UNSEEKABLE;
|
|---|
| 55 | //ret = av_seek_frame(fmtCtx, -1, fmtCtx->start_time + (6 * 1000 * 1000), 0); // SUCCESS
|
|---|
| 56 | ret = av_seek_frame(fmtCtx, -1, fmtCtx->start_time + (60 * 1000 * 1000), 0); // FAIL (Infinite loop)
|
|---|
| 57 | if (ret < 0) { logfile << Log("Error av_seek_frame " + ret + '\r\n'); return -1; }
|
|---|
| 58 |
|
|---|
| 59 | AVPacket* packet = av_packet_alloc();
|
|---|
| 60 | ret = av_read_frame(fmtCtx, packet);
|
|---|
| 61 | if (ret < 0) { logfile << Log("Error av_read_frame " + ret + '\r\n'); return -1; }
|
|---|
| 62 | av_packet_free(&packet);
|
|---|
| 63 |
|
|---|
| 64 | logfile << "\r\n=============================================[ENDED]====================================================\r\n";
|
|---|
| 65 | }
|
|---|