首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过ffmpeg使用Unicast RTSP URI

通过ffmpeg使用Unicast RTSP URI
EN

Stack Overflow用户
提问于 2019-08-06 12:37:12
回答 1查看 887关注 0票数 0

我对ffmpeg相当陌生,所以我当然很想得到一个"M“到”RTFM“。这些文件.不太容易.导航,但我在努力。

目标是开发一个包含ffmpeg的编译服务器,但首先,我需要通过CLI让它工作。

我有一个标准轴监视相机(轴M5525-E),设置为一个ONVIF设备(但这并不是真正相关的问题)。

当我查询它时,我得到以下URI作为它的视频流URI:

代码语言:javascript
复制
rtsp://192.168.4.12/onvif-media/media.amp?profile=profile_1_jpeg&streamtype=unicast

IP是沙箱网络的本地网络。

我将身份验证参数添加到其中,如下所示:

代码语言:javascript
复制
rtsp://<LOGIN>:<PASSWORD>@192.168.4.12/onvif-media/media.amp?profile=profile_1_jpeg&streamtype=unicast

(是的,我知道这不安全,但这只是为了测试和可行性研究。整个该死的沙箱是一个不安全的混乱)。

现在,如果我使用VLC来打开URI,它就会工作得很好(当然)。使用数据包分析器查看它时,我看到设备和我的计算机之间的协商(在.2上,为了简洁起见):

代码语言:javascript
复制
Id = 11
Source = 192.168.4.12
Destination = 192.168.4.2
Captured Length = 82
Packet Length = 82
Protocol = TCP
Date Received = 2019-08-06 12:18:37 +0000
Time Delta = 1.342024087905884
Information = 554 -> 53755 ([ECN, ACK, SYN], Seq=696764098, Ack=3139240483, Win=28960)
                    °
                    °
                    °
Id = 48
Source = 192.168.4.12
Destination = 192.168.4.2
Captured Length = 366
Packet Length = 366
Protocol = TCP
Date Received = 2019-08-06 12:18:38 +0000
Time Delta = 2.09382700920105
Information = 554 -> 53755 ([ACK, PUSH], Seq=696765606, Ack=3139242268, Win=1073)

紧接着是UDP流数据包。

但是,如果我将相同的URI提供给ffmpeg:

代码语言:javascript
复制
ffmpeg -i rtsp://<LOGIN>:<PASSWORD>@192.168.4.12/onvif-media/media.amp?profile=profile_1_jpeg&streamtype=unicast -c:v libx264 -crf 21 -preset veryfast -g 30 -sc_threshold 0 -f hls -hls_time 4 /Volumes/Development/webroot/fftest/stream.m3u8

我什么也得不到。设备和我的电脑之间根本没有任何协商。

然后,如果我删除&streamtype=unicast参数,就会得到一个协商和一个流:

代码语言:javascript
复制
Id = 10
Source = 192.168.4.12
Destination = 192.168.4.2
Captured Length = 82
Packet Length = 82
Protocol = TCP
Date Received = 2019-08-06 10:37:48 +0000
Time Delta = 3.047425985336304
Information = 554 -> 49606 ([ECN, ACK, SYN], Seq=457514925, Ack=2138974173, Win=28960)
                    °
                    °
                    °
Id = 31
Source = 192.168.4.12
Destination = 192.168.4.2
Captured Length = 345
Packet Length = 345
Protocol = TCP
Date Received = 2019-08-06 10:37:49 +0000
Time Delta = 3.840152025222778
Information = 554 -> 49606 ([ACK, PUSH], Seq=457516393, Ack=2138975704, Win=1039)

当然,我会继续找出为什么不会发生这种情况,并会发布我找到的任何解决方案,但是,就像我说的,我对此相当陌生,所以我完全有可能遗漏了一些基本的东西,并希望得到任何指导。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-06 13:48:36

您需要转义命令行URL上的特殊字符,它们是"?“和"&“,因为命令行在Bash上运行,而这些字符意味着bash (分别是通配符和叉),所以它会解释它们。

通过转义这些字符,完整的URL将被发送到ffmpeg。

为了摆脱一个字符,在它前面加上一个破折号,就像我在下面的命令行中所做的那样。

每次在命令行上有一个&字符时:使用\&

同样适用于 char:使用\?

请试一试。1)

代码语言:javascript
复制
ffmpeg -i rtsp://LOGIN:PASS@192.168.4.12/onvif-media/media.amp\?profile=profile_1_jpeg\&streamtype=unicast -c:v libx264 -crf 21 -preset veryfast -g 30 -sc_threshold 0 -f hls -hls_time 4

还有第二种方法可以发送完整的参数行,而不必转义单个字符:就是在URL周围使用单引号。

像这样:(如。2)

代码语言:javascript
复制
ffmpeg -i 'rtsp://LOGIN:PASS@192.168.4.12/onvif-media/media.amp?profile=profile_1_jpeg&streamtype=unicast' -c:v libx264 -crf 21 -preset veryfast -g 30 -sc_threshold 0 -f hls -hls_time 4

两者都应该工作和解决你的问题。如果你还有其他的问题,请在这里报告,这样我就能帮你充分发挥作用。

PS:例1和例2没有优点和缺点,它们只是不同的方式来为您的情况做相同的事情。按照你的风格使用你感觉更好的方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57376259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档