rtsp 流捕获

Posted

技术标签:

【中文标题】rtsp 流捕获【英文标题】:rtsp stream capturing 【发布时间】:2011-12-17 10:59:52 【问题描述】:

我正在寻找一些通用的方式来转储 rtsp 流。我想弄清楚,一些 rtsp 流运行良好,服务器正在发送一些可观看的视频。

openRTSP

一开始,google 向我推荐了openRTSP 工具。

 openRTSP -4 $stream_link > $output_file

但该工具转储的输出视频文件并不正确。视频解码器 (ffdec) 返回许多错误,例如“无法解码视频数据包”和“[h264] 无帧!”,这不适合我。

ffmpeg

然后我尝试使用 ffmpeg 工具转储 rtsp 流。

ffmpeg -loglevel debug -i "$stream_link" -s 640x480 -vcodec copy -acodec copy -y $output_file

但流式处理经常被错误中断:

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 730672 >= 730672
av_interleaved_write_frame(): Invalid argument

我正在尝试使用--fflags igndts,但 ffmpeg 不会忽略这些错误。这没有任何意义,因为该错误实际上意味着音频和视频流正在异步发送。最糟糕的是,由中断转储导致的转储文件也不正确。 Ffdec 返回一些错误:

ERROR [mov,mp4,m4a,3gp,3g2,mj2] moov atom not found
ERROR [ffdec] av_open_input_file: Operation not permitted

经过一番谷歌搜索后,我发现它真的很旧ffmpeg's muxer bug。

播放器

比我尝试将 mplayer 与 LIVE_555 库一起使用。

mplayer -noframedrop -dumpfile $output_file -dumpstream $stream_link

但我也有一些错误。

Stream not seekable!
Core dumped ;)

问题

我觉得我做错了什么。这听起来真的很荒谬,没有办法将 rtsp 流保存在正确且可播放的视频文件中。

也许还有一些其他工具可以帮助完成这项任务?实际上,对于所有类型的库和语言,我将不胜感激。但是这个过程应该是自动的并且有cli。

改进

我在本地主机上使用模拟 rtsp-broadcaster 的 vlc-streamer 进行了大约 50% 的实验。这是我尝试关注的manual。

我有非常新鲜和最新的支持 x264 的 ffmpeg,我已经通过 that 有用的线程安装。

【问题讨论】:

原始 RTSP 内容不太适合保存和重播:至少有 2+ 个流涉及您打算保存到纯文件中。解包并保存为众所周知的容器格式,例如 .MP4 似乎是下注的出路。附言好昵称,干得好。 看起来您链接到的 ffmpeg 错误现在已标记为“已修复”... 建议的解决方案是否有效?如果是这样,你能接受它或发布答案吗?谢谢! @Karoly Jorvath 这些都不是真正有效的解决方案 你有没有让它工作? 【参考方案1】:

您是否尝试过vlc 来保存 rtsp 流?它对我有用。我尝试使用图形界面。但它也应该从命令行工作。

【讨论】:

【参考方案2】:

首先想到的是 VLC。我通常会去这个旧网站www.vcdhelp.com,在左侧的“How To”面板下,点击“All Guide”,在“文本搜索”。

有关您的解决方案,请查看:http://www.videohelp.com/tools/StreamTransport(免费软件)

【讨论】:

【参考方案3】:

使用 libpcap 创建一个类似 tcpdump/Wireshark 的工具怎么样?通过删除应用层以下的层(即 TCP/UDP/IP/...)生成的标头,您将可以访问 RTSP 流。然后可以将流转储到磁盘上的文件中。我不得不承认我对 RTP/RTSP 不是很熟悉,所以也许你也必须删除这些标头并将有效负载写入文件(以便媒体播放器播放)。

【讨论】:

【参考方案4】:

德米特里,你应该试试ErlyVideo server。 它可以捕获 RTSP 流量并将其存储在可以通过媒体播放器播放的多媒体文件中。

【讨论】:

它现在死了,迁移了【参考方案5】:

使用 OPENRTSP

将任何 Youtube 视频中的流转储到本地设备

例如,我将使用可用于任何 youtube 视频的 rtsp 提要。

步骤:

    使用 Oauth 2.0 Playground 直接与 youtube api 交互 - 获取源 获取 Youtube 视频的 ID,在 gdata 提要请求中使用它 (v=cpST8yz4w1w) 解析你想要的 rtsp url 的输出 - 格式 1 是低带宽,格式 6= HIGH CLI - 使用 openrtsp 请求 download(s) openrtsp 为每个轨道输出单独的文件 ofile1="video-H263-2000-1" ofile2="audio-AMR-2"

