问题分析:音视频不同步(声音比画面快)
你的 FFmpeg 命令捕获了 X11 桌面(视频) 和 PulseAudio 音频(auto_null.monitor
),但最终输出的流 声音比画面快,说明 音频和视频的时间戳未正确对齐。
解决方案
1. 检查音频和视频的输入时间基准
FFmpeg 会自动处理音视频同步,但如果输入设备的时钟不同步(如 X11 和 PulseAudio 时间戳不一致),会导致不同步。
解决方法:强制统一时间基准,使用 -use_wallclock_as_timestamps 1
和 -fflags nobuffer
减少延迟。
修改后的命令
ffmpeg -thread_queue_size 512 -f x11grab -draw_mouse 0 \
-video_size 800x450 -framerate 22 -i $DISPLAY+0,0 \
-use_wallclock_as_timestamps 1 -fflags nobuffer \ # 关键参数
-thread_queue_size 1024 -f pulse -i "auto_null.monitor" \
-vf "scale=800:-2,pad=800:450:(ow-iw)/2:(oh-ih)/2:black" \
-c:v libx264 -preset veryfast -tune zerolatency \
-b:v 1500k -maxrate 2000k -bufsize 3000k -g 30 \
-c:a aac -b:a 96k -ar 44100 -ac 2 \
-f flv "rtmp://127.0.0.1:1935/tv/index"
2. 调整音频延迟(-async
或 -filter_complex
)
如果声音仍然比画面快,可以 手动调整音频延迟:
方法 A:使用 -async
参数
ffmpeg -thread_queue_size 512 -f x11grab -draw_mouse 0 \
-video_size 800x450 -framerate 22 -i $DISPLAY+0,0 \
-thread_queue_size 1024 -f pulse -i "auto_null.monitor" \
-vf "scale=800:-2,pad=800:450:(ow-iw)/2:(oh-ih)/2:black" \
-c:v libx264 -preset veryfast -tune zerolatency \
-b:v 1500k -maxrate 2000k -bufsize 3000k -g 30 \
-c:a aac -b:a 96k -ar 44100 -ac 2 \
-async 1000 \ # 关键:音频同步调整(单位:毫秒)
-f flv "rtmp://127.0.0.1:1935/tv/index"
-async 1000
:尝试让音频延迟 1 秒对齐视频(调整数值直到同步)。
方法 B:使用 aresample
滤镜
ffmpeg -thread_queue_size 512 -f x11grab -draw_mouse 0 \
-video_size 800x450 -framerate 22 -i $DISPLAY+0,0 \
-thread_queue_size 1024 -f pulse -i "auto_null.monitor" \
-filter_complex "[1:a]aresample=async=1000[a]" \ # 音频重新采样+延迟
-vf "scale=800:-2,pad=800:450:(ow-iw)/2:(oh-ih)/2:black" \
-c:v libx264 -preset veryfast -tune zerolatency \
-b:v 1500k -maxrate 2000k -bufsize 3000k -g 30 \
-c:a aac -b:a 96k -ar 44100 -ac 2 \
-map 0:v -map "[a]" \ # 映射视频和调整后的音频
-f flv "rtmp://127.0.0.1:1935/tv/index"
aresample=async=1000
:调整音频同步(单位:毫秒)。
3. 检查 PulseAudio 延迟
如果 auto_null.monitor
的音频缓冲太大,可能导致声音提前:
方法:降低 PulseAudio 缓冲
pacmd set-source-latency auto_null.monitor 10000 # 设置 10ms 延迟(单位:微秒)
然后重新运行 FFmpeg。
4. 终极方案:强制音视频同步(-vsync
和 -audio_sync_method
)
ffmpeg -thread_queue_size 512 -f x11grab -draw_mouse 0 \
-video_size 800x450 -framerate 22 -i $DISPLAY+0,0 \
-thread_queue_size 1024 -f pulse -i "auto_null.monitor" \
-vf "scale=800:-2,pad=800:450:(ow-iw)/2:(oh-ih)/2:black" \
-c:v libx264 -preset veryfast -tune zerolatency \
-b:v 1500k -maxrate 2000k -bufsize 3000k -g 30 \
-c:a aac -b:a 96k -ar 44100 -ac 2 \
-vsync 1 -audio_sync_method 1 \ # 强制同步
-f flv "rtmp://127.0.0.1:1935/tv/index"
-vsync 1
:强制视频按音频同步。-audio_sync_method 1
:使用音频作为主时钟。
总结
问题 | 解决方案 |
---|---|
音视频时钟不同步 | -use_wallclock_as_timestamps 1 -fflags nobuffer |
声音比画面快 | -async 1000 (调整数值)或 aresample=async=1000 |
PulseAudio 缓冲问题 | pacmd set-source-latency auto_null.monitor 10000 |
强制同步 | -vsync 1 -audio_sync_method 1 |
推荐先尝试 -async 1000
,如果仍然不同步,再调整数值或改用 aresample
滤镜。
如果问题持续,请提供 ffmpeg
的完整控制台输出,以便进一步分析!