树莓派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()
关键修改说明
- 音频持续采集:将音频读取和帧存储逻辑移入while循环,确保录制期间持续采集音频数据。
- 同步启停控制:按钮触发时同时停止视频录制并跳出循环,随后立即终止音频流,保证音视频录制时长完全一致。
- FFmpeg参数优化:
- 转H.264到MP4时添加
-r 30指定帧率(树莓派摄像头默认30fps,可按需调整),避免帧率识别错误导致的时长计算偏差。 - 合并时添加
-shortest参数,让输出文件以较短的音视频流长度为准,消除结尾不同步问题。
- 转H.264到MP4时添加
额外排查点
如果仍存在轻微同步偏差,可尝试:
- 调整音频采集的
frames_per_buffer参数,减少音频延迟。 - 通过
arecord -l命令检查USB麦克风的实际采样率,确保与代码中设置的44100一致。
内容的提问来源于stack exchange,提问作者LAC
相关产品推荐
相关产品推荐

