使用 Gstreamer 将 UDP 流以不同的比特率或视频大小保存到 mp4
Save UDP stream to mp4 in different bitrate or videosize using Gstreamer
我正在尝试将 UDP 流存储到不同大小的 MP4 文件。
使用 1080 视频生成 UDP 流用于开发目的,稍后将被 IP Camera 取代
UDP 服务器接收器:
gst-launch-0.10 -v filesrc location=video.mp4 ! decodebin ! ffmpegcolorspace ! videoscale ! video/x-raw-yuv,width=1920,height=1088 ! timeoverlay halignment=right ! clockoverlay time-format="%Y/%m/%d %H:%M:%S" ! x264enc tune=zerolatency bitrate=2998 speed-preset=superfast ! queue ! rtph264pay name=pay0 pt=96 ! udpsink host=127.0.0.1 port=5000
通过以下管道,我可以使用与 UDP 流式传输相同的视频显示大小播放 UDP 流
gst-launch-1.0 udpsrc uri=udp://127.0.0.1:5000 \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01ADdoFB+/8CqwIAEAAAAMAQAAADKPFCqg\=\,aO88gA\=\=\", payload=(int)96, ssrc=(uint)1045780718, clock-base=(uint)2990047309, seqnum-base=(uint)65496" \
! rtph264depay \
! avdec_h264 \
! autovideosink
现在,我想将此流保存在不同视频屏幕尺寸的 MP4 文件中。
我正在尝试跟随管道,但出现错误
erroneous pipeline: could not link videoscale0 to h264parse0
gst-launch-1.0 udpsrc uri=udp://127.0.0.1:5000 \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01ADdoFB+/8CqwIAEAAAAMAQAAADKPFCqg\=\,aO88gA\=\=\", payload=(int)96, ssrc=(uint)1045780718, clock-base=(uint)2990047309, seqnum-base=(uint)65496" \
! rtph264depay \
! decodebin \
! queue \
! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! h264parse ! x264enc tune=zerolatency bitrate=2998 speed-preset=superfast ! queue \
! autovideosink
以后开发使用autovideosink会被filesink代替
[已编辑] 2015 年 12 月 30 日
我对管道进行了一些更改,它现在可以正常工作但不一致。它有时有效,有时失败。我认为,这是 RTP 流和解码器中的同步问题但是当前的变化是,
- 将 decodebin 更改为 avdec_h264,为什么?
我看到了 GStreamer 管道图,decodebin 的 src 没有连接
到 videoconvert 的接收器。所以管道实际上坏了。
用 avdec_h264 替换 decodebin 并且流水线完成。
当前流水线:
gst-launch-1.0 udpsrc uri=udp://127.0.0.1:5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01ADdoFB+/8CqwIAEAAAAMAQAAADKPFCqg\=\,aO88gA\=\=\", payload=(int)96, ssrc=(uint)1045780718, clock-base=(uint)2990047309, seqnum-base=(uint)65496" ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! queue ! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! x264enc tune=zerolatency bitrate=2998 speed-preset=superfast ! queue ! filesink location=video-2.mp4
但现在低于错误,
0:00:00.217021017 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow
0:00:00.217066624 18449 0x1c50850 ERROR libav :0:: decode_slice_header error
0:00:00.217085496 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow
0:00:00.217101775 18449 0x1c50850 ERROR libav :0:: decode_slice_header error
0:00:00.217118391 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow
0:00:00.217133568 18449 0x1c50850 ERROR libav :0:: decode_slice_header error
0:00:00.217231425 18449 0x1c50850 ERROR libav :0:: left block unavailable for requested intra mode at 0 1
0:00:00.217260466 18449 0x1c50850 ERROR libav :0:: error while decoding MB 0 1, bytestream 1286
0:00:00.242377091 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow
0:00:00.242642392 18449 0x1c50850 ERROR libav :0:: decode_slice_header error
0:00:00.242670418 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow
0:00:00.242689807 18449 0x1c50850 ERROR libav :0:: decode_slice_header error
0:00:00.242709715 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow
0:00:00.242728336 18449 0x1c50850 ERROR libav :0:: decode_slice_header error
0:00:00.242821704 18449 0x1c50850 ERROR libav :0:: left block unavailable for requested intra mode at 0 1
0:00:00.242851186 18449 0x1c50850 ERROR libav :0:: error while decoding MB 0 1, bytestream 1193
这个链接是给我的。
decodebin 已经为您提供 video/x-raw.
gst-launch-1.0 udpsrc uri=udp://127.0.0.1:5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01ADdoFB+/8CqwIAEAAAAMAQAAADKPFCqg\=\,aO88gA\=\=\", payload=(int)96, ssrc=(uint)1045780718, clock-base=(uint)2990047309, seqnum-base=(uint)65496" \
! rtph264depay \
! decodebin ! queue \
! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! x264enc tune=zerolatency bitrate=2998 speed-preset=superfast \
! queue ! autovideosink
我正在尝试将 UDP 流存储到不同大小的 MP4 文件。
使用 1080 视频生成 UDP 流用于开发目的,稍后将被 IP Camera 取代
UDP 服务器接收器:
gst-launch-0.10 -v filesrc location=video.mp4 ! decodebin ! ffmpegcolorspace ! videoscale ! video/x-raw-yuv,width=1920,height=1088 ! timeoverlay halignment=right ! clockoverlay time-format="%Y/%m/%d %H:%M:%S" ! x264enc tune=zerolatency bitrate=2998 speed-preset=superfast ! queue ! rtph264pay name=pay0 pt=96 ! udpsink host=127.0.0.1 port=5000
通过以下管道,我可以使用与 UDP 流式传输相同的视频显示大小播放 UDP 流
gst-launch-1.0 udpsrc uri=udp://127.0.0.1:5000 \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01ADdoFB+/8CqwIAEAAAAMAQAAADKPFCqg\=\,aO88gA\=\=\", payload=(int)96, ssrc=(uint)1045780718, clock-base=(uint)2990047309, seqnum-base=(uint)65496" \
! rtph264depay \
! avdec_h264 \
! autovideosink
现在,我想将此流保存在不同视频屏幕尺寸的 MP4 文件中。
我正在尝试跟随管道,但出现错误
erroneous pipeline: could not link videoscale0 to h264parse0
gst-launch-1.0 udpsrc uri=udp://127.0.0.1:5000 \
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01ADdoFB+/8CqwIAEAAAAMAQAAADKPFCqg\=\,aO88gA\=\=\", payload=(int)96, ssrc=(uint)1045780718, clock-base=(uint)2990047309, seqnum-base=(uint)65496" \
! rtph264depay \
! decodebin \
! queue \
! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! h264parse ! x264enc tune=zerolatency bitrate=2998 speed-preset=superfast ! queue \
! autovideosink
以后开发使用autovideosink会被filesink代替
[已编辑] 2015 年 12 月 30 日
我对管道进行了一些更改,它现在可以正常工作但不一致。它有时有效,有时失败。我认为,这是 RTP 流和解码器中的同步问题但是当前的变化是,
- 将 decodebin 更改为 avdec_h264,为什么? 我看到了 GStreamer 管道图,decodebin 的 src 没有连接 到 videoconvert 的接收器。所以管道实际上坏了。 用 avdec_h264 替换 decodebin 并且流水线完成。
当前流水线:
gst-launch-1.0 udpsrc uri=udp://127.0.0.1:5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01ADdoFB+/8CqwIAEAAAAMAQAAADKPFCqg\=\,aO88gA\=\=\", payload=(int)96, ssrc=(uint)1045780718, clock-base=(uint)2990047309, seqnum-base=(uint)65496" ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! queue ! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! x264enc tune=zerolatency bitrate=2998 speed-preset=superfast ! queue ! filesink location=video-2.mp4
但现在低于错误,
0:00:00.217021017 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow 0:00:00.217066624 18449 0x1c50850 ERROR libav :0:: decode_slice_header error 0:00:00.217085496 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow 0:00:00.217101775 18449 0x1c50850 ERROR libav :0:: decode_slice_header error 0:00:00.217118391 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow 0:00:00.217133568 18449 0x1c50850 ERROR libav :0:: decode_slice_header error 0:00:00.217231425 18449 0x1c50850 ERROR libav :0:: left block unavailable for requested intra mode at 0 1 0:00:00.217260466 18449 0x1c50850 ERROR libav :0:: error while decoding MB 0 1, bytestream 1286 0:00:00.242377091 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow 0:00:00.242642392 18449 0x1c50850 ERROR libav :0:: decode_slice_header error 0:00:00.242670418 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow 0:00:00.242689807 18449 0x1c50850 ERROR libav :0:: decode_slice_header error 0:00:00.242709715 18449 0x1c50850 ERROR libav :0:: first_mb_in_slice overflow 0:00:00.242728336 18449 0x1c50850 ERROR libav :0:: decode_slice_header error 0:00:00.242821704 18449 0x1c50850 ERROR libav :0:: left block unavailable for requested intra mode at 0 1 0:00:00.242851186 18449 0x1c50850 ERROR libav :0:: error while decoding MB 0 1, bytestream 1193
这个链接是给我的。 decodebin 已经为您提供 video/x-raw.
gst-launch-1.0 udpsrc uri=udp://127.0.0.1:5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z01ADdoFB+/8CqwIAEAAAAMAQAAADKPFCqg\=\,aO88gA\=\=\", payload=(int)96, ssrc=(uint)1045780718, clock-base=(uint)2990047309, seqnum-base=(uint)65496" \
! rtph264depay \
! decodebin ! queue \
! videoconvert ! videoscale ! video/x-raw,width=1280,height=720 ! x264enc tune=zerolatency bitrate=2998 speed-preset=superfast \
! queue ! autovideosink