[bilibili/ijkplayer]播放udp流,累计延时会增加

2024-06-25 370 views
8

ffmpeg编译的是module-default.sh版本,未改动源码 设置参数如下: ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzemaxduration", 50L); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 40L); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "flush_packets", 1L); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0L); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 10L); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer"); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "max-buffer-size", 10240); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 2); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", 1); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "fast", 1); optimizations ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "tune", "zerolatency"); ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1);

播放流地址(局域网):udp://@224.0.1.22:1234,采集的是摄像头的数据

开始播放时,延时800ms左右,半小时后延时增加到2s,一小时后延时增加到3-5s 延时增大时,v-cache的数值在增加 有人遇到过类似的问题吗?怎么解决的? 谢谢

回答

7

你好。有交流方式吗?统一遇到这个问题。

8

你好。有交流方式吗?统一遇到这个问题。

暂时没有解决,有个方式可以降低这个概率,但是处理得不好 微信:pastloveyau

6

中途有没有buffering

9

在read_thread里判断缓冲区大小,根据大小开启倍速播放,追到一定程度后就停止

0

在read_thread里判断缓冲区大小,根据大小开启倍速播放,追到一定程度后就停止

这个可能真正解决需要做很多的优化。

5

在read_thread里判断缓冲区大小,根据大小开启倍速播放,追到一定程度后就停止

这个可能真正解决需要做很多的优化。

是的,我只是提个改善用户体验思路,另外我这个办法在网络速度好但是波动大的情况下基本还能保持比较低的延时,延时累计效应不明显

9

我的应用场景比较特殊,必须要求实时性,可以丢弃非实时数据,所以我处理的方式为:在read线程中,判断vcache大小,大于某个阈值,直接丢帧,这样做会引起视频帧卡顿或者重复(应该可以判断是否是关键帧在丢弃)

8

我的应用场景比较特殊,必须要求实时性,可以丢弃非实时数据,所以我处理的方式为:在read线程中,判断vcache大小,大于某个阈值,直接丢帧,这样做会引起视频帧卡顿或者重复(应该可以判断是否是关键帧在丢弃)

不能这样丢帧,在一个IBP的序列中,如果有B并且B做参考时丢了B,或者如果丢了P,就需要丢到下一个I。 如果要求实时性,可以在要求推流端的I帧间隔尽可能小,如果你打算丢帧,就丢一个序列(也叫做GOP).

3

我的应用场景比较特殊,必须要求实时性,可以丢弃非实时数据,所以我处理的方式为:在read线程中,判断vcache大小,大于某个阈值,直接丢帧,这样做会引起视频帧卡顿或者重复(应该可以判断是否是关键帧在丢弃)

不能这样丢帧,在一个IBP的序列中,如果有B并且B做参考时丢了B,或者如果丢了P,就需要丢到下一个I。 如果要求实时性,可以在要求推流端的I帧间隔尽可能小,如果你打算丢帧,就丢一个序列(也叫做GOP).

哥们你有做过局域网内用rtmp或者rtsp推流吗?

1

我的应用场景比较特殊,必须要求实时性,可以丢弃非实时数据,所以我处理的方式为:在read线程中,判断vcache大小,大于某个阈值,直接丢帧,这样做会引起视频帧卡顿或者重复(应该可以判断是否是关键帧在丢弃)

不能这样丢帧,在一个IBP的序列中,如果有B并且B做参考时丢了B,或者如果丢了P,就需要丢到下一个I。 如果要求实时性,可以在要求推流端的I帧间隔尽可能小,如果你打算丢帧,就丢一个序列(也叫做GOP).

哥们你有做过局域网内用rtmp或者rtsp推流吗?

你那是监控吧,我做互联网的,监控用ijk不合适,可以考虑大牛的播放器和推流器

4

我的应用场景比较特殊,必须要求实时性,可以丢弃非实时数据,所以我处理的方式为:在read线程中,判断vcache大小,大于某个阈值,直接丢帧,这样做会引起视频帧卡顿或者重复(应该可以判断是否是关键帧在丢弃)

不能这样丢帧,在一个IBP的序列中,如果有B并且B做参考时丢了B,或者如果丢了P,就需要丢到下一个I。 如果要求实时性,可以在要求推流端的I帧间隔尽可能小,如果你打算丢帧,就丢一个序列(也叫做GOP).

是的,要丢必须要丢弃一个gop序列,否则会出问题,不过我看源码,它好像没有判断是否是关键帧,直接丢弃帧。我们的应用场景没有用到B帧,只有P帧,且没有缓冲;ijk在udp模式下h264硬解码,最低能做到300毫秒左右。

1

我的应用场景比较特殊,必须要求实时性,可以丢弃非实时数据,所以我处理的方式为:在read线程中,判断vcache大小,大于某个阈值,直接丢帧,这样做会引起视频帧卡顿或者重复(应该可以判断是否是关键帧在丢弃)

不能这样丢帧,在一个IBP的序列中,如果有B并且B做参考时丢了B,或者如果丢了P,就需要丢到下一个I。 如果要求实时性,可以在要求推流端的I帧间隔尽可能小,如果你打算丢帧,就丢一个序列(也叫做GOP).

是的,要丢必须要丢弃一个gop序列,否则会出问题,不过我看源码,它好像没有判断是否是关键帧,直接丢弃帧。我们的应用场景没有用到B帧,只有P帧,且没有缓冲;ijk在udp模式下h264硬解码,最低能做到300毫秒左右。

两个问题,第一300ms的硬解码264,是不是太慢了,或者你们分辨率太高?第二个,我用追帧的办法,不丢帧,可以考虑放低probe和缓冲区的大小,但是在互联网的情况下,这个不抗抖动。另外关于丢帧,我是按照协议,nalu头上有个参考级别,nal类型,然后自己写的丢帧办法