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

树莓派4音视频录制后FFmpeg合并不同步问题求助

树莓派4 USB麦+摄像头录屏后FFmpeg合并音视频不同步问题解决

问题根源

你的代码存在两个核心逻辑错误,直接导致音视频长度不匹配、同步失败:

  • 音频录制未持续执行:音频读取和帧存储的代码在while循环外部,仅执行了一次,最终生成的Audio.wav仅1024字节(约0.02秒),和视频长度完全不符。
  • 音视频启停未同步:按钮触发时仅停止了视频录制,音频流的停止逻辑未与视频绑定,且录制期间没有持续采集音频数据。

修正后的代码

# coding=utf-8
from picamera import PiCamera
import pyaudio
import wave
import os
import RPi.GPIO as GPIO

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

print("Ready")

# 初始化设备
camera = PiCamera()
camera.resolution = (1920, 1080)
audio = pyaudio.PyAudio()
stream = audio.open(
    format=pyaudio.paInt16,
    channels=1,
    rate=44100,
    input=True,
    frames_per_buffer=1024
)
frames = []

# 同步启动音视频录制
camera.start_recording("Video.h264")
print("Recording...")

# 循环录制,同时采集音频和检测按钮
while True:
    # 持续读取音频数据
    data = stream.read(1024, exception_on_overflow=False)
    frames.append(data)
    
    # 检测按钮按下
    if GPIO.input(10) == GPIO.HIGH:
        camera.stop_recording()
        print("Recording stopped")
        break

# 停止音频采集并保存文件
stream.stop_stream()
stream.close()
audio.terminate()

with wave.open("Audio.wav", "wb") as sound_file:
    sound_file.setnchannels(1)
    sound_file.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
    sound_file.setframerate(44100)
    sound_file.writeframes(b''.join(frames))

# 转码与合并优化
print("Converting to MP4...")
# 指定帧率避免FFmpeg自动识别错误
os.system("ffmpeg -r 30 -i Video.h264 -c:v copy Video.mp4")

print("Merging audio and video...")
# 以较短流为准确保结尾同步
os.system("ffmpeg -i Video.mp4 -i Audio.wav -c:v copy -c:a aac -shortest vea.mp4")

# 清理GPIO资源
GPIO.cleanup()

关键修改说明

  1. 音频持续采集:将音频读取和帧存储逻辑移入while循环,确保录制期间持续采集音频数据。
  2. 同步启停控制:按钮触发时同时停止视频录制并跳出循环,随后立即终止音频流,保证音视频录制时长完全一致。
  3. FFmpeg参数优化:
    • 转H.264到MP4时添加-r 30指定帧率(树莓派摄像头默认30fps,可按需调整),避免帧率识别错误导致的时长计算偏差。
    • 合并时添加-shortest参数,让输出文件以较短的音视频流长度为准,消除结尾不同步问题。

额外排查点

如果仍存在轻微同步偏差,可尝试:

  • 调整音频采集的frames_per_buffer参数,减少音频延迟。
  • 通过arecord -l命令检查USB麦克风的实际采样率,确保与代码中设置的44100一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:20:32