gstreamer developpers. В отправителе я использую appsrc для хранения внешних данных YUV, а затем кодирую и передаю через rtph265pay и udpsink. В приемнике я использую udpsrc и rtph265depay для получения потока битов H265, а затем использую appsink для извлечения данных YUV.
В appsrc я установил метку времени так: GST_BUFFER_PTS (buffer) = 100;
В приложениях я получаю метку времени, например: timestamp = GST_BUFFER_PTS (buffer);
Но возникает проблема: значение метки времени не равно 100 (я установил в appsrc). Почему???
На самом деле, я просто хочу добиться этого:
В отправителе, во-первых, я получаю данные YUV через appsrc. Я хочу записать идентификатор в каждый кадр YUV (до кодирования), а затем кодировать, а затем передать их в локальную сеть через rtph265pay и udpsink.
В приемнике я получаю их через udpsrc и rtph265depay, затем декодирую и получаю данные YUV через appsink.
Моя основная цель: в приемнике я могу получить идентификатор каждого YUV-данных, чтобы я мог знать, что при передаче происходит потеря данных при проверке непрерывных идентификационных номеров.
Тогда я подумал о методе: использование метки времени, возможно, может достичь моей цели. Поэтому я попытался.
Теперь я установил «do-timestamp» как FALSE в appsrc, и обнаружил, что udpsrc также имеет свойство «do-timestamp», поэтому я также установил «do-timestamp» как FALSE в udpsrc. Затем я устанавливаю остальные свойства appsrc следующим образом: g_object_set (G_OBJECT (appsrc), «stream-type», 0, «is-live», TRUE, «format», GST_FORMAT_TIME, «max-bytes», FRAME_W * FRAME_H *3/2 * 100, «блок», ИСТИНА, «минимальный процент», 50, NULL);Затем я выводю метку времени в appsink, но она не равна 100, который я установил в appsrc.
Есть что-то еще, чего я не понимаю? Пожалуйста, помогите мне найти проблему. Или, если я установлю метку времени в GstRtpBuffer (таким образом, я могу установить метку времени в качестве идентификатора кадра и я могу получить эту метку времени перед декодированием.), Как я могу это сделать?
static int cb_need_data (App * app, int num) {
static GstClockTime timestamp = 0;
GstBuffer *buffer;
guint buffersize;
GstFlowReturn ret;
GstMapInfo info;
buffersize = FRAME_H * FRAME_W * 3/2;
m.lock();
buffer = gst_buffer_new_allocate(nullptr,buffersize,nullptr);
m.unlock();
gst_buffer_fill(buffer,0,Q3.DeQueue().data,buffersize);
//buffer = gst_buffer_copy(buffer);
GST_BUFFER_PTS(buffer) = 100;
//GST_BUFFER_DTS(buffer) = 100;
cout << endl << "GST_BUFFER_PTS_IS_VALID(buffer) is: " << GST_BUFFER_PTS_IS_VALID(buffer) << endl;
// Push the buffer into the appsrc
g_signal_emit_by_name (app->videosrc, "push-buffer", buffer, &ret);
//gst_app_src_push_buffer(GST_APP_SRC(app->videosrc),buffer);
}
gst_buffer_unref (buffer);
return 0;
}
static GstFlowReturn on_new_sample_from_sink (конвейер GstElement *, размер guint, приложение * app) {
GstSample *sample;
GstBuffer *app_buffer, *buffer;
GstMapInfo map;
GstFlowReturn ret;
gboolean res;
guint buffersize;
GstClockTime timestamp;
buffersize = FRAME_H * FRAME_W * 3/2;
buffer = gst_buffer_new_and_alloc(buffersize);
gst_buffer_make_writable(buffer);
g_signal_emit_by_name (GST_APP_SINK (pipeline), "pull-sample", &sample, NULL);
if (sample){
GstCaps *caps;
GstStructure *s;
caps = gst_sample_get_caps(sample);
if (!caps){
g_print("could not get snapshot format.***\n");
exit(-1);
}
s = gst_caps_get_structure(caps,0);
// we need to get the final caps on the buffer to get the size
res = gst_structure_get_int(s,"width",&width);
res |= gst_structure_get_int (s, "height", &height);
if (!res){
g_print("could not get snapshot dimension.***\n");
exit(-1);
}else{
g_print("1:width=%d,height=%d\n",width,height);
}
}else{
g_print("Failed in if(sample).***\n");
}
buffer = gst_sample_get_buffer (sample);
timestamp = GST_BUFFER_PTS(buffer);
cout << "\n===timestamp is: " << timestamp << endl;
cout << endl << "GST_BUFFER_PTS_IS_VALID(buffer) is: " << GST_BUFFER_PTS_IS_VALID(buffer) << endl;
// Mapping a buffer
if (gst_buffer_map(buffer,&map,GST_MAP_READ)){
Q1.EnQueue(map.data);
++numOfEnqueue;
g_print("---numOfQueue is: %d.---\n\n\n",numOfEnqueue);
} else g_print("failed in gst_buffer_map.***\n");
//we don't need the appsink sample anymore
gst_sample_unref (sample);
return GST_FLOW_OK;
}