转储流的手动过程的详细信息:

Oauth 2 Playground 是个好工具 https://code.google.com/oauthplayground/

    从列表底部选择“Youtube”,点击“授权”按钮 点击“允许访问” 点击“兑换代币授权码” 您将获得“请求 URI”的文本框

    请求以下内容:

    https://gdata.youtube.com/feeds/api/videos/cpST8yz4w1w?fields=media%3Agroup%2Fmedia%3Acontent%5B%40yt%3Aformat%3D%221%22%5D&v=2&alt=json

明文字段规范=media:group/media:content[@yt:format="1"]

响应是 json 流。从 oauth 表单中复制并粘贴到: http://json.parser.online.fr/ 你会得到类似的东西:

"entry":
"xmlns":"http://www.w3.org/2005/Atom",
"xmlns$media":"http://search.yahoo.com/mrss/",
"xmlns$yt":"http://gdata.youtube.com/schemas/2007",
"media$group":
"media$content":[

"url":"rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp",
"type":"video/3gpp",
"medium":"video",
"expression":"full",
"duration":64,
"yt$format":1

]

从中获取 RTSP url 属性并调用 openrtsp 进行文件转储。您将不得不 WAIT 因为 openrtsp 将流式传输媒体(而不是下载)。如果您要求转储 10 分钟的 .mp4,则必须等待 10 分钟。

注意:rtsp URI 后面的 SDP 为每个轨道维护单独的源。因此,与转储一起,您会为原始媒体文件中的每个轨道获得单独的文件。

$ ./openRTSP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp

转储文件,输出将是:

    创建的输出文件:“video-H263-2000-1” 创建的输出文件:“audio-AMR-2”

标准输出详细信息包括 RTSP 会话的完整协议:

$ ./openRTSP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
Opening connection to 74.125.213.247, port 554...
...remote connection opened
Sending request: OPTIONS rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp RTSP/1.0
CSeq: 2
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)


Received 140 new bytes of response data.
Received a complete OPTIONS response:
RTSP/1.0 200 OK
Public: DESCRIBE, GET_PARAMETER, OPTIONS, PAUSE, PLAY, SETUP, SET_PARAMETER, TEARDOWN
CSeq: 2
Server: Google RTSP 1.0


Sending request: DESCRIBE rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp RTSP/1.0
CSeq: 3
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Accept: application/sdp


Received 776 new bytes of response data.
Received a complete DESCRIBE response:
RTSP/1.0 200 OK
Content-Type: application/sdp
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
Content-Base: rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/
CSeq: 3
Server: Google RTSP 1.0
Content-Length: 404

v=0
o=GoogleStreamer 943086435 202448811 IN IP4 74.125.213.247
s=Video
c=IN IP4 0.0.0.0
b=AS:51
t=0 0
a=control:*
a=range:npt=0-63.800000
m=video 0 RTP/AVP 98
b=AS:39
a=rtpmap:98 H263-2000/90000
a=control:trackID=0
a=cliprect:0,0,144,176
a=framesize:98 176-144
a=fmtp:98 profile=0;level=10
m=audio 0 RTP/AVP 99
b=AS:12
a=rtpmap:99 AMR/8000/1
a=control:trackID=1
a=fmtp:99 octet-align

Opened URL "rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp", returning a SDP description:
v=0
o=GoogleStreamer 943086435 202448811 IN IP4 74.125.213.247
s=Video
c=IN IP4 0.0.0.0
b=AS:51
t=0 0
a=control:*
a=range:npt=0-63.800000
m=video 0 RTP/AVP 98
b=AS:39
a=rtpmap:98 H263-2000/90000
a=control:trackID=0
a=cliprect:0,0,144,176
a=framesize:98 176-144
a=fmtp:98 profile=0;level=10
m=audio 0 RTP/AVP 99
b=AS:12
a=rtpmap:99 AMR/8000/1
a=control:trackID=1
a=fmtp:99 octet-align

Created receiver for "video/H263-2000" subsession (client ports 52320-52321)
Created receiver for "audio/AMR" subsession (client ports 52322-52323)
Sending request: SETUP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=0 RTSP/1.0
CSeq: 4
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Transport: RTP/AVP;unicast;client_port=52320-52321


