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
我正在尝试在共享内存中写入 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