q191201771 / lal

🔥 Golang audio/video live streaming lib/client/server. support RTMP, RTSP(RTP/RTCP), HLS, HTTP[S]/WebSocket-FLV/TS, GB28181, H264/H265/AAC/G711/OPUS, relay, cluster, record, HTTP Notify/API/UI. 直播

Home Page:https://pengrl.com/lal

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

flv播放一段时间后画面卡住

LeeeMooo opened this issue · comments

你好,感谢这么棒的项目。

我现在业务场景是:
通过start_relay_pull拉摄像头rtsp流,然后输出flv和hls(hls开启切片,间隔1分钟)。
flv用来网页flv.js播放,hls通过OnHlsMakeTs来保存录像ffmpeg ts转成mp4。
但是运行一段时间后会出现几条warn日志,出现时间不固定。
image
然后flv画面就卡住了,看请求还在继续拉数据。OnHlsMakeTs也不再触发了。

我现在的解决办法是event=open&&duration>0或者event=close&&duration=0时调用stop_relay_pull关闭这个流再重新拉流。

请问有没有好的解决办法

commented

用 ffplay 直接播放摄像头流(不经过 lal )看看有没有 warning

用 ffplay 直接播放摄像头流(不经过 lal )看看有没有 warning

image

commented

大概运行多久会出现,如果时间短的话,按下面这个方式抓份数据给我看看,

https://pengrl.com/#/debug_dump

大概运行多久会出现,如果时间短的话,按下面这个方式抓份数据给我看看,

出现时间不固定,有时候好几个小时才出现

我现在的解决办法是event=open&&duration>0或者event=close&&duration=0时调用stop_relay_pull关闭这个流再重新拉流。

调用stop_relay_pull(http://127.0.0.1:8082/api/ctrl/stop_relay_pull?stream_name=xxx) 后dead lock了,程序卡在了这里

group.mutex.Lock()

但是通过curl调用正常。
我的程序结构如下
image

commented

你的兼容性处理:
是在你自己的NotifyHandler实现中调用stop_relay_pull死锁了吗,
可能是有问题,默认的Notify是http异步出去的,所以没问题,
这个死锁我会修复。

另外出现问题的真正原因:
由于不好提供复现手段给我,我只能尝试性的修改一些时间戳处理的代码,然后你再测试,
到时候我通知你怎么测试。

最后,感谢使用lal并反馈问题给我。

是在你自己的NotifyHandler实现中调用stop_relay_pull死锁了吗

对,在OnHlsMakeTs里面调用的

我在源码里面做了点修改不知道这样有没有影响
image
因为摄像头音频流是PCMA的,而flv.js只支持acc,但是lal自动叠加静音音频好像只支持源流没有音频流的情况,所以我把音频流直接干掉了,这样就能叠加静音音频了

commented

回调中调用API死锁的问题我已经修复了,你测试一下。
你说的 PCMA -> flv.js 场景想去掉PCMA叠加静音音频的功能,我会考虑通过配置文件实现。

回调中调用API死锁的问题我已经修复了,你测试一下。

已解决

commented

方便的话可以再试试以下方法(需拉取最新代码):
在调用
logic.NewLalServer
之前,增加
rtsp.BaseInSessionTimestampFilterFlag = false

@LeeeMooo

commented

信息汇总:

(1. NotifyHandler回调异步化,使得NotifyHandler中可以调用控制类的API(避免锁重入)【完成】

(2. 支持过滤掉非AAC格式音频,并增加AAC静音音频

现状:业务方自己hack代码支持
后续:我需要在lal中提供相应功能(通过var配置项控制)

(3. rtsp输入流一段时间后,flv无法播放,hls也不生成

  • 业务方通过监控状态重新拉流解决
  • 复现时间可能很长,业务方不方便抓取dump数据
  • 关闭rtsp的avpacket queue让业务方继续测试

rtsp.BaseInSessionTimestampFilterFlag = false

好的,我测试一下

commented

rtsp.BaseInSessionTimestampFilterFlag = false

好的,我测试一下

我前面没说清楚,加到logic.NewLalServer之前哈,先设置这个参数为false,再NewLalServer

尴尬了我放在new后面了,刚测试了一个小时出现了,我再试试

还是出现了,我这次dump了数据,用的是这个
image
麻烦看看
https://t.wss.ink/f/b6kjgyy4hhf 密码:6907

又抓取了一段
image
https://t.wss.ink/f/b6lke7aycub 密码:2211

commented

拉最新的代码,然后按上面的方法,把下面这个变量也设置为true

rtsp.TimestampFilterHandleRotateFlag = true

rtsp.TimestampFilterHandleRotateFlag = true

我测试一下,应该是false吧?

commented

rtsp.TimestampFilterHandleRotateFlag = true

我测试一下,应该是false吧?

true,两个变量都设置为true哈,

BaseInSessionTimestampFilterFlag
TimestampFilterHandleRotateFlag

我开了两个版本

挂了5个小时左右,当前版本没出现问题,旧的复现,应该是解决了,感谢!