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

如何通过OpenCV摄像头捕获获取音频?

实时音视频捕获+处理+同步输出解决方案

方案一:使用PyAV(推荐,原生支持音视频同步)

PyAV基于FFmpeg,可直接捕获系统音视频设备,处理后能直接封装成视频文件或实时流,无需手动处理同步问题。

步骤:

  1. 安装依赖:
pip install av
  1. 示例代码(捕获摄像头+麦克风,处理音频增益后输出MP4):
import av
import numpy as np

# 配置输入设备(根据系统调整格式参数)
# Linux: 视频用v4l2,音频用pulse;Windows: 视频/音频用dshow;Mac: 用avfoundation
video_input = av.open('0', format='v4l2')
audio_input = av.open('default', format='pulse')

# 配置输出:封装为MP4文件
output = av.open('processed_output.mp4', 'w')
# 添加视频流
video_stream = output.add_stream('h264', rate=30)
video_stream.width = 640
video_stream.height = 480
video_stream.pix_fmt = 'yuv420p'
# 添加音频流
audio_stream = output.add_stream('aac', rate=44100)
audio_stream.channels = 2

# 自定义音频处理函数(示例:音量增益)
def process_audio(frame):
    samples = frame.to_ndarray()
    processed_samples = np.clip(samples * 1.5, -1.0, 1.0)
    new_frame = av.AudioFrame.from_ndarray(processed_samples, format=frame.format)
    new_frame.sample_rate = frame.sample_rate
    new_frame.channels = frame.channels
    return new_frame

# 同步捕获、处理与编码
for video_frame in video_input.decode(video=0):
    # 视频处理示例:转灰度
    img = video_frame.to_ndarray(format='bgr24')
    gray_img = np.mean(img, axis=2).astype(np.uint8)
    processed_video_frame = av.VideoFrame.from_ndarray(gray_img, format='gray8')
    processed_video_frame.width = video_frame.width
    processed_video_frame.height = video_frame.height
    # 编码并写入视频帧
    for packet in video_stream.encode(processed_video_frame):
        output.mux(packet)
    
    # 捕获并处理音频帧
    try:
        for audio_frame in audio_input.decode(audio=0):
            processed_audio_frame = process_audio(audio_frame)
            for packet in audio_stream.encode(processed_audio_frame):
                output.mux(packet)
    except StopIteration:
        pass

# 刷新编码器缓存
for packet in video_stream.encode():
    output.mux(packet)
for packet in audio_stream.encode():
    output.mux(packet)

# 关闭所有流
video_input.close()
audio_input.close()
output.close()

方案二:OpenCV + PyAudio 手动同步(适配已有OpenCV代码场景)

若需保留OpenCV视频捕获逻辑,可搭配PyAudio抓音频,最后通过FFmpeg合并音视频(需手动处理同步问题)。

步骤:

  1. 安装依赖:
pip install opencv-python pyaudio numpy
  1. 示例代码:
import cv2
import pyaudio
import numpy as np
import wave
import subprocess
from datetime import datetime

# 视频捕获配置
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
cap.set(cv2.CAP_PROP_FPS, 30)

# 音频捕获配置
CHUNK = 1024
FORMAT = pyaudio.paFloat32
CHANNELS = 2
RATE = 44100
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)

# 临时输出文件
video_out = cv2.VideoWriter('temp_video.avi', cv2.VideoWriter_fourcc(*'XVID'), 30, (640, 480))
audio_frames = []

# 音频处理函数
def process_audio_chunk(chunk):
    samples = np.frombuffer(chunk, dtype=np.float32)
    return np.clip(samples * 1.5, -1.0, 1.0).tobytes()

# 捕获循环(示例运行10秒)
start_time = datetime.now()
while (datetime.now() - start_time).seconds < 10:
    ret, frame = cap.read()
    if not ret:
        break
    # 视频处理:转灰度
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray_frame = cv2.cvtColor(gray_frame, cv2.COLOR_GRAY2BGR)
    video_out.write(gray_frame)
    cv2.imshow('Processed Video', gray_frame)
    
    # 捕获并处理音频
    audio_chunk = stream.read(CHUNK)
    audio_frames.append(process_audio_chunk(audio_chunk))
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 资源释放
cap.release()
video_out.release()
cv2.destroyAllWindows()
stream.stop_stream()
stream.close()
p.terminate()

# 保存音频
wf = wave.open('temp_audio.wav', 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(audio_frames))
wf.close()

# 合并音视频(需系统安装FFmpeg)
subprocess.run([
    'ffmpeg', '-i', 'temp_video.avi', '-i', 'temp_audio.wav',
    '-c:v', 'libx264', '-c:a', 'aac', '-strict', 'experimental',
    'final_output.mp4'
])

关键提示

  • PyAV方案无需手动处理音画同步,稳定性更强,适合大多数实时处理场景
  • OpenCV+PyAudio方案需注意时钟差异导致的同步问题,最终合并依赖FFmpeg
  • 音频处理逻辑可替换为自定义需求(如降噪、回声消除等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:35:03