如何使用不带RTP的Gstreamer创建视频流?

时间:2018-11-26 08:59:10

标签: udp video-streaming gstreamer

我正在尝试使用Gstreamer1.0创建一个简单的UDP视频流。 问题是,就我的项目而言,我需要有一个普通的UDP流,但是我发现的几乎所有教程都启用了RTP。 所以我想翻译这个简单的流:

玩家:

gst-launch-1.0 udpsrc port=5000 !  application/x-rtp, encoding-name=H264,payload=96 !  rtph264depay ! h264parse ! avdec_h264 !  autovideosink

服务器:

gst-launch-1.0 v4l2src !  video/x-raw,width=640,height=480 !  x264enc ! h264parse ! rtph264pay !  udpsink host=127.0.0.1 port=5000

有人可以为我指出正确的方向,说明如何仅在UDP中转换此简单示例吗?

1 个答案:

答案 0 :(得分:1)

您上面所述的管道,在发件人一方,我看不到#include <iostream> #include <vector> #include <complex> #include <type_traits> template <typename T> class DataArray { public: DataArray(T * data) : m_data(data) {} template<typename T> using isComplex = std::is_same<T, std::complex<typename T::value_type>>; template <typename T> typename std::enable_if<isComplex<T>::value>::type min() { std::cout << "Min for complex" << std::endl; } template <typename T> typename std::enable_if<std::is_arithmetic<T>::value>::type min() { std::cout << "Min for arithmetic values." << std::endl; } private: T * m_data; }; int main() { double v1[2] ={ 1., 2.}; DataArray<double> d1(v1); d1.min(); // min function for double : **compilation error** std::complex<double> v2[2] = { { 1, 2 },{ 3, 4 } }; DataArray<std::complex<double>> d2(v2); d2.min(); // min function for complex<double> : compilation error } 的任何使用。理想情况下,应该在发送方使用rtp,然后在接收方使用rtpjpegpay进行支付。 您是否尝试了没有UDP的相同管道。可能会向您抱怨rtpjpegdepay处的数据包大小大于缓冲区大小。您将需要udpsink才能将视频流分成rtp数据包。

如果不需要rtp,请尝试直接发送流,但缓冲区大小受限制,rtpxpay。这还会导致渲染视频的延迟增加,某些数据包丢失等。请尝试对udpsink上的缓冲区大小/数据包大小使用不同的值。不幸的是,udpsink无法直接控制配置这些大小。因此,您可能必须找出其他方法。