1 Star 1 Fork 0

lidedongsn/gstreamer

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
rtp_h264_recoder.c 4.31 KB
一键复制 编辑 原始数据 按行查看 历史
lidedongsn 提交于 2016-11-01 15:58 +08:00 . first
#include "clprs.h"
/*
gst-launch-1.0 -ve udpsrc uri=udp://192.168.186.128:5555 port=5555 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtpjitterbuffer ! rtph264depay ! h264parse ! mp4mux ! filesink location=file.mp4
*/
#define URL_STR "udp://192.168.52.128:5566"
#define PORT 5566
#define AUDIO_CAPS "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
#define DEST_FILE "./my.mp4"
typedef struct _clprs_server clprs_server;
struct _clprs_server{
GMainLoop *loop;
GstElement *pipeline;
GstElement *udpsrc;
GstElement *rtpjitterbuffer;
GstElement *rtph264depay;
GstElement *h264parse;
GstElement *mp4mux;
GstElement *filesink;
};
clprs_server g_server;
static gboolean clprs_set_src(GstElement *udpsrc, clprs_uri_t *uri)
{
GstCaps *caps;
g_assert(udpsrc);
if(!uri){
g_error("No uri presented!");
return FALSE;
}
g_object_set (G_OBJECT (udpsrc), "uri", uri->uri_str, NULL);
g_object_set (G_OBJECT (udpsrc), "port", uri->port, NULL);
caps = gst_caps_from_string(AUDIO_CAPS);
g_object_set(udpsrc, "caps", caps, NULL);
gst_caps_unref (caps);
return TRUE;
}
static void clprs_send_eos(GstElement *element)
{
GstEvent *event;
event = gst_event_new_eos();
gst_element_send_event(element, event);
}
static gboolean bus_message(GstBus * bus, GstMessage * message, clprs_server *server)
{
GST_DEBUG("######## LIDE: Got message %s", gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
//g_warning("######## LIDE: Got message %s", gst_message_type_get_name(GST_MESSAGE_TYPE (message)));
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_ERROR:
{
GError *err;
gchar *debug;
gst_message_parse_error (message, &err, &debug);
g_print ("Error: %s\n", err->message);
g_error_free (err);
g_free (debug);
g_main_loop_quit (server->loop);
break;
}
case GST_MESSAGE_EOS:
{
/* end-of-stream */
g_print("\nQuit main loop ......\n");
// g_usleep (5 * G_USEC_PER_SEC);
g_main_loop_quit (server->loop);
break;
}
default:
break;
}
return TRUE;
}
int main (int argc, char *argv[]) {
gboolean link_ok;
clprs_uri_t *uri;
GstBus *bus;
clprs_server *server = &g_server;
gst_init(&argc, &argv);
server->loop = g_main_loop_new(NULL, FALSE);//create main loop
uri = (clprs_uri_t*)g_malloc(sizeof(clprs_uri_t));
uri->uri_str = g_strdup(URL_STR);
uri->port = PORT;
/* create a new pipeline */
server->pipeline = gst_pipeline_new("pipeline");
server->udpsrc = gst_element_factory_make("udpsrc", "rtpsrc");
/* get date from uri=udp://192.168.186.128:5555 port=5555 */
if(!clprs_set_src(server->udpsrc, uri)){
g_error("Set uri err!!");
}
/* create elements */
server->rtpjitterbuffer = gst_element_factory_make("rtpjitterbuffer", "jitterbuffer");
server->rtph264depay = gst_element_factory_make("rtph264depay", "h264depay");
server->h264parse = gst_element_factory_make("h264parse", "h264parse");
//server->mp4mux = gst_element_factory_make("matroskamux", "mp4mux");
server->mp4mux = gst_element_factory_make("mp4mux", "mp4mux");
// g_object_set(G_OBJECT (server->mp4mux), "fragment-duration", 10, NULL);
server->filesink = gst_element_factory_make("filesink", "sink");
g_object_set(G_OBJECT (server->filesink), "location", DEST_FILE, NULL);
//g_object_set (G_OBJECT (server->filesink), "sync", TRUE, NULL);
/* add elements to pipeline */
gst_bin_add_many(GST_BIN (server->pipeline), server->udpsrc, server->rtpjitterbuffer, server->rtph264depay, server->h264parse, server->mp4mux, server->filesink, NULL);
/* link elements */
if(!gst_element_link_many(server->udpsrc, server->rtpjitterbuffer, server->rtph264depay, server->h264parse, server->mp4mux, server->filesink, NULL)){
g_error("Elements link error!");
}
bus = gst_pipeline_get_bus(GST_PIPELINE (server->pipeline));
gst_bus_add_watch(bus, (GstBusFunc) bus_message, server);
g_timeout_add (10000, (GSourceFunc) clprs_send_eos, server->pipeline);
/* play */
gst_element_set_state(server->pipeline, GST_STATE_PLAYING);
/* main loop */
g_print("\nStart main loop ......\n");
g_main_loop_run(server->loop);
/* stop pipeline */
gst_element_set_state(server->pipeline, GST_STATE_NULL);
/* free src */
g_free(uri->uri_str);
gst_object_unref(GST_OBJECT(server->pipeline));
exit (0);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/lidecoolblue/gstreamer.git
git@gitee.com:lidecoolblue/gstreamer.git
lidecoolblue
gstreamer
gstreamer
master

搜索帮助