Python-shout调用s.open()触发缓冲区溢出终止问题求助
解决Python shout库调用
s.open()时的缓冲区溢出问题 环境信息
- 操作系统:Windows 11
- 运行环境:Msys2 Mingw64
- libshout版本:2.4.6
问题重现代码
import shout s = shout.Shout() print("Using libshout version %s" % shout.version()) s.audio_info = {shout.SHOUT_AI_BITRATE:'128', shout.SHOUT_AI_SAMPLERATE:'44800', shout.SHOUT_AI_CHANNELS:'2'} s.name = 'Test radio connection' s.url = 'http://localhost:8000/test.ogg' s.mount = 'test.ogg' s.port = 8000 s.user = 'username' s.password = 'password' s.genre = 'Other' s.description = 'Test description' s.host = 'localhost' s.format = 'ogg' s.open() s.get_connected()
报错信息
Using libshout version 2.4.6 *** buffer overflow detected ***: terminated
解决方案
1. 修正audio_info参数类型
缓冲区溢出大概率是因为audio_info传入了字符串值,但libshout底层C接口期望整数类型。将参数改为整数:
s.audio_info = { shout.SHOUT_AI_BITRATE: 128, shout.SHOUT_AI_SAMPLERATE: 44800, shout.SHOUT_AI_CHANNELS: 2 }
Python绑定未做自动类型转换时,字符串会导致内存读写越界,触发系统的缓冲区溢出检测。
2. 升级libshout版本
2.4.6属于老旧版本,可能存在已知的内存溢出bug。在Msys2终端执行命令更新:
pacman -S mingw-w64-x86_64-libshout
更新后重新安装Python的shout绑定:
pip uninstall python-shout pip install python-shout
3. 检查Icecast服务状态
确保本地8000端口已运行Icecast服务且配置正确,服务未启动或配置错误可能导致libshout建立连接时出现异常内存访问。
4. 缩短字段长度测试
部分字段(如description、name)过长也可能触发溢出,先缩短值验证:
s.name = 'Test Radio' s.description = 'Test'
内容的提问来源于stack exchange,提问作者Chris P
相关产品推荐
相关产品推荐

