ffmpeg一般问题解决
转:https://blog.csdn.net/gzw19961018/article/details/103319112
使用ffmpeg推摄像头视频流中遇到的问题
- 问题一 推流不稳定,过10分钟ffmpeg会自动停止
- 问题二 推流时不时报错且拉下来的高清视频流花屏,低分辨率情况稍好
- 问题三 ffmpeg拉流转发频繁丢包警告max delay reached. need to consume packet
问题一 推流不稳定,过10分钟ffmpeg会自动停止
原因
推流语句不合适
解决方法—合适的推流语句
ffmpeg -i rtsp://admin_name:password@192.168.21.8:555/h264/ch1/main/av_stream -f flv -an rtmp://192.168.1.1:1900/live/test98
问题二 推流时不时报错且拉下来的高清视频流花屏,低分辨率情况稍好
阶段性报错 error while decoding MB xx xx
原因与解决方法
问题应该在于ffmpeg源文件udp.c中 ,UDP_MAX_PKT_SIZE值设置过小,将其增大2的整数倍。
修改后重新编译FFmpeg
如何重新编译
修改完成后保存,终端切换到ffmpeg文件夹下
sudo make
sudo make install
问题三 ffmpeg拉流转发频繁丢包警告max delay reached. need to consume packet
原因
rtsp协议默认使用udp导致的问题,让rtsp强制使用tcp方式可以一定程度避免丢包。
解决方法
在指令中添加-rtsp_transport tcp
ffmpeg -rtsp_transport tcp -i
rtsp://admin_name:password@192.168.21.8:555/h264/ch1/main/av_stream -f flv -an rtmp://192.168.1.1:1900/live/test98
转:https://zhuanlan.zhihu.com/p/73984438
ffmpeg cmd的参数实在太多,因此这里只介绍基础的、以及笔者了解的跟读者们做一个分享。
首先,来看一个将本地视频文件推流到服务器的最基础的命令:
ffmpeg -i ${input_video} -f flv rtmp://${server}/live/${streamName}
-i
:表示输入视频文件,后跟视频文件路径/URL。-f
:强制ffmpeg采用某种格式,后跟对应的格式。
上文有提到,RTMP一般用flv流数据,因此多设置-f flv
。
接着,另一个基本需求,就是在推流的时候希望不要加上音频,这个也好实现:
ffmpeg -i ${input_video} -vcodec copy -an -f flv rtmp://${server}/live/${streamName}
-vcodec
:指定视频解码器,v
是视频video
,codec
就是解码器,后跟解码器名称,copy
表示不作解码;-acodec
:指定音频解码器,同理,a
是audio
,后跟解码器名称。an
代表acodec none
就是去掉音频的意思。
关于a/v
的写法很多,除了上面介绍的,还有-c:v copy -c:a copy
等
笔者遇到过2个推流失败的case:
- 推一个RTSP摄像头的流数据时,一旦打开该摄像头的音频轨道就会在
av_interleaved_write_frame()
函数处出错。(返回码不记得了) - 使用英飞拓某几款摄像头推流时,总是失败,返回码显示-33。
以上2个问题都成功定位问题所在:
- 操作人员在打开音频轨道时总是同时打开2个音频轨道,只要选择关闭其中1个音频,马上就可以推流了;
- 这几款摄像头同时包括多个视频码流,似乎他们会通过RTSP同时把多个码流同时传过来;最后在代码中强行过滤视音频码流,只保留一路视频+一路音频就可以了。
原因归结为一个:flv格式至多只能包括一个视频流和一个音频流。