Установите и получите временную метку вручную, используя appsrc / appsink в Gstreamer - PullRequest
0 голосов
/ 08 ноября 2019

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;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...