Commit 9a922a540331a84dd301eda625ebb38be6bded06
1 parent
7442c1d4
自动请求流修改到了sip服务端,解码器这里超过3分钟未收到流这自动结束解码器
Showing
2 changed files
with
40 additions
and
167 deletions
src/decoder/gb28181/rtp/RTPUdpReceiver.cpp
... | ... | @@ -62,7 +62,7 @@ static int connecting_thread_(void* param) |
62 | 62 | } |
63 | 63 | |
64 | 64 | RTPUdpReceiver* self = (RTPUdpReceiver*)param; |
65 | - return self->IsConnecting(); | |
65 | + return self->CheckConnecting(); | |
66 | 66 | } |
67 | 67 | |
68 | 68 | RTPUdpReceiver::RTPUdpReceiver() |
... | ... | @@ -175,161 +175,37 @@ int RTPUdpReceiver::OnRtpRecv() |
175 | 175 | return -1; |
176 | 176 | } |
177 | 177 | |
178 | + m_bRecvExit = false; | |
179 | + | |
178 | 180 | LOG_INFO("[{}] OnRtpRecv started.", m_SipChannelId); |
179 | - while (!m_bRtpExit) | |
181 | + while (!m_bRecvExit) | |
180 | 182 | { |
181 | - //try | |
182 | - //{ | |
183 | - m_rtpSessionPtr->Poll(); | |
184 | - m_rtpSessionPtr->BeginDataAccess(); | |
185 | - | |
186 | - if (m_rtpSessionPtr->GotoFirstSourceWithData()) | |
183 | + m_rtpSessionPtr->Poll(); | |
184 | + m_rtpSessionPtr->BeginDataAccess(); | |
185 | + | |
186 | + if (m_rtpSessionPtr->GotoFirstSourceWithData()) | |
187 | + { | |
188 | + // LOG_INFO("OnRtpRecv GotoFirstSourceWithData --{}", m_SipChannelId); | |
189 | + last_recv_ts = UtilTools::get_cur_time_ms(); | |
190 | + m_idleCount = 0; | |
191 | + m_noDataCount = 0; | |
192 | + do | |
187 | 193 | { |
188 | - // LOG_INFO("OnRtpRecv GotoFirstSourceWithData --{}", m_SipChannelId); | |
189 | - last_recv_ts = UtilTools::get_cur_time_ms(); | |
190 | - m_idleCount = 0; | |
191 | - m_noDataCount = 0; | |
192 | - do | |
194 | + RTPPacket* packet; | |
195 | + while ((packet = m_rtpSessionPtr->GetNextPacket()) != NULL) | |
193 | 196 | { |
194 | - RTPPacket* packet; | |
195 | - while ((packet = m_rtpSessionPtr->GetNextPacket()) != NULL) | |
196 | - { | |
197 | - m_bNoData = false; | |
198 | - // LOG_INFO("OnRtpRecv GetNextPacket --{}", m_SipChannelId); | |
199 | - int ret = ParsePacket(packet); | |
200 | - m_rtpSessionPtr->DeletePacket(packet); | |
201 | - | |
202 | - if(ret != 0){ | |
203 | - m_bRtpExit = true; | |
204 | - } | |
197 | + m_bNoData = false; | |
198 | + // LOG_INFO("OnRtpRecv GetNextPacket --{}", m_SipChannelId); | |
199 | + int ret = ParsePacket(packet); | |
200 | + m_rtpSessionPtr->DeletePacket(packet); | |
201 | + | |
202 | + if(ret != 0){ | |
203 | + m_bRecvExit = true; | |
205 | 204 | } |
206 | - } while (m_rtpSessionPtr->GotoNextSourceWithData()); | |
207 | - } | |
208 | - //else { | |
209 | - // if (m_idleCount != -1) | |
210 | - // { | |
211 | - // ++m_idleCount;//流中断计数 | |
212 | - // } | |
213 | - // if (m_noDataCount != 0) | |
214 | - // { | |
215 | - // --m_noDataCount;//没流计数 | |
216 | - // } | |
217 | - // //if (m_idleCount > 3000) { | |
218 | - // // m_hVodEndFunc(m_usrParam); | |
219 | - // // m_idleCount = 0; | |
220 | - // //历史流结束的时候,也会出现超时,这个是正常的 | |
221 | - // if(m_usrParam && ((VideoSession *)GetUsrParam())->video_type() == VideoType::ERECORD) | |
222 | - // { | |
223 | - // if (m_idleCount > 10000) | |
224 | - // { | |
225 | - // //这里要判断下历史流是否结束,如果未结束,就设置为流中断 | |
226 | - // //由于record_stream_status这个函数返回值不准确,所以增加一个进度条大于80% | |
227 | - // if(record_stream_status(((VideoSession *)GetUsrParam())->streamHandle())) | |
228 | - // { | |
229 | - // LOG_INFO("************Record stream is finished**{}**m_progress = {}********", m_SipChannelId, ((VideoSession *)GetUsrParam())->progress()); | |
230 | - // m_idleCount = -1; | |
231 | - // m_hVodEndFunc(m_usrParam); | |
232 | - // record_stream_stop(((VideoSession *)GetUsrParam())->streamHandle()); | |
233 | - // ((VideoSession *)GetUsrParam())->streamHandle().clear(); | |
234 | - // } | |
235 | - // else | |
236 | - // { | |
237 | - // //如果此时进度大于80% 算完成吧 | |
238 | - // if(((VideoSession *)GetUsrParam())->progress() > 0.80) | |
239 | - // { | |
240 | - // LOG_INFO("************Record stream is overtime**{}**m_progress = {}********", m_SipChannelId, ((VideoSession *)GetUsrParam())->progress()); | |
241 | - | |
242 | - // m_idleCount = 0; | |
243 | - // m_hVodEndFunc(m_usrParam); | |
244 | - // record_stream_stop(((VideoSession *)GetUsrParam())->streamHandle()); | |
245 | - // ((VideoSession *)GetUsrParam())->streamHandle().clear(); | |
246 | - // } | |
247 | - // else | |
248 | - // { | |
249 | - // m_idleCount = -1; | |
250 | - // //LOG_ERROR("************post ERROR_REALSTREAM_INTERRUPT to structure****{}********", m_SipChannelId); | |
251 | - // //发送流中断 | |
252 | - // //throw GeneralException2(ERROR_REALSTREAM_INTERRUPT, "Record time video streaming interruption!"); | |
253 | - // } | |
254 | - // } | |
255 | - // | |
256 | - // | |
257 | - // } | |
258 | - // | |
259 | - // if (m_noDataCount < -200000)//任务开始时没收到流 | |
260 | - // { | |
261 | - // //LOG_ERROR("************m_hVodEndFunc(m_usrParam)!!!m_hVodEndFunc(m_usrParam)********{}******", m_SipChannelId); | |
262 | - // m_noDataCount = -1; | |
263 | - | |
264 | - // //throw GeneralException2(ERROR_REALSTREAM_INTERRUPT, "Record time video streaming interruption2!"); | |
265 | - // //m_hVodEndFunc(m_usrParam); | |
266 | - // } | |
267 | - // } | |
268 | - // else//实时任务断流 | |
269 | - // //if (m_usrParam && ((VideoSession *)GetUsrParam())->video_type() == VideoType::EREAL) | |
270 | - // { | |
271 | - // | |
272 | - // //每超过3000次,发送一次send_vedio_eof 时长大约1.5s | |
273 | - // //若是30000,时长大约 18s | |
274 | - // if(m_idleCount > 30000) | |
275 | - // { | |
276 | - // uint64_t cts = UtilTools::get_cur_time_ms(); | |
277 | - // float duration_not_recv = (cts - last_recv_ts) / 1000.0; | |
278 | - // | |
279 | - // //LOG_ERROR("************I haven't got stream from hik gateway exceed {}s,send eof********{}******", duration_not_recv, m_SipChannelId); | |
280 | - // m_idleCount = -1; | |
281 | - | |
282 | - // //throw GeneralException2(ERROR_REALSTREAM_INTERRUPT, "Real time video streaming interruption!"); | |
283 | - // } | |
284 | - // | |
285 | - // if (m_noDataCount < -200000)//任务开始时没收到流 | |
286 | - // { | |
287 | - // //LOG_ERROR("************m_noDataCount < -200000********{}******", m_SipChannelId); | |
288 | - // m_noDataCount = -1; | |
289 | - | |
290 | - // //throw GeneralException2(ERROR_REALSTREAM_INTERRUPT, "Real time video streaming interruption2!"); | |
291 | - // } | |
292 | - // | |
293 | - // } | |
294 | - //} | |
295 | - //} | |
296 | - // catch (GeneralException2& e) | |
297 | - //{ | |
298 | - // //LOG_ERROR("---> video streaming interruption!<---{}, error: {}", m_SipChannelId, e.err_msg()); | |
299 | - | |
300 | - // byte_buffer bb(64); | |
301 | - // bb << VasCmd::VAS_CMD_REALSTREAM_INTERRUPT << e.err_msg(); | |
302 | - | |
303 | - // if (m_usrParam) | |
304 | - // { | |
305 | - // if (((VideoSession *)GetUsrParam())->msgChan()->is_valid()) { | |
306 | - // try { | |
307 | - // ((VideoSession *)GetUsrParam())->msgChan()->send_msg(bb.data_ptr(), bb.data_size()); | |
308 | - // } | |
309 | - // catch (GeneralException2& e) { | |
310 | - // //LOG_ERROR("[{}] send vas cmd VAS_CMD_REALSTREAM_INTERRUPT error: {}, {}", m_SipChannelId, e.err_code(), e.err_str()); | |
311 | - // } | |
312 | - // } | |
313 | - | |
314 | - // //通知网关关闭句柄 | |
315 | - // if(!((VideoSession *)GetUsrParam())->streamHandle().empty()) | |
316 | - // { | |
317 | - | |
318 | - // LOG_INFO("---->Notify hisense gateway release handle = {} !<----{}", ((VideoSession *)GetUsrParam())->streamHandle().c_str(), m_SipChannelId); | |
319 | - // if (((VideoSession *)GetUsrParam())->video_type() == VideoType::EREAL) | |
320 | - // real_stream_stop(((VideoSession *)GetUsrParam())->streamHandle()); | |
321 | - // | |
322 | - // if (((VideoSession *)GetUsrParam())->video_type() == VideoType::ERECORD) | |
323 | - // record_stream_stop(((VideoSession *)GetUsrParam())->streamHandle()); | |
324 | - // | |
325 | - // //清理保活的句柄 | |
326 | - // ((VideoSession *)GetUsrParam())->streamHandle().clear(); | |
327 | - // } | |
328 | - // } | |
329 | - // | |
330 | - // bb.bset(0); | |
331 | - // | |
332 | - //} | |
205 | + } | |
206 | + } while (m_rtpSessionPtr->GotoNextSourceWithData()); | |
207 | + } | |
208 | + | |
333 | 209 | m_rtpSessionPtr->EndDataAccess(); |
334 | 210 | |
335 | 211 | std::this_thread::sleep_for(std::chrono::milliseconds(10)); |
... | ... | @@ -351,24 +227,24 @@ bool RTPUdpReceiver::RequestStream() { |
351 | 227 | return true; |
352 | 228 | } |
353 | 229 | |
354 | -int RTPUdpReceiver::IsConnecting() { | |
355 | - LOG_INFO("[{}] IsConnecting started.", m_SipChannelId); | |
230 | +int RTPUdpReceiver::CheckConnecting() { | |
231 | + LOG_INFO("[{}] CheckConnecting started.", m_SipChannelId); | |
356 | 232 | |
357 | 233 | int count = 0; |
358 | 234 | while (!m_bRtpExit) |
359 | 235 | { |
360 | 236 | if (m_bNoData) { |
361 | - bool bReq = RequestStream(); | |
362 | - if (!bReq) { | |
363 | - LOG_INFO("[{}] RequestStream failed !", m_SipChannelId); | |
364 | - } | |
237 | + // bool bReq = RequestStream(); | |
238 | + // if (!bReq) { | |
239 | + // LOG_INFO("[{}] RequestStream failed !", m_SipChannelId); | |
240 | + // } | |
365 | 241 | |
366 | - wait_times(30); // 等待3s | |
242 | + wait_times(50); // 等待5s | |
367 | 243 | |
368 | 244 | count++; |
369 | 245 | |
370 | - if (count > 10) { | |
371 | - // 30s 依然没数据过来,则关闭 | |
246 | + if (count > 60) { | |
247 | + // 3min 依然没数据过来,则关闭 | |
372 | 248 | m_bRtpExit = true; |
373 | 249 | break; |
374 | 250 | } |
... | ... | @@ -379,7 +255,7 @@ int RTPUdpReceiver::IsConnecting() { |
379 | 255 | } |
380 | 256 | } |
381 | 257 | |
382 | - LOG_DEBUG("[{}] while", m_SipChannelId); | |
258 | + m_bRecvExit = true; | |
383 | 259 | |
384 | 260 | // 结束整个任务 |
385 | 261 | WebsocketClient* pClient = WebsocketClient::getInstance(); |
... | ... | @@ -397,17 +273,13 @@ int RTPUdpReceiver::IsConnecting() { |
397 | 273 | m_rtpThreadPtr = nullptr; |
398 | 274 | } |
399 | 275 | |
400 | - LOG_DEBUG("[{}] m_rtpThreadPtr", m_SipChannelId); | |
401 | - | |
402 | 276 | m_rtpSessionPtr->Destroy(); |
403 | 277 | |
404 | - LOG_DEBUG("[{}] m_rtpSessionPtr", m_SipChannelId); | |
405 | - | |
406 | 278 | ClosePsThread(); |
407 | 279 | |
408 | 280 | m_bOpened = false; |
409 | 281 | |
410 | - LOG_INFO("[{}] IsConnecting exited.", m_SipChannelId); | |
282 | + LOG_INFO("[{}] CheckConnecting exited.", m_SipChannelId); | |
411 | 283 | |
412 | 284 | return 0; |
413 | 285 | } | ... | ... |
src/decoder/gb28181/rtp/RTPUdpReceiver.h
... | ... | @@ -33,7 +33,7 @@ public: |
33 | 33 | |
34 | 34 | public: |
35 | 35 | int OnRtpRecv(); |
36 | - int IsConnecting(); | |
36 | + int CheckConnecting(); | |
37 | 37 | |
38 | 38 | private: |
39 | 39 | bool wait_times(int times); |
... | ... | @@ -56,6 +56,7 @@ private: |
56 | 56 | string m_sip_channel_id; |
57 | 57 | |
58 | 58 | std::atomic_bool m_bNoData{false}; |
59 | + bool m_bRecvExit{false}; | |
59 | 60 | }; |
60 | 61 | |
61 | 62 | #endif // _RTP_UDP_RECEIVER_H_ | ... | ... |