2012-05-19 83 views
8

我在寫一些廣泛使用ffmpeg的軟件,它是多線程的,有多個類實例。在ffmpeg中檢測超時

如果網絡連接丟失ffmpeg在讀取時掛起。我發現了一個方法來指派FFmpeg的火災回調定期檢查它是否應該退出與否:

static int interrupt_cb(void *ctx) 
{ 

// do something 
    return 0; 
} 

static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL }; 

...

AVFormatContext* formatContext = libffmpeg::avformat_alloc_context(); 
formatContext->interrupt_callback = int_cb; 
if (libffmpeg::avformat_open_input(&formatContext, fileName, NULL, NULL) !=0) {...} 

這一切都很好,但無處在網絡上我能找到* ctx包含什麼,以及如何確定回調是否應該返回1或0.我不能指定靜態「中止」標誌,因爲類有很多實例。我也無法調試代碼,因爲Visual Studio拒絕在返回0上設置斷點;聲稱沒有可執行代碼與該位置相關聯。有任何想法嗎?

回答

7

找到在FFmpeg documentation

在阻塞操作,回調調用與不透明作爲 參數。如果回調返回1,阻止操作將會中止 。

下面是聲明int_cb從您的代碼類型AVIOInterruptCB結構的變量:

static const libffmpeg::AVIOInterruptCB int_cb = { interrupt_cb, NULL }; 

你宣佈不透明參數作爲NULL

我建議重寫這樣的初始化代碼:

AVFormatContext* formatContext = libffmpeg::avformat_alloc_context(); 
formatContext->interrupt_callback.callback = interrupt_cb; 
formatContext->interrupt_callback.opaque = formatContext; 

,你將能夠訪問內部interrupt_cb formatContext例如:

static int interrupt_cb(void *ctx) 
{ 
    AVFormatContext* formatContext = reinterpret_cast<AVFormatContext*>(ctx); 
// do something 
    return 0; 
} 
+0

你好,謝謝,是的,我讀過,我不知道什麼o包含。 – Sean

+0

好的 - 那我該在那裏放什麼?如果它是一個靜態常量,它不會很好地與多個實例... – Sean

+0

確定輝煌,謝謝!通過訪問formatContext,我該如何檢測到流已超時? – Sean

2

你可以通過不僅AVFormatContext * formatContext,但任何其他有用的指針某些實例,其中包含有用的數據來確定,哪個線程超時