ffmpeg一般问题解决

转:https://blog.csdn.net/gzw19961018/article/details/103319112

使用ffmpeg推摄像头视频流中遇到的问题

问题一 推流不稳定,过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是视频videocodec就是解码器,后跟解码器名称,copy表示不作解码;
  • -acodec:指定音频解码器,同理,aaudio,后跟解码器名称。an代表acodec none就是去掉音频的意思。

关于a/v的写法很多,除了上面介绍的,还有-c:v copy -c:a copy

笔者遇到过2个推流失败的case:

  1. 推一个RTSP摄像头的流数据时,一旦打开该摄像头的音频轨道就会在av_interleaved_write_frame()函数处出错。(返回码不记得了)
  2. 使用英飞拓某几款摄像头推流时,总是失败,返回码显示-33。

以上2个问题都成功定位问题所在:

  1. 操作人员在打开音频轨道时总是同时打开2个音频轨道,只要选择关闭其中1个音频,马上就可以推流了;
  2. 这几款摄像头同时包括多个视频码流,似乎他们会通过RTSP同时把多个码流同时传过来;最后在代码中强行过滤视音频码流,只保留一路视频+一路音频就可以了。

原因归结为一个:flv格式至多只能包括一个视频流和一个音频流

原文地址:https://www.cnblogs.com/81/p/13566112.html