24

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

开放式RTSP

一开始,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 的 muxer bug

播放器

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

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

但我也有一些错误。

Stream not seekable!
Core dumped ;)

问题

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

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

改进

我使用模拟 rtsp-broadcaster 的 vlc-streamer 在 localhost 上进行了大约 50% 的实验。这是我尝试遵循的手册。

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

4

6 回答 6

10

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

于 2011-10-31T12:22:00.250 回答
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

优点 = 低 CPU 使用率 + 高质量的录音,因为没有转码 / 缺点 = 文件稍大(~6Mb / 分钟)

解决方案2 = 删除命令中的“-acodec copy -vcodec copy”选项。简单的命令

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

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

希望能帮助到你!

于 2014-10-08T00:06:32.313 回答
4

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

于 2011-11-14T05:01:55.147 回答
3

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

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

脚步:

  1. 使用 Oauth 2.0 Playground 直接与 youtube api 交互 - 获取提要
  2. 获取 Youtube 视频的 ID,在 gdata 提要请求中使用它 (v=cpST8yz4w1w)
  3. 解析您想要的 rtsp url 的输出 - 格式 1 是低带宽,格式 6= HIGH
  4. CLI - 使用 openrtsp 请求
  5. 下载 openrtsp 为每个轨道输出单独的文件
  6. ofile1="视频-H263-2000-1"
  7. ofile2="音频-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

明文字段 spec= 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

转储文件,输出将是:

  1. 创建的输出文件:“video-H263-2000-1”
  2. 创建的输出文件:“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;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
于 2012-03-30T15:52:20.530 回答
1

VLC 是第一个想到的。我通常会访问这个旧网站www.vcdhelp.com ,然后在左侧的“操作方法”面板下,单击“所有指南”,在“文本搜索”中输入您的搜索参数。

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

于 2011-11-04T17:03:28.803 回答
0

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

于 2011-11-06T15:18:27.240 回答