You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用FFmpeg录制音视频并仅将音频管道输出至Python进程

实现FFmpeg同时输出音视频文件与管道音频流

完全可以实现这个需求,不过你当前的命令存在几个问题,调整后就能正常工作:

问题分析

原命令里的第二个输出(-f s16le pipe:1)没有明确禁用视频流,也没指定音频的采样率、声道数等关键参数,FFmpeg可能无法正确解析输出逻辑,导致音频流输出异常。

修正后的实现

1. 正确的FFmpeg命令逻辑

给第二个输出明确指定:禁用视频流、使用原始PCM编码、设置采样率和声道数,确保FFmpeg能清晰区分两个输出任务。

2. 调整后的Python代码

from subprocess import Popen, PIPE, STDOUT

# 修正后的命令:第一个输出是完整音视频文件,第二个输出是纯原始音频流到管道
record_audio_video_command = (
    f"ffmpeg -i small_bunny_1080p_60fps.mp4 "
    f"-vcodec libx264 output.mp4 "  # 第一个输出:保存成音视频文件
    f"-vn -acodec pcm_s16le -ar 44100 -ac 2 -f s16le pipe:1"  # 第二个输出:仅音频流输出到管道
)

record_command = Popen(
    record_audio_video_command,
    shell=True,
    stdout=PIPE,
    stderr=STDOUT,
    bufsize=10**8  # 增大缓冲区避免进程阻塞,可选参数
)

# 读取原始音频字节并保存(注意用二进制写入模式)
with open("audio_raw.bin", "wb") as f:
    while True:
        data = record_command.stdout.read(320)  # 按320字节块读取音频数据
        if not data:
            break
        f.write(data)

# 等待FFmpeg进程结束
record_command.wait()

关键参数说明

  • -vn:强制第二个输出不包含视频流,只处理音频
  • -acodec pcm_s16le:指定音频编码为原始PCM 16位小端格式,和-f s16le格式对应
  • -ar 44100 -ac 2:设置采样率为44100Hz、双声道,可根据输入文件的实际音频参数调整,保证输出流格式可预测
  • wb写入模式:直接写入原始字节数据,避免转成字符串导致的格式错乱

内容的提问来源于stack exchange,提问作者urico12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:35:04