ijkplayer icon indicating copy to clipboard operation
ijkplayer copied to clipboard

【QA】播放音乐的时候突然中断

Open zdw19840929 opened this issue 11 months ago • 9 comments

大佬 我最近播放音频的时候发现一个问题,就是播放途中突然音频中断,log如下: [IJKMEDIA]stream_close will close [IJKMEDIA]will destroy avcodec:mjpeg,flush buffers. [IJKMEDIA]convert image convert_frame_count = 0,err = -1 [IJKMEDIA]stream_close did close

zdw19840929 avatar Mar 05 '25 07:03 zdw19840929

看起来跟音乐封面有关系,你把这个音乐文件发给我看看。

debugly avatar Mar 05 '25 10:03 debugly

看起来跟音乐封面有关系,你把这个音乐文件发给我看看。 大佬您可以看下,但是这个不是必现的 半生.mp3.zip

zdw19840929 avatar Mar 05 '25 10:03 zdw19840929

你播放了多久遇到的停止啊,按日志来看应该立马就停了啊

debugly avatar Mar 05 '25 12:03 debugly

你播放了多久遇到的停止啊,按日志来看应该立马就停了啊

这个大概播放了一分钟左右,但是也不一定,有时候播放结束都没事

zdw19840929 avatar Mar 05 '25 13:03 zdw19840929

无法复现,对于音乐而言,这里的 convert image convert_frame_count = 0,err = -1没有问题,封面就一张图,视频流解完码就关闭了。

需要提供复现的日志。

debugly avatar Mar 06 '25 03:03 debugly

无法复现,对于音乐而言,这里的 convert image convert_frame_count = 0,err = -1没有问题,封面就一张图,视频流解完码就关闭了。

需要提供复现的日志。

我有播放了几遍也没有复现这个问题,等我复现了再把log发给您吧😂

zdw19840929 avatar Mar 06 '25 03:03 zdw19840929

无法复现,对于音乐而言,这里的 convert image convert_frame_count = 0,err = -1没有问题,封面就一张图,视频流解完码就关闭了。

需要提供复现的日志。

大佬我复现了一下这个问题,就是上面那个歌曲循环播放,大概4,5遍左右的时候就会突然中断,然后就出现上面的log [IJKMEDIA]IJKMetalView: videiPicture is nil Response data: {"subsonic-response":{"status":"ok","version":"1.16.1","type":"navidrome","serverVersion":"0.54.5 (287079a9)","openSubsonic":true}} [IJKMEDIA]stream_close will close [IJKMEDIA]will destroy avcodec:mjpeg,flush buffers. [IJKMEDIA]convert image convert_frame_count = 0,err = -1 [IJKMEDIA]stream_close did close

这是我的配置,您看下有什么问题吗? let options = IJKFFOptions.byDefault() // options?.setPlayerOptionIntValue(1024 * 16, forKey: "max-buffer-size") // 在读取流时使用tcp(不使用udp) options.setFormatOptionValue("tcp", forKey: "rtsp_transport") // 减少首次加载时间 options.setPlayerOptionIntValue(60, forKey: "timeout") options.setPlayerOptionIntValue(1, forKey: "http-detect-range-support") options.setPlayerOptionIntValue(1, forKey: "reconnect") options.setPlayerOptionIntValue(1, forKey: "enable-accurate-seek") options.setFormatOptionValue("fastseek", forKey: "fflags") options.setPlayerOptionIntValue(1, forKey: "videotoolbox_hwaccel")

我这边每首歌结束都会把player关闭,然后创建新的 // 释放当前的 if let p = self.player { NotificationCenter.default.removeObserver(p) } player?.shutdown() // 关闭播放器

zdw19840929 avatar Mar 18 '25 03:03 zdw19840929

这么用没啥问题啊,播放的是本地的还是网络的?我上次本地播放了好久没问题。

debugly avatar Mar 18 '25 13:03 debugly

这么用没啥问题啊,播放的是本地的还是网络的?我上次本地播放了好久没问题。

不是本地的,是网络的,我是下载下来的

zdw19840929 avatar Mar 18 '25 13:03 zdw19840929

这么用没啥问题啊,播放的是本地的还是网络的?我上次本地播放了好久没问题。

大佬找到问题了,是我代码的问题,非常抱歉耽误大佬时间啦。 另外我想问一个问题,就是我想设置超时时间,但网络不好的时候好像没有按照这个时间来执行,很快就会提示失败,您看我这样设置对吗? options.setFormatOptionIntValue(60 * 1000 * 1000, forKey: "timeout") options.setFormatOptionIntValue(60 * 1000 * 1000, forKey: "connect_timeout") options.setFormatOptionIntValue(60 * 1000 * 1000, forKey: "listen_timeout")

