ireader / media-server

RTSP/RTP/RTMP/FLV/HLS/MPEG-TS/MPEG-PS/MPEG-DASH/MP4/fMP4/MKV/WebM
MIT License
3.06k stars 1.07k forks source link

恢复ts解析状态 #266

Open alexliyu7352 opened 1 year ago

alexliyu7352 commented 1 year ago
 if (MPEG_ERROR_OK != pes_read_header(pes, &reader) || s != 0x000001)
                            {
                                assert(0);
                                return 0; // ignore
                            }

当这里触发assert后, 如果捕捉了错误或者忽略了assert后, 后续的所有的流都将不停的触发这里. 看调试是s的值不对.并且始终无法再次恢复.

failed:Assertion failed: (0), function ts_demuxer_input, file /home/alex/CLionProjects/media_server/3rdpart/media-server/libmpeg/source/mpeg-ts-dec.c, line 253.

场景是拉取hls并转成mpegts, 中间某个切片出现了问题后, 导致后续拉取正常的切片也会不停的触发这, 没办法恢复状态. 所以这里如何重置状态呢?毕竟后续的切片都是正常的切片了.

ireader commented 1 year ago

什么文件触发的,能把ts文件上传吗?

从代码逻辑看,没有全局状态,s是从输入的data里读的,s/reader/pkhd都是局部变量,甚至pes的值也是从data里解析出来的,不应该不能恢复状态。

alexliyu7352 commented 1 year ago

很难复现这个问题.是我通过日志发现的. 我也认真的阅读了您的代码, 从逻辑上看, 这些应该都属于局部变量. 也就是再次调用ts_demuxer_input应该不会再次触发才对. 但是实际上接下去会一直不停的触发. 所以我现在捕捉错误后, 按照以下流程重新创建demuxer后就不在触发了. ts_demuxer_destroy ts_demuxer_create ts_demuxer_set_notify

我现在不排除是程序其他逻辑上的问题.但是仔细检查后并没有发现有不妥的地方.