Я написал код для appsrc для приложений, и он работает. Я вижу фактический буфер. Он закодирован в H264 (vpuenc = avc). Теперь я хочу сохранить его в файле (filesink). Как я к нему подхожу?Gstreamer. Записывать приложения в filesink
приложение:
int main(int argc, char *argv[]) {
gst_init (NULL, NULL);
GstElement *pipeline, *sink;
gchar *descr;
GError *error = NULL;
GstAppSink *appsink;
descr = g_strdup_printf (
"mfw_v4lsrc device=/dev/video1 capture_mode=0 ! " // grab from mipi camera
"ffmpegcolorspace ! vpuenc codec=avc ! "
"appsink name=sink"
);
pipeline = gst_parse_launch (descr, &error);
if (error != NULL) {
g_print ("could not construct pipeline: %s\n", error->message);
g_error_free (error);
exit (-1);
}
gst_element_set_state(pipeline, GST_STATE_PAUSED);
sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
appsink = (GstAppSink *) sink;
gst_app_sink_set_max_buffers (appsink, 2); // limit number of buffers queued
gst_app_sink_set_drop(appsink, true); // drop old buffers in queue when full
gst_element_set_state (pipeline, GST_STATE_PLAYING);
int i = 0;
while(!gst_app_sink_is_eos(appsink))
{
GstBuffer *buffer = gst_app_sink_pull_buffer(appsink);
uint8_t* data = (uint8_t*)GST_BUFFER_DATA(buffer);
uint32_t size = GST_BUFFER_SIZE(buffer);
gst_buffer_unref(buffer);
}
return 0; }
Кроме того, если вы не знаете, что делаете, я бы не рекомендовал, чтобы appslink отбрасывали h264-буферы. Поместите элемент очереди дальше по конвейеру и удалите буферы необработанных видеокадров, но не данные .264 ... – mpr
Моя цель - передавать данные в реальном времени в сети. –
Если ваша цель - поток в сеть, вы полностью лаяете по неправильному дереву. Вы хотите посмотреть на сетевые приемники, связанные с RTP, RTMP, MPEGTS и т. Д. Какой стандарт передачи вы собираетесь использовать? – mpr