音视频不同步

问题分析:音视频不同步(声音比画面快)

你的 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 的完整控制台输出,以便进一步分析!

No Comments

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next