RTSP流捕获

24

我正在寻找一种通用的方法来转储RTSP流。 我想弄清楚某些RTSP流是否正常工作,服务器是否发送了可观看的视频。

openRTSP

首先,谷歌建议我使用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复用器错误

mplayer播放器

然后我尝试使用带有LIVE_555库的mplayer进行操作。

mplayer -noframedrop -dumpfile ${output_file} -dumpstream ${stream_link}

但是我也遇到了一些错误。

Stream not seekable!
Core dumped ;)

问题

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

也许有一些其他工具可以帮助完成这个任务?实际上,我会感激所有种类的库和语言的任何建议。但是该过程应该是自动的,并且具有cli。

细化

我在本地主机上使用模拟rtsp广播器的vlc-streamer进行了大约50%的实验。这里有一个我尝试遵循的手册

我真的很新,最新的ffmpeg支持x264,我通过那个有用的线程安装了它。


4
原始的RTSP内容不太适合用于保存和回放:至少涉及到要将2个或更多的流保存到普通文件中。将其解包并保存为众所周知的容器格式,如.MP4,似乎是最好的出路。附言:昵称很不错,干得好。 - Roman R.
看起来你链接的FFmpeg bug现在被标记为“已修复”... - rogerdpack
任何建议的解决方案有用吗?如果有用,请接受它或发布一个答案。谢谢! - Karoly Horvath
@Karoly Jorvath 这些都不是有效的解决方案。 - ДМИТРИЙ МАЛИКОВ
你通过任何方式让它工作了吗? - Bilal Ahmed Yaseen
6个回答

10

你尝试使用VLC保存RTSP流吗?对我很有效。我用的是图形界面,但应该也可以通过命令行完成。


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

错误,但您可以摆脱它。这主要是因为IP摄像机的FPS(每秒帧数)会根据连接质量不断变化。以下是两个对我有用的解决方案:

解决方案1 = 使用use_wallclock_as_timestamps选项,使您的命令如下:

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

优点 = 低CPU使用率 + 录制质量好,因为没有进行任何转码 / 缺点 = 文件稍微有点大(约每分钟6Mb)

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

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

将能够解决问题。优点是文件小(每分钟约1.2 Mb),缺点是CPU使用率高(在我的电脑上达到6%),因为我认为它正在转码为默认编解码器 + 录音质量不佳。

希望对您有所帮助!


4

Dmitry,你应该尝试使用ErlyVideo服务器。它可以捕获RTSP流量并将其存储为多媒体文件,这些文件可以在媒体播放器中播放。


它已经死了,迁移完成。 - imbr

3

使用 OPENRTSP 将任何Youtube视频的流转储到本地设备。

举例来说,我会使用任何youtube视频可用的rtsp源。

步骤:

  1. 使用Oauth 2.0 playground与YouTube API直接交互-获取源
  2. 获取Youtube视频ID,并在gdata源请求中使用它(v=cpST8yz4w1w)
  3. 解析输出以获取所需的rtsp url-格式1是低带宽,格式6=高带宽
  4. CLI-使用openrtsp发出请求
  5. 下载openrtsp输出的各自文件轨道
  6. ofile1="video-H263-2000-1"
  7. ofile2="audio-AMR-2"

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

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

  1. 从列表底部选择 "Youtube",点击 "授权" 按钮
  2. 点击 "允许访问"
  3. 点击 "交换授权码以获取令牌"
  4. 您将获得 "请求URI" 的文本框
  5. 请求以下内容:

    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进行文件转储。您需要等待,因为openrtsp将流式传输媒体(而非下载)。如果您请求转储10分钟的.mp4文件,则需要等待10分钟。
注意:rtsp URI后面的SDP为每个轨道维护单独的源。因此,除了转储外,您还会获得原始媒体文件中每个轨道的单独文件。
$ ./openRTSP rtsp://v8.cache8.c.youtube.com/CiILENy73wIaGQlcw_gs85OUchMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp

Dumpfile,输出将是:

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

Stdout详细信息包括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;ssrc=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;ssrc=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将实时摄像头流式传输到文件吗?你暗示这是不可能的,因为流没有结束! - noelicus
文件将存在于文件系统和文件中,直到流终止,文件不会关闭。它的OSS使用将具有每个编解码器的filesink.cpp模块,因此您可以看到它的功能。 - Robert Rowntree

1

0
如何使用libpcap创建类似tcpdump/Wireshark的工具?通过删除应用层以下的层生成的头部(即TCP/UDP/IP/...),您将可以访问RTSP流。然后可以将流转储到磁盘文件中。我必须承认,我对RTP/RTSP并不是很熟悉,因此也许您还需要删除这些头部,只需将有效载荷写入文件中(供媒体播放器回放)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接