我正在尝试使用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中转换此简单示例吗?
答案 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
无法直接控制配置这些大小。因此,您可能必须找出其他方法。