如何将ActionScript3获取的512浮点音频ByteArray输入FFMPEG避免损坏
ActionScript 3 向FFMPEG推流音频损坏解决方案
问题原因
SoundMixer.computeSpectrum第二个参数设为false时,输出的ByteArray为512个32位大端单精度浮点数:前256个是左声道时域采样值,后256个是右声道时域采样值,数值范围为[-1.0, 1.0]- 未显式指定FFMPEG输入的原始音频格式,FFMPEG默认按其他格式解析,直接导致音频损坏
修复步骤
1. AS3侧代码调整
显式指定ByteArray字节序,避免不同环境默认值差异导致解析错误,同时增加缓冲区刷新避免延迟,修改后代码如下:
import flash.utils.Endian; stage.addEventListener(Event.ENTER_FRAME, update); function update(e:Event):void{ var soundBA:ByteArray = new ByteArray(); SoundMixer.computeSpectrum(soundBA, false, 0); // 显式指定大端序,匹配FFMPEG对应格式要求 soundBA.endian = Endian.BIG_ENDIAN; process.standardInput.writeBytes(soundBA); // 刷新输入缓冲区,避免数据堆积导致音频延迟 process.standardInput.flush(); }
2. FFMPEG启动参数调整
启动FFMPEG时必须明确指定输入的原始音频格式,参考参数如下:
ffmpeg -f f32be -ac 2 -ar 对应采样率 -i pipe:0 【你的其他输出配置】
参数说明:
-f f32be:指定输入格式为32位大端单精度浮点数-ac 2:指定输入为双声道,如果你只需要单声道可以只提取ByteArray前256个浮点数写入,同时把该参数改为-ac 1-ar 对应采样率:采样率计算公式为舞台帧率 × 256,比如舞台帧率为60fps时,采样率为60×256=15360,需要把该参数改为对应数值,否则会出现音频速度异常
内容的提问来源于stack exchange,提问作者PHCM
相关产品推荐
相关产品推荐

