gstreamer-1.0,RTSP H264 流和共享内存

gstreamer-1.0, RTSP H264 stream and shared memory

我正在尝试在共享内存中写入 RTSP 流,然后将其写入 .mkv 文件中。

我使用这个命令直接在.mkv文件中写入流:

gst-launch-1.0 rtspsrc location=rtsp://admin:admin@192.168.88.248:554/h264 ! rtph264depay ! h264parse ! matroskamux ! filesink location= file.mkv

有效。

现在我添加共享内存:

gst-launch-1.0 rtspsrc location=rtsp://admin:admin@192.168.88.248:554/h264 ! shmsink socket-path=/tmp/foo shm-size=2000000

gst-launch-1.0 shmsrc socket-path=/tmp/foo ! rtph264depay ! h264parse ! matroskamux ! filesink location=file.mkv

我收到消息:

Input buffers need to have RTP caps set on them.

好的,我写

gst-launch-1.0 rtspsrc location=rtsp://admin:admin@192.168.88.248:554/h264 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! shmsink socket-path=/tmp/foo shm-size=2000000

我又收到了这条消息。

我做错了什么?

你需要在shmsrc之后设置上限,例如下面是我的接收管道:

gst-launch-1.0 -v rtspsrc location=rtsp://192.168.1.150:8554/VBoxVideo ! shmsink socket-path=/tmp/foo shm-size=2000000 wait-for-connection=false

你必须记下上面shmsink的上限,以下是我的shmsink的上限:

/GstPipeline:pipeline0/GstShmSink:shmsink0.GstPad:sink: caps = "application/x-rtp\,\ media\=(string)video\,\ payload\=(int)96\,\ clock-rate\=(int)90000\,\ encoding-name\=(string)H264\,\ packetization-mode\=(string)1\,\ profile-level-id\=(string)64002a\,\ sprop-parameter-sets\=(string)\"J2QAKqwbKgHgCJ+WEAAAPoAADqYOAAEZABGQve6wgA\=\=\,KP4Briw\=\"\,\ a-tool\=(string)GStreamer\,\ a-type\=(string)broadcast\,\ a-framerate\=(string)30\,\ a-ts-refclk\=(string)local\,\ a-mediaclk\=(string)sender\,\ ssrc\=(uint)4083957277\,\ clock-base\=(uint)1018840792\,\ seqnum-base\=(uint)13685\,\ npt-start\=(guint64)0\,\ play-speed\=(double)1\,\ play-scale\=(double)1"

现在,要使用 shmsrc,

gst-launch-1.0 -vm shmsrc socket-path=/tmp/foo do-timestamp=true is-live=true num-buffers=1000 ! "application/x-rtp,media=(string)video,payload=(int)96,packetization-mode=(string)1" ! rtph264depay ! h264parse ! mp4mux ! filesink location=file.mp4

注意:我已经从上面设置了上限,还要注意我已经设置了 um-buffers=1000 因为我使用的是 mp4mux,我需要发送和 eos 才能播放文件。

所以在你的情况下:

gst-launch-1.0 -v rtspsrc location=rtsp://admin:admin@192.168.88.248:554/h264 ! shmsink socket-path=/tmp/foo shm-size=2000000

记下 shmsink0 管道中的上限,稍后在您的管道中使用它:

gst-launch-1.0 shmsrc socket-path=/tmp/foo is-live=true num-buffers=1000 ! caps ! rtph264depay ! h264parse ! mp4mux ! filesink location=file.mp4