nICEnnnnnnnLee / BilibiliLiveRecorder

pure-java B站/Acfun/斗鱼/虎牙/快手/抖音/YY/战旗/花椒 直播视频录制。仅需Java环境即可运行【维护模式,不主动新增Feature】
Other
771 stars 107 forks source link

同时监看多个抖音直播间,几个小时后个别直播间会跳cookie错误 #115

Closed qchenac closed 1 year ago

qchenac commented 1 year ago

开了六个程序,监看六个直播间,一开始都可以正常监看,有三个分别在两小时、五小时和九小时后报cookie错误,自动退出程序。最后报错log如下

log1 ``` 发送GET请求出现异常!javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake at java.base/sun.security.ssl.SSLSocketImpl.handleEOF(SSLSocketImpl.java:1718) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1518) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1425) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426) at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:578) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:187) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:142) at nicelee.bilibili.util.HttpRequestUtil.connectWithHostKnown(HttpRequestUtil.java:334) at nicelee.bilibili.util.HttpRequestUtil.getContent(HttpRequestUtil.java:296) at nicelee.bilibili.live.impl.RoomDealerDouyin4User.getRoomInfo(RoomDealerDouyin4User.java:96) at nicelee.bilibili.Main.getRoomInfo(Main.java:173) at nicelee.bilibili.Main.main(Main.java:86) Suppressed: java.net.SocketException: Broken pipe at java.base/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:413) at java.base/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:433) at java.base/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:812) at java.base/java.net.Socket$SocketOutputStream.write(Socket.java:1120) at java.base/sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:81) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:407) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:314) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:467) ... 9 more Caused by: java.io.EOFException: SSL peer shut down incorrectly at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:488) at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:477) at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:160) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1510) ... 11 more java.lang.IllegalStateException: No match found at java.base/java.util.regex.Matcher.group(Matcher.java:644) at nicelee.bilibili.live.impl.RoomDealerDouyin4User.getRoomInfo(RoomDealerDouyin4User.java:100) at nicelee.bilibili.Main.getRoomInfo(Main.java:173) at nicelee.bilibili.Main.main(Main.java:86) 抖音需要cookie, 请确认cookie是否存在或失效 解析失败!! ```
log2 ``` 发送GET请求出现异常!java.io.IOException: Server returned HTTP response code: 504 for URL: https://live.douyin.com/453701763484 java.io.IOException: Server returned HTTP response code: 504 for URL: https://live.douyin.com/xxxxxxx at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:484) at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:2044) at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:2039) at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) at java.base/sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:2038) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1605) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1585) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224) at nicelee.bilibili.util.HttpRequestUtil.getContent(HttpRequestUtil.java:298) at nicelee.bilibili.live.impl.RoomDealerDouyin4User.getRoomInfo(RoomDealerDouyin4User.java:96) at nicelee.bilibili.Main.getRoomInfo(Main.java:173) at nicelee.bilibili.Main.main(Main.java:86) Caused by: java.io.IOException: Server returned HTTP response code: 504 for URL: https://live.douyin.com/453701763484 at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1993) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1585) at java.base/sun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:3232) at java.base/java.net.URLConnection.getContentEncoding(URLConnection.java:531) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getContentEncoding(HttpsURLConnectionImpl.java:380) at nicelee.bilibili.util.HttpRequestUtil.getContent(HttpRequestUtil.java:297) ... 3 more java.lang.IllegalStateException: No match found at java.base/java.util.regex.Matcher.group(Matcher.java:644) at nicelee.bilibili.live.impl.RoomDealerDouyin4User.getRoomInfo(RoomDealerDouyin4User.java:100) at nicelee.bilibili.Main.getRoomInfo(Main.java:173) at nicelee.bilibili.Main.main(Main.java:86) 抖音需要cookie, 请确认cookie是否存在或失效 解析失败!! ```
log3 ``` 发送GET请求出现异常!java.net.SocketException: Connection reset java.net.SocketException: Connection reset at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:313) at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:340) at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:789) at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1025) at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:483) at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:477) at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:160) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1510) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1425) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426) at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:578) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:187) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:142) at nicelee.bilibili.util.HttpRequestUtil.connectWithHostKnown(HttpRequestUtil.java:334) at nicelee.bilibili.util.HttpRequestUtil.getContent(HttpRequestUtil.java:296) at nicelee.bilibili.live.impl.RoomDealerDouyin4User.getRoomInfo(RoomDealerDouyin4User.java:96) at nicelee.bilibili.Main.getRoomInfo(Main.java:173) at nicelee.bilibili.Main.main(Main.java:86) java.lang.IllegalStateException: No match found at java.base/java.util.regex.Matcher.group(Matcher.java:644) at nicelee.bilibili.live.impl.RoomDealerDouyin4User.getRoomInfo(RoomDealerDouyin4User.java:100) at nicelee.bilibili.Main.getRoomInfo(Main.java:173) at nicelee.bilibili.Main.main(Main.java:86) 抖音需要cookie, 请确认cookie是否存在或失效 解析失败!! ```

除此之外,还有一个开始录制后头四十分钟文件大小不增加,然后异常报错,自动重试后重新录制但时间轴未重置,如下

开始录制,输入stop停止录制
文件大小: null 字节.
已经录制了0m10s, 当前进度: 1.84 MB
已经录制了0m20s, 当前进度: 3.17 MB
已经录制了0m30s, 当前进度: 4.42 MB
已经录制了16m16s, 当前进度: 5.12 MB
已经录制了16m26s, 当前进度: 5.12 MB
已经录制了16m36s, 当前进度: 5.12 MB
已经录制了16m46s, 当前进度: 5.12 MB
已经录制了16m56s, 当前进度: 5.12 MB
已经录制了32m5s, 当前进度: 5.12 MB
已经录制了32m15s, 当前进度: 5.12 MB
已经录制了32m25s, 当前进度: 5.12 MB
已经录制了32m35s, 当前进度: 5.12 MB
已经录制了32m45s, 当前进度: 5.12 MB
已经录制了45m7s, 当前进度: 5.12 MB
已经录制了45m17s, 当前进度: 5.12 MB
发送GET请求出现异常!java.net.SocketTimeoutException: Read timed out
java.net.SocketTimeoutException: Read timed out
    at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:273)
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:299)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:340)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:789)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1025)
    at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:308)
    at java.base/java.io.BufferedInputStream.implRead(BufferedInputStream.java:382)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:361)
    at java.base/java.io.FilterInputStream.read(FilterInputStream.java:119)
    at java.base/sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3674)
    at java.base/sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3667)
    at nicelee.bilibili.util.HttpRequestUtil.download(HttpRequestUtil.java:219)
    at nicelee.bilibili.live.impl.RoomDealerDouyin4User.startRecord(RoomDealerDouyin4User.java:241)
    at nicelee.bilibili.threads.ThRecord.record(ThRecord.java:139)
    at nicelee.bilibili.threads.ThRecord.run(ThRecord.java:50)
连接异常,0.1min后重新尝试录制
正在处理,请稍等
文件大小: null 字节.
已经录制了45m37s, 当前进度: 1.96 MB
已经录制了45m47s, 当前进度: 3.20 MB
已经录制了45m57s, 当前进度: 4.46 MB
已经录制了46m7s, 当前进度: 5.73 MB
已经录制了46m17s, 当前进度: 6.92 MB
已经录制了46m27s, 当前进度: 8.15 MB
已经录制了46m37s, 当前进度: 9.39 MB
已经录制了46m47s, 当前进度: 10.65 MB
已经录制了46m57s, 当前进度: 11.89 MB
已经录制了47m7s, 当前进度: 13.15 MB
已经录制了47m17s, 当前进度: 14.37 MB
已经录制了47m27s, 当前进度: 15.45 MB
已经录制了47m37s, 当前进度: 16.69 MB
已经录制了47m47s, 当前进度: 17.97 MB
已经录制了47m57s, 当前进度: 19.23 MB
已经录制了48m7s, 当前进度: 20.46 MB
已经录制了48m17s, 当前进度: 21.68 MB
已经录制了48m27s, 当前进度: 22.95 MB
已经录制了48m37s, 当前进度: 24.17 MB
已经录制了48m47s, 当前进度: 25.38 MB
已经录制了48m57s, 当前进度: 26.54 MB
已经录制了49m7s, 当前进度: 27.83 MB
已经录制了49m17s, 当前进度: 29.03 MB
已经录制了49m27s, 当前进度: 30.23 MB
已经录制了49m37s, 当前进度: 31.50 MB
已经录制了49m47s, 当前进度: 32.64 MB
已经录制了49m57s, 当前进度: 33.74 MB
已经录制了50m7s, 当前进度: 34.90 MB
已经录制了50m17s, 当前进度: 36.03 MB
已经录制了50m27s, 当前进度: 37.29 MB
已经录制了50m37s, 当前进度: 38.52 MB
已经录制了50m47s, 当前进度: 39.77 MB
已经录制了50m57s, 当前进度: 40.90 MB
已经录制了51m7s, 当前进度: 42.05 MB
已经录制了51m17s, 当前进度: 43.26 MB
已经录制了51m27s, 当前进度: 44.54 MB
已经录制了51m37s, 当前进度: 45.81 MB

然后第一段录制出来的5兆多的文件经ffmpeg转码后实际只有39秒

nICEnnnnnnnLee commented 1 year ago

关于cookie错误

程序不关注有效cookie的获取以及刷新,失效了就是失效了,没法解决。 不过上述报错应该都是网络问题造成的,根因应该和下面的情况类似,只是表现不同。


录制后头四十分钟文件大小不增加,然后异常报错...第一段录制出来的5兆多...实际只有39秒

理论上每隔约10s会输出一次录制状态。
如果log没有删减的话,第一段录制的时候在30s~16m16s这个区间程序没有log输出,显然整个程序被被阻塞了。
比较明显的还有16m56s~32m5s这一段。

  已经录制了0m30s, 当前进度: 4.42 MB
  已经录制了16m16s, 当前进度: 5.12 MB
  ...
  已经录制了16m56s, 当前进度: 5.12 MB
  已经录制了32m5s, 当前进度: 5.12 MB

程序设置的HTTP超时时间是2min,一直坚持到45m17s左右才报超时异常,显然中间有很多地方被卡住了。
已知的情况大概有:

具体阻塞原因需要更多信息


关于同时录制多个直播

只能说最开始并没有考虑这样的使用场景,同时开启多个的话会有很多不必要的重复开销。 建议搜一下其它项目或者参考此处自己实现。
直播录制实质上就是获取直播源 + 下载直播源(FLV/M3U8) + 处理下载的raw文件,实现门槛很低的

github-actions[bot] commented 1 year ago

由于长期没有状态更新,该问题自动关闭。如有需要可重新打开。