Kivy开发安卓应用时ffprobe提示File not Found如何解决
报这个错的核心逻辑很简单:你加的ffprobe-python、ffmpeg-python全是Python层的封装包,根本不会带适配安卓平台的ffmpeg、ffprobe可执行二进制。pydub本身不做编解码,全靠调用这两个命令行工具干活,安卓默认系统环境里没有这俩命令,你就算把封装包装全了,pydub找不到实际可执行文件一样报错。
修正buildozer.spec依赖配置
找到配置里的requirements行,删掉没用的ffprobe-python、ffmpeg-python,保留pydub,再加个ffmpeg就行。这个ffmpeg是python-for-android自带的编译脚本,会自动把适配你目标安卓设备CPU架构的ffmpeg、ffprobe二进制打进APK里。
顺便检查下android.permissions配置,音频读写权限别漏:安卓12及以下加READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,安卓13及以上多补一个READ_MEDIA_AUDIO,不然转码完存文件会报权限错误。代码里手动给pydub指对工具路径
安卓不会把应用自带的二进制放到系统全局PATH里,pydub默认的搜索规则找不到文件,必须在写转码逻辑前手动把两个工具的绝对路径喂给pydub,直接抄这段代码就行:import os from pydub import AudioSegment # 只在安卓环境下生效,PC端调试不用改 if "ANDROID_ARGUMENT" in os.environ: app_private_dir = os.environ["ANDROID_PRIVATE"] AudioSegment.converter = os.path.join(app_private_dir, "ffmpeg") AudioSegment.ffprobe = os.path.join(app_private_dir, "ffprobe") # 后面正常写你的转码逻辑就行,比如webm转mp3 # sound = AudioSegment.from_file("test.webm", format="webm") # sound.export("test.mp3", format="mp3")清缓存重打包
改完配置和代码别直接增量打包,先清掉旧的构建缓存再重新编译,不然旧的打包缓存里没带ffmpeg,跑起来还是错:buildozer android clean buildozer android debug deploy run第一次打包ffmpeg的时候会拉源码做交叉编译,耗时比普通打包久很多,别中途断进程。
要是重打包之后还是报找不到文件,就在设置完路径的地方加一行调试代码,看二进制是不是真的打进去了:
print("ffprobe是否存在:", os.path.exists(AudioSegment.ffprobe))
如果打出来是False,说明ffmpeg的编译脚本没正常拉取,检查下本地网络,重新clean之后再打包就行。
内容的提问来源于stack exchange,提问作者Pranzal360

