从Power Apps导出的Base64解码音频无法转格式问题求助
问题分析与解决方案
看起来你的核心问题出在Base64数据的读取处理和文件格式匹配性上,我们一步步拆解解决:
1. 先修正Base64数据的读取逻辑
你的代码用readlines()读取文本文件后只取第一行,这很容易踩坑:
- 如果
binaryData.txt里的Base64字符串是多行存储的,readlines()会把它拆分成多个列表元素,只取第一行直接截断了完整数据 - 即使是单行存储,
readlines()返回的行末尾可能带有换行符\n,这会导致解码后的数据损坏
修改读取逻辑,确保获取完整、干净的Base64字符串:
import os import base64 mainDir = os.path.dirname(__file__) binaryFileTXT = os.path.join(mainDir, 'binaryData.txt') temp_file = os.path.join(mainDir, 'temp_audio.bin') # 读取全部内容并去除首尾空白(包括换行、空格等多余字符) with open(binaryFileTXT, 'r', encoding='utf-8') as f: audio_data = f.read().strip() # 检查是否带data URI前缀(比如data:audio/ogg;base64,...),有则去除前缀 if audio_data.startswith('data:'): audio_data = audio_data.split(',')[1] # 解码后先保存为临时二进制文件(暂不指定音频后缀,避免格式误导) with open(temp_file, "wb") as f: f.write(base64.b64decode(audio_data))
2. 确定解码后音频的真实格式
用ffmpeg配套的ffprobe工具查看临时文件的真实格式,在命令行执行:
ffprobe temp_audio.bin
输出里会显示类似Input #0, webm, from 'temp_audio.bin'的信息,这就是音频的实际格式(比如WebM、OGG等)。
3. 用正确格式进行转换
知道真实格式后,直接用ffmpeg指定输入格式转换为WAV即可:
# 假设ffprobe检测出是webm格式,执行以下命令转换 ffmpeg -i temp_audio.bin -acodec pcm_s16le -ar 44100 output.wav
或者先给临时文件重命名为对应后缀(比如temp_audio.webm),再转换:
mv temp_audio.bin temp_audio.webm ffmpeg -i temp_audio.webm output.wav
为什么在线工具可以正常转换?
在线工具通常会自动处理Base64字符串的换行、前缀等细节,还会自动检测解码后数据的真实格式;而你的代码没处理这些情况,导致解码后的音频虽然能被播放器容错播放,但ffmpeg这类严格的格式转换工具无法正确识别。
内容的提问来源于stack exchange,提问作者Julio S.




