我正在尝试传输视频并在客户端PC上播放。管道(服务器端):
gst-launch videotestsrc ! ffenc_mpeg4 ! rtpmp4vpay ! udpsink host=192.168.1.16 port=5000
工作良好。但现在,我需要从服务器传输视频文件而不是videotestsrc。这是管道:
gst-launch filesrc location=movie.mp4 ! ffenc_mpeg4 ! rtpmp4vpay ! udpsink host=192.168.1.16 port=5000
我收到此错误:
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
** (gst-launch-0.10:10550): CRITICAL **: gst_ffmpegenc_chain_video: assertion `frame_size == GST_BUFFER_SIZE (inbuf)' failed
ERROR: from element /GstPipeline:pipeline0/GstFileSrc:filesrc0: Internal data flow error.
Additional debug info:
gstbasesrc.c(2625): gst_base_src_loop (): /GstPipeline:pipeline0/GstFileSrc:filesrc0:
streaming task paused, reason error (-5)
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
看起来缓冲区没有足够的空间(我认为......)。
有人知道如何解决它吗?
我们来看看你的第二个管道:
gst-launch filesrc location=movie.mp4 ! ffenc_mpeg4 ! rtpmp4vpay ! udpsink host=192.168.1.16 port=5000
你正在连接filesrc
(在你的情况下读取编码的.mp4
文件并输出文件的原始内容,而不知道它的格式)。
然后你将这些数据直接填充到ffenc_mpeg4
。
使用gst-inspect ffenc_mpeg4
查看水槽盖,我们得到以下信息:
…
Pad Templates:
…
SINK template: 'sink'
Availability: Always
Capabilities:
video/x-raw-rgb
video/x-raw-yuv
video/x-raw-gray
…
因此ffenc_mpeg4
期望在其接收器(=输入)处获得原始未编码视频,但它得到的是mpeg4数据(未声明为此)。
所以我们的问题有两种可能的解决方案:
gst-launch-0.10 filesrc location=movie.mp4 ! udpsink host=192.168.1.16 port=5000
这样,服务器不必进行任何cpu密集型的重新编码,因此应该只需要很少的资源。
但是如果你有不同格式的源文件,客户端必须支持所有这些(并正确检测它们)。decodebin
添加到管道中):
gst-launch filesrc location=movie.mp4 ! decodebin ! ffenc_mpeg4 ! rtpmp4vpay ! udpsink host=192.168.1.16 port=5000
这里的优点是(当相应地配置编码器元件时)无论您获得哪种输入文件格式,只要您的服务器可以对其进行解码,您最终将获得MPEG4 UDP流,但服务器可能会浪费资源(以及通过解码文件只是为了将其编码回相同的格式而失去视频质量。