很抱歉上一篇文章。我会尽量更精确些。
使用Gstreamer,我创建了一个管道,其中包含video.ts元素,我可以看到和听到视频,没有问题,但我想得到一些信息包video.ts。
信息是有兴趣得到我的PTS,DTS,偏移量和PID。为了查看这些值,我使用了Tsdemux的emit stats属性。
g_object_set(g_object(v1_demux),“emit stats”,1,空);
现在,我想看看PTS、DTS、OFFSET和PID的值。为此,请使用“gst_bus_add_watch”并为消息创建多个案例
case GST_MESSAGE_EOS:
g_print (" \n");
g_print (" End of video\n");
g_main_loop_quit (loop);
break;
case GST_MESSAGE_ERROR: {
gchar *debug;
GError *error;
gst_message_parse_error (msg, &error, &debug);
g_free (debug);
g_printerr ("Error: %s\n", error->message);
g_error_free (error);
g_main_loop_quit (loop);
break;
}/*end case error*/
case GST_MESSAGE_ELEMENT:{
if(strcmp(GST_MESSAGE_SRC_NAME (msg),"mux")==0){
msg_struct=gst_message_get_structure(msg);
i=i+1;
g_print ("Element nº: %d \n", i);
/* get PID,PTS,DTS,OFFSET value */
pts =gst_structure_get_value (msg_struct,"pts");
dts =gst_structure_get_value (msg_struct,"dts");
offset =gst_structure_get_value (msg_struct,"offset");
pid =gst_structure_get_value (msg_struct,"pid");
/*display information PTS, DTS, OFFSET*/
if(pts!=0){
g_print(" *PID= % " G_GUINT64_FORMAT" *PTS= % " G_GUINT64_FORMAT " *Offset: % " G_GUINT64_FORMAT "\n",g_value_get_uint64(pid), g_value_get_uint64(pts),g_value_get_uint64(offset));
}else if (dts!=0){
g_print(" *DTS= % " G_GUINT64_FORMAT " *Offset: % " G_GUINT64_FORMAT "\n",g_value_get_uint64(dts),g_value_get_uint64(offset));
}else if (pts==0 && dts==0){
g_print(" *Paquete nulo: PTS=0 DTS=0 \n" );
}
}
现在我可以看到PTS、DTS和OFFSET的值。这一部分可以通过耐心、测试和纠正错误来解决。但是PID没有正确显示,我不知道如何解决这个问题。
显示消息的快照
不正当行为?:490
*DTS=4672782274*偏移量:12554828
元素n?:491个
(测试:3385):GLib GObject CRITICAL**:g_value_get_uint64:断言“g_value_HOLDS_uint64(value)”失败
*PID=0*PTS=4672793074*偏移量:12554828
元素n?:492个
(测试:3385):GLib GObject CRITICAL**:g_value_get_uint64:断言“g_value_HOLDS_uint64(value)”失败
*PID=0*PTS=4672746274*偏移量:12556520
元素n?:493个
(测试:3385):GLib GObject CRITICAL**:g_value_get_uint64:断言“g_value_HOLDS_uint64(value)”失败
*PID=0*PTS=4672748074*偏移量:12605024
元素n?:494个
我能做什么,给我正确的PID?
最佳答案
GstStructure是键/值对的集合。你可以用
gchar * gst_structure_to_string (const GstStructure *structure);
显示所有字段。在你的情况下
g_print("%s\n", gst_structure_to_string(gst_message_get_structure(msg)));