Received 360 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Transport: RTP/AVP;unicast;mode=play;client_port=52320-52321;server_port=10580-10581;source=74.125.213.247;s-s-rc=7B551CAA
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
CSeq: 4
Server: Google RTSP 1.0


setup response srvAddr port rtpchnl   74.125.213.247 10580 255
Setup "video/H263-2000" subsession (client ports 52320-52321)
Sending request: SETUP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=1 RTSP/1.0
CSeq: 5
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Transport: RTP/AVP;unicast;client_port=52322-52323
Session: 4d04d0e9


Received 360 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Transport: RTP/AVP;unicast;mode=play;client_port=52322-52323;server_port=10580-10581;source=74.125.213.247;s-s-rc=10CD5DCE
Cache-Control: must-revalidate
Date: Fri, 30 Mar 2012 15:27:43 GMT
Expires: Fri, 30 Mar 2012 15:27:43 GMT
Last-Modified: Fri, 30 Mar 2012 15:27:43 GMT
CSeq: 5
Server: Google RTSP 1.0


setup response srvAddr port rtpchnl   74.125.213.247 10580 255
Setup "audio/AMR" subsession (client ports 52322-52323)
Created output file: "video-H263-2000-1"
Created output file: "audio-AMR-2"
Sending request: PLAY rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/ RTSP/1.0
CSeq: 6
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Session: 4d04d0e9
Range: npt=0.000-63.800


Received 394 new bytes of response data.
Received a complete PLAY response:
RTSP/1.0 200 OK
Session: 4d04d0e9;timeout=90
Range: npt=0.000-63.800
RTP-Info: url=rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=0;seq=48690;rtptime=668323490,url=rtsp://v
8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/trackID=1;seq=61565;rtptime=99689199
CSeq: 6
Server: Google RTSP 1.0


Started playing session
Receiving streamed data (for up to 68.800000 seconds)...
Sending request: TEARDOWN rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp/ RTSP/1.0
CSeq: 7
User-Agent: ./openRTSP (LIVE555 Streaming Media v2011.07.08)
Session: 4d04d0e9


Received 72 new bytes of response data.
Received a complete TEARDOWN response:
RTSP/1.0 200 OK
CSeq: 7
Session: 4d04d0e9
Server: Google RTSP 1.0

【讨论】:

您可以使用 openRTSP 将实时摄像机流式传输到文件吗?你暗示这是不可能的,因为流没有尽头! 将在文件系统和文件中,文件不会关闭,直到流终止,它的 OSS 使用将有每个编解码器的 filesink,cpp 模块,所以你可以看看它做了什么【参考方案6】:

ffmpeg + wallclock_as_timestamps 工作

ffmpeg 是实现目标的最简单方法,但这里有一些重要注意事项:

首先,我建议您获取最新版本(2.4.x 而不是 Ubuntu 附带的 1.2.x)。你可以从https://www.ffmpeg.org/download.html获得它

你仍然会得到

Application provided invalid, non monotonically increasing dts to muxer in stream 0: 730672 >= 730672
av_interleaved_write_frame(): Invalid argument error

错误,但你可以摆脱它。这主要是因为 FPS(每秒帧数)在 IP 摄像机上不断变化,具体取决于连接质量。以下是对我有用的 2 个解决方案:

解决方案 1 = 使用 use_wallclock_as_timestamps 选项,使您的命令看起来像

ffmpeg -use_wallclock_as_timestamps 1 -i rtsp://myip:554/mpeg4 -c copy myrecord.avi

PROS = CPU 使用率低 + 录制质量高,因为没有任何内容被转码 / CONS = 文件略大(~6Mb / 分钟)

Solution2 = 删除命令中的“-acodec copy -vcodec copy”选项。简单的命令

ffmpeg -i rtsp://myip:554/mpeg4 myrecord.avi

会成功的。 PROS = 小文件(~1.2Mb / 分钟)/CONS = 高 CPU 使用率(我的计算机上为 6%),因为我认为它正在转码为默认编解码器 + 录制质量差

希望对你有帮助!

【讨论】:

以上是关于rtsp 流捕获的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 rtsp 摄像头流时,opencv 视频捕获滞后

python [VideoCapture]使用视频捕获mp4,rtsp流#cv2

OpenCV - 如何捕获 rtsp 视频流

使用 FFMPEG 库接收 RTSP 流

使用ffmpeg命令推送rtsp流,不包含SPS和PPS帧

rtp rtcp rtsp sip协议了解方法