要将 FFmpeg 推流调整为适应 800×600 分辨率,同时保持正确的宽高比和填充,请使用以下优化后的命令:
FFmpeg 推流命令 (800×600适配版)
ffmpeg -thread_queue_size 512 -f x11grab -draw_mouse 0 \
-video_size 1280x720 -framerate 18 -i $DISPLAY \
-thread_queue_size 1024 -f pulse -i "auto_null.monitor" \
-vf "scale=800:600:force_original_aspect_ratio=decrease,pad=800:600:(ow-iw)/2:(oh-ih)/2:color=black" \
-c:v libx264 -preset ultrafast -tune zerolatency \
-b:v 1500k -maxrate 2000k -bufsize 3000k -g 30 \
-c:a aac -b:a 96k -ar 44100 -ac 2 \
-f flv "rtmp://192.168.1.1:1935/tv/index"
关键修改说明
参数 | 原值 | 新值 | 作用 |
---|---|---|---|
scale | 1024:570 | 800:600 | 目标输出分辨率 |
pad | 1024:570 | 800:600 | 填充至目标分辨率 |
b:v | 2000k | 1500k | 降低码率适应更小分辨率 |
maxrate | 2500k | 2000k | 调整最大码率 |
bufsize | 4000k | 3000k | 减小缓冲区大小 |
优化细节
- 保持宽高比
force_original_aspect_ratio=decrease
确保画面不变形,不足部分用黑边填充(color=black
) - 码率调整
- 800×600 分辨率比原 1024×570 更小,适当降低视频码率(1500k 足够清晰)
- 音频参数保持不变(96k AAC 已足够)
- 硬件兼容性
-preset ultrafast -tune zerolatency
保持低延迟,适合实时推流 - 黑边填充公式
pad=宽度:高度:(宽度-输入宽度)/2:(高度-输入高度)/2
自动计算居中位置
完整参数解释
-thread_queue_size 512 # 视频输入缓冲区
-f x11grab # 捕获X11显示
-draw_mouse 0 # 不绘制鼠标
-video_size 1280x720 # 原始捕获分辨率(需与$DISPLAY实际分辨率一致)
-framerate 18 # 输入帧率
-i $DISPLAY # 默认显示设备
-thread_queue_size 1024 # 音频输入缓冲区
-f pulse # PulseAudio输入
-i "auto_null.monitor" # 音频设备名
-vf "scale=800:600:...,pad=..." # 视频滤镜链:
# 1. 缩放到800x600(保持比例)
# 2. 填充黑边至800x600
-c:v libx264 # H.264编码
-preset ultrafast # 最快编码速度
-tune zerolatency # 零延迟优化
-b:v 1500k # 视频目标码率
-maxrate 2000k # 最大瞬时码率
-bufsize 3000k # 码率控制缓冲区
-g 30 # GOP长度(关键帧间隔)
-c:a aac # AAC音频编码
-b:a 96k # 音频码率
-ar 44100 # 采样率
-ac 2 # 立体声
-f flv # 输出FLV格式
"rtmp://..." # RTMP推流地址
常见问题处理
- 画面变形
检查原始分辨率比例(1280x720
是16:9,800x600
是4:3),如需强制拉伸:
-vf "scale=800:600:force_original_aspect_ratio=disable"
- 黑边颜色修改
将pad=...:color=black
中的颜色改为其他值(如color=0x121212
) - 性能不足
- 降低分辨率至
640x480
- 使用硬件加速(如
-c:v h264_nvenc
for NVIDIA)
- 音频不同步
增加-async 1
参数或调整-audio_drift_threshold
效果验证命令
# 查看推流统计信息(Ctrl+C停止)
ffplay "rtmp://192.168.1.1:1935/tv/index"
# 检查分辨率是否达标
ffprobe -v error -show_streams \
-select_streams v "rtmp://192.168.1.1:1935/tv/index" | grep -E 'width|height'