C++使用FFmpeg将内存截图编码为RTSP流无输出问题咨询
常见问题排查方向
1. FFmpeg输入参数不匹配
- 你需要确保传给FFmpeg的输入参数完全和内存中截图的格式对齐,以下参数任何一个出错都会导致FFmpeg解析帧失败,最终输出空流:
- 像素格式:比如你截图是
RGBA还是RGB24,要和-pix_fmt参数完全一致,很多系统截图接口默认输出带alpha通道的RGBA,如果FFmpeg参数配成rgb24会直接解析出错 - 分辨率:截图的实际宽高必须和
-video_size参数完全一致,哪怕差1像素都会导致帧解析错位 - 帧率:你100ms截一帧对应帧率是10fps,FFmpeg输入的
-framerate要配10,不要错配成输出侧的帧率
- 像素格式:比如你截图是
- 示例正确的rawvideo输入参数模板:
ffmpeg -f rawvideo -pix_fmt rgba -video_size 1920x1080 -framerate 10 -i pipe:0 <后续编码推流参数>
2. 管道写入逻辑错误
- 每次写入管道的内容必须是完整的一帧裸数据,不能有多余的头信息(比如你如果把PNG/JPG的编码后数据传给rawvideo格式的FFmpeg输入,会直接解析失败)
- 检查内存写入的字节数:单帧字节数=宽×高×每个像素的字节数,比如1920×1080的RGBA帧单帧大小是1920×1080×4=8294400字节,每次必须写满这个大小再flush管道,不要分包写一半就提交
- 不要忘记写完每帧后调用管道的flush操作,否则数据会缓存在用户态缓冲区,FFmpeg读不到数据自然输出空流
3. RTSP推流参数配置错误
- FFmpeg输出RTSP的时候必须加
-rtsp_transport tcp参数,UDP传输场景下VLC默认可能收不到关键帧,尤其是低帧率场景下关键帧间隔太长的问题会更明显 - 必须配置强制关键帧间隔,10fps的场景下关键帧间隔设为20也就是2秒一个关键帧即可,参数为
-g 20 - 编码格式必须选通用的H.264,不要用HEVC或者其他私有编码,参数示例:
-c:v libx264 -preset ultrafast -tune zerolatency -g 20 -f rtsp rtsp://127.0.0.1:8554/stream - 不要漏加
-f rtsp参数指定输出格式,很多人会把输出格式漏写导致FFmpeg不知道怎么封装RTSP流
4. 快速调试方法
- 先把FFmpeg的输出改成本地文件,比如
-f mp4 test.mp4,跑10秒后停止,看test.mp4能不能正常播放,如果不能就是输入侧的问题,如果能就是RTSP推流侧的问题 - 打开FFmpeg的debug日志,加
-v debug参数,看有没有invalid frame、buffer underflow之类的报错,直接定位问题点
内容的提问来源于stack exchange,提问作者benny b
相关产品推荐
相关产品推荐

