FFmpeg命令读取RTMP流如何设置超时时间
子标题:FFmpeg命令录制RTMP流为FLV文件时如何设置超时时间 | FFmpeg命令如何解决录制产生阻塞的问题
0x001: 前言
今天在测试程序时遇到两个问题。
Q1:ffmpeg录制RTMP流并保存为FLV文件时,推RTMP流的线程已经结束断掉了,而录制的线程却还一直在录。
Q2:ffmpeg录制RTMP流并保存为FLV文件时,被录制的RTMP流并未推流或并无此房间频道,而录制的线程却还一直在录。
观察日志文件发现录制程序一直阻塞在某个时间点上,经查验这是因为ffmpeg在拉取RTMP流时只要流媒体服务器能正常访问,不管当前拉取的流是否能正常访问都不会退出。
举个例子:rtmp://192.168.1.100:1935/live/changfang,只要192.168.1.100:1935这个服务器地址是能正常请求通的,不管当前changfang频道有没有在推流,ffmpeg都会阻塞至此。当你把整个服务器down掉,你会发现ffmpeg录制的程序会立马退出不再阻塞。此时第一个想法就是寻找设置超时的命令参数。
0x002: 解决方案
遇到问题就找找有没有前人也遇到类似情况,找了一遍基本是C++代码如何解决的问题,没有ffmpeg命令相关的结果。于是查看命令帮助,寻找timeout字眼,找了很多参数,经多次尝试发现有个 -rw_timeout
这是官方描述:
-rw_timeout <int64> ED....... Timeout for IO operations (in microseconds) (from 0 to I64_MAX) (default 0)

读取流也属于IO操作,但此处要注意两点:1.参数单位是微秒,而不是秒。1秒(s)=1000000微秒(μs) 2.参数要放在开流前,否则不会生效
更改前的命令(为了便于分析观看,只留最基础的命令):
ffmpeg -i rtmp://192.168.1.100:1935/live/changfang -c copy -f flv /opt/video/123.flv
更改后的命令:
ffmpeg -rw_timeout 5000000 -i rtmp://192.168.1.100:1935/live/changfang -c copy -f flv /opt/video/123.flv
这样,不管是推流结束还是从未推过流,只要ffmpeg在开流时,IO操作超过设置的秒数,就会自动退出。(如果你读取的流是外网流或内网流不太通畅的情况下,不建议你把此时间设置过短,因为ffmpeg在录制时从开流到产生FLV录制文件也需要时间)
0x003: 完结
如果你正好遇到此问题,希望能帮到你!
FFmpeg命令读取RTMP流如何设置超时时间的更多相关文章
- Go基础系列:为select设置超时时间
Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 After() 谁也无法保证某 ...
- 爬虫学习笔记之为什么要设置超时时间,怎么设置(使用selenium)
一个程序没有设置超时时间,就可以说是一段有缺陷的代码. 读取超时指的就是客户端等待服务器发送请求的时间.(特定地,它指的是客户端要等待服务器发送字节之间的时间.在 99.9% 的情况下这指的是服务器发 ...
- C# UdpClient 设置超时时间
/********************************************************************** * C# UdpClient 设置超时时间 * 说明: ...
- mongodb3.6 (五)net 客户端访问mongodb设置超时时间踩过的“坑”
前言 在上一篇文章中,我们有提到net访问mongodb连接超时默认为30秒,这个时间在实际项目中肯定是太长的.而MongoClientSettings 也确是提供了超时属性,如下图: 可实际使用中, ...
- GuzzleHttp 请求设置超时时间
之前调用一个三方的 WEB API,大量的请求超时,导致 PHP 进程被占用完.整个网站一直报 504. 其中一个优化措施就是对三方 API 调用设置超时时间. use GuzzleHttp\Clie ...
- Mybatis设置超时时间
Mybatis设置超时时间 mybatis如果不指定,默认超时时间是不做限制的,默认值为0.mybatis sql配置超时时间有两种方法: 1.全局配置 在mybatis配置文件的settings节点 ...
- winform设置超时时间
); //设置超时时间 var completedTask = await Task.WhenAny(new Task(async () => { );//执行的方法示例这里用延迟代替 }), ...
- HttpClient 如何设置超时时间
今天分享一个巨坑,就是 HttpClient.这玩意有多坑呢?就是每个版本都变,近日笔者深受其害. 先看一下代码,我要发送请求调用一个c++接口. public static String doPos ...
- scrapy 如何使用代理 以及设置超时时间
使用代理 1. 单文件spider局部使用代理 entry = 'http://xxxxx:xxxxx@http-pro.abuyun.com:xxx'.format("帐号", ...
随机推荐
- Serverless 微服务实践-移动应用包分发服务
背景 阿里云函数计算是事件驱动的全托管计算服务.通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传.函数计算会为您准备好计算资源,以弹性.可靠的方式运行您的代码,并提供日志查询.性能监控.报 ...
- python实现浏览器打开指定url
关键 webbrowser+time+os import os,timeimport webbrowser url = 'http://www.baidu.com' webbrowser.op ...
- 【PCIE-4】---PCIE中部分概念或问题总结(很基础很重要)
前面三小节,介绍了PCIE的基本知识和概念,以及扫描流程.在不求甚解的情况下,我想各位小伙伴应该对PCIE有了个宏观的认识,OK,那么本章我们在之前的基础上,再单独把一些概念和更深层次的问题摘出来具体 ...
- 沈阳网络赛 F - 上下界网络流
"Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...
- net 转 java
一,初衷 从事net 工作已经将近4年,net 很好,C#本身也是个优雅的语言,vs 编辑器功能也异常强大,光拖动断点这个功能java idea就无法实现.但是分布式,架构师的net 在国内岗位上比较 ...
- MySql 常用时间函数
1.date() 提取日期或日期时间表达式的日期部分 select date(create_time) from blog_article; 2.date_format() select date_f ...
- Java入门 - 语言基础 - 12.Number和Math类
原文地址:http://www.work100.net/training/java-number-math.html 更多教程:光束云 - 免费课程 Number和Math类 序号 文内章节 视频 1 ...
- 解决delete 删除sql语句,标识还保留删除之前的问题
我有一些数据,想要删除,首先想到的是delete,但是它会保留之前的标识,后来想用truncate来进行删除,但是,它会全部删除,并且不能加条件,只能回过头使用delete,以下是解决delete删除 ...
- React 解析/ 第二节 使用 Reac
官方脚手架 create-react-app React 提供了一个官方的命令行工具(CLI)—— create-react-app,是专门用于快速搭建单页面应用(SPA)的脚手架,它基于 Webpa ...
- Bootstrap自带的那些常用插件
1.Bootstrap自带的那些常用插件. 1.1模态框 模态框的HTML代码放置的位置 务必将模态框的HTML代码放在文档的最高层级内(也就是说,尽量作为 body 标签的直接子元素),以避免其他组 ...