如何用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
相关产品推荐
相关产品推荐

