Ticket #9356: ffmpeg_mpegts_infiniteloop.cpp

File ffmpeg_mpegts_infiniteloop.cpp, 2.1 KB (added by SuRGeoNix, 5 years ago)
Line 
1#include <fstream>
2#include <time.h>
3#include <string.h>
4
5extern "C" {
6 #include "libavformat/avformat.h"
7 #include "libavutil/avutil.h"
8
9}
10
11using namespace std;
12
13std::ofstream logfile;
14
15string Log(string msg) {
16 char tmpbuf[128];
17 _strtime_s(tmpbuf, 128);
18 string tmpstr(tmpbuf);
19
20 return "[" + tmpstr + "]: " + msg;
21}
22
23void 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
30int 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}