用FFmpeg解码PCM数据
广告
{{v.name}}
从 input.mp3 的第 1 分 30 秒开始,截取 10 秒钟的音频,并将其转换为单声道、44.1kHz 采样率、32 位浮点型的 PCM 数据,代码如下
$ ffmpeg -ss 00:01:30 -t 10 -i input.mp3 -f f32le -ac 1 -ar 44100 -acodec pcm_f32le output.pcm
生成的 output.pcm 文件是二进制文件,需要编写程序来读取这些数据并进行处理。
读取 f32le 格式的 PCM 文件并将前 1000 个样本的值打印出来,代码如下
import struct
# 指定 PCM 文件路径
pcm_file = "output.pcm"
# 打开并读取 PCM 二进制数据
with open(pcm_file, 'rb') as f:
pcm_data = f.read()
# 计算样本总数(每个 32 位浮点数占 4 个字节)
sample_count = len(pcm_data) // 4
print(f"Total samples: {sample_count}")
# 使用 struct 模块解包二进制数据为浮点数列表
# '<' 表示小端字节序,'f' 表示浮点数
samples = struct.unpack('<' + 'f' * sample_count, pcm_data)
# 打印前 1000 个样本的值(或其他处理)
for i in range(1000):
print(f"Sample {i}: {samples[i]}")
读取pcm_s16le(16 位有符号整数)格式的 PCM 文件并将前 1000 个样本的值打印出来,代码如下
import struct
with open("output_s16.pcm", 'rb') as f:
pcm_data = f.read()
# 每个 16 位整数占 2 个字节
sample_count = len(pcm_data) // 2
# 'h' 表示 16 位有符号整数
samples = struct.unpack('<' + 'h' * sample_count, pcm_data)