原型
rtspsrc lolcaiton=rtsp://192.168.50.246 user-id=admin user-pw=admin protocols=4 ! rtph264depay ! h264parse ! avdec_h264 ! videoscale ! videorate ! videoconvert ! autovideosink
void on_pad_added (GstElement *element, GstPad *pad, gpointer data)
{
gst_element_link_pads(element, gst_pad_get_name(pad), GST_ELEMENT(data), "sink");
}
int main(int argc, char *argv[])
{
GMainLoop* loop=NULL;
gst_init (&argc, &argv);
loop = g_main_loop_new(NULL, FALSE);
GstElement* pipeline = gst_pipeline_new(name); //建立pipeline
GstElement* rtspsrc = gst_element_factory_make("rtspsrc","rtspsrc"); //rtsp 接收的元件
GstElement* queue = gst_element_factory_make("queue","queue"); //buffer
GstElement* depay = gst_element_factory_make("rtph264depay","videodepay"); // h264在rtp的payload要解開
GstElement* parse = gst_element_factory_make("h264parse","h264parse"); // parse h264 header
GstElement* video_decode = gst_element_factory_make("avdec_h264","videodecode"); //解碼
GstElement* videoscale = gst_element_factory_make("videoscale","videoscale"); //影像寬高調整的element
GstElement* videorate = gst_element_factory_make("videorate","videorate"); // video 張數的控制
GstElement* videoconvert = gst_element_factory_make("videoconvert","videoconvert"); // 色彩轉換
GstElement* autovideosink = gst_element_factory_make("autovideosink","videosink"); // 影像輸出
g_object_set(G_OBJECT(rtspsrc), "location","192.168.50.246, "protocols", 4,NULL); //設定 rtsp參數
g_object_set(G_OBJECT(rtspsrc), "user-id","admin", "user-pw","admin",NULL); //設定 rtsp參數
g_signal_connect(rtspsrc, "pad-added", G_CALLBACK(on_pad_added), depay);
// 屬性是sometimes, 所以叫建立pad
Pad Templates:
SRC template: 'stream_%u'
Availability: Sometimes
Capabilities:
application/x-rtp
application/x-rdt
gst_bin_add_many(GST_BIN(pipeline), rtspsrc ,queue, depay, parse, video_decode, videoscale, videorate, videoconvert, autovideosink, NULL);
gst_element_link_many(rtspsrc, queue, depay, parse, video_decode, videoscale, videorate, videoconvert, autovideosink, NULL);
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
}