zdw19840929 avatar Mar 24 '25 03:03 zdw19840929

好吧,我说我试了很多次都没问题呢。

设置超时的代码没问题,不知道你什么情况呢,失败时错误码是啥?

debugly avatar Mar 24 '25 04:03 debugly

好吧,我说我试了很多次都没问题呢。

设置超时的代码没问题,不知道你什么情况呢,失败时错误码是啥?

大佬看下,就是这种,貌似就不会等到超时的时间了,直接就回返回错误 音乐播放结束 {"msg":"End of file","IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey":1,"code":-541478725} 音乐播放结束 {"msg":"End of file","IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey":1,"code":-541478725}

zdw19840929 avatar Mar 24 '25 05:03 zdw19840929

是 http 协议吗?

debugly avatar Mar 26 '25 10:03 debugly

是 http 协议吗?

大佬是https协议

zdw19840929 avatar Mar 26 '25 11:03 zdw19840929

有测试地址吗?这种情况是读流结束了,ffmpeg认为读到末尾了。

debugly avatar Mar 27 '25 01:03 debugly

服务器响应头有这个吗:Transfer-Encoding: chunked

debugly avatar Mar 27 '25 01:03 debugly

服务器响应头有这个吗:Transfer-Encoding: chunked

有这个的

zdw19840929 avatar Mar 27 '25 05:03 zdw19840929

有测试地址吗?这种情况是读流结束了,ffmpeg认为读到末尾了。

这种还不太好搞出来,我是用了用户的VPN,然后手机改成弱网测试出来的,但VPN现在用不了了

zdw19840929 avatar Mar 27 '25 05:03 zdw19840929

我这找不到 chunked 的流无法测试ffmepg的逻辑,我的确看到 chunked 这种方式读不到数据就会认为读完的逻辑,也许弱网下就读不到数据了,导致了 End of file 错误。

debugly avatar Mar 27 '25 05:03 debugly

我这找不到 chunked 的流无法测试ffmepg的逻辑,我的确看到 chunked 这种方式读不到数据就会认为读完的逻辑,也许弱网下就读不到数据了,导致了 End of file 错误。

大佬抱歉我说错了,一般接口请求里面有Transfer-Encoding: chunked,但是音频流的地址返回响应头里没有的

zdw19840929 avatar Mar 27 '25 05:03 zdw19840929

我这找不到 chunked 的流无法测试ffmepg的逻辑,我的确看到 chunked 这种方式读不到数据就会认为读完的逻辑,也许弱网下就读不到数据了,导致了 End of file 错误。

我可以给您一个地址,您看下,我发您邮箱吧

zdw19840929 avatar Mar 27 '25 05:03 zdw19840929

没有这个响应头的测试地址,我还没有遇到这个情况,你给我这个地址能复现吗?

如果确定是 chunked 传输的流,可以加上 reconnect_at_eof 让他重试。

debugly avatar Mar 27 '25 06:03 debugly

没有这个响应头的测试地址,我还没有遇到这个情况,你给我这个地址能复现吗?

如果确定是 chunked 传输的流,可以加上 reconnect_at_eof 让他重试。

大佬我把地址发您邮箱了,是一个Navidrome的服务,您可以看下Gmail邮箱

zdw19840929 avatar Mar 27 '25 06:03 zdw19840929

我的 gmail 没收到

debugly avatar Mar 27 '25 06:03 debugly

我的 gmail 没收到

我又发了一遍,您看下

zdw19840929 avatar Mar 27 '25 06:03 zdw19840929

我在网页上打开了,随便找了一首歌下载呢,然后服务器 502 了???

debugly avatar Mar 27 '25 06:03 debugly

我在网页上打开了,随便找了一首歌下载呢,然后服务器 502 了???

奇怪,我这里是可以的呢,您试试能在线播放吗?

zdw19840929 avatar Mar 27 '25 06:03 zdw19840929

刚开始能播放,然后才想着通过下载拿到地址,我然后用ijkplayer播放呢,就 502 了,现在整个网页都打不开了,难道是 ipv6 的事?

debugly avatar Mar 27 '25 06:03 debugly

刚开始能播放,然后才想着通过下载拿到地址,我然后用ijkplayer播放呢,就 502 了,现在整个网页都打不开了,难道是 ipv6 的事?

那应该是IPv6的问题,您的路由器支持IPv6访问吗?我这边没有公网的IPv4,所以只能用公网的IPv6

zdw19840929 avatar Mar 27 '25 06:03 zdw19840929

有问题在 fsplayer 上提吧,这里不再更新了。

debugly avatar Apr 15 '25 08:04 debugly