Я создал живой непрерывный поток mjpeg. Грубая иллюстрация такая
....[image (jpeg)]->[text "content-length"]->[image (jpeg)]->[text "content-length"]->....
Как вы можете видеть, я получаю данные из строки медиаконвейера gstreamer, которая содержит изображение и мой собственный введенный текст (Примечание: хотя я использую Gstreamer, мой вопрос связан только с принципами C++.)
Чтобы проанализировать эти данные в реальном времени, я пытаюсь получить и отправить их в очередь. Впоследствии я планирую анализировать данные для слова «длина содержимого» после того, как очередь содержит определенное количество пакетов.
Мой код выглядит следующим образом:
void clear( std::queue<char> &q )
{
std::queue<char> empty;
std::swap( q, empty );
}
static GstFlowReturn new_buffer (GstAppSink *app_sink, gpointer user_data)
{
GstBuffer* buffer = gst_app_sink_pull_buffer(app_sink);
//create queue
std::queue<char> q;
g_print("The input buffer contents are\n");
gint i=0;
for(i=0; buffer->data[i];i++)
{
//g_print("\n%d",i);
q.push(buffer->data[i]);
}
//g_print("\nsize of inbuf is %d\n",GST_BUFFER_SIZE(buffer));
g_print("\n");
gst_buffer_unref(buffer);
//#####################
//parsing method here???
//#####################
clear(q);
return GST_FLOW_OK;
}
Раньше я использовал циклические очереди/кольцевой буфер в C/C++. Это лучший вариант? Или очереди C++ STL были бы более подходящими в этом сценарии, как указано выше?
content-length
после контента? вместо этого вы можете просто префикс каждого кадра (изображения) по его размеру в двоичной форме. почему вы пытаетесь заставить освободить память очереди с помощью функцииclear()
непосредственно перед тем, как это будет сделано автоматически при выходе из вашегоnew_buffer()
? - person Andriy Tylychko   schedule 02.09.2011"content-length"
у меня есть еще"timestamp"
. Я не мог найти способ добавить это к метатегам потока. Следовательно, я сжимаю все текстовые данные между двумя кадрами изображения. На самом деле я использую tee от gstreamer, где разветвляется мой медиаконвейер. Один конец тройника - это место, где поток идет на отображение. На другом конце потока я получаю буфер, используя appsink для разбора этого текста. Размещение content-length до или после изображения в формате jpeg не будет проблемой. Но сам jpeg имеет **заголовок**(0xFF, 0xD8)
и **нижний колонтитул**(0xFF, 0xD9)
Следовательно, я размещаю данные снаружи правильно? - person enthusiasticgeek   schedule 02.09.2011content length
(4 байта) иtimestamp
(4 байта). при разборе вашего потока вы просто берете длину контента и временную метку, затем читаете кадр (вы знаете его длину) - person Andriy Tylychko   schedule 02.09.2011content-length
) текст ][ (timestamp
) текст ][ {0xFF,0xD8
} (JPEG Frame) изображение {0xFF,0xD9
} ] [ (content-length
) текст ] [ (timestamp
) текст ][ {0xFF,0xD8
} (JPEG-кадр) изображение {0xFF,0xD9
} ] [ (content-length
) текст ] [ (timestamp
) текст ][ {0xFF,0xD8
} (JPEG-кадр) изображение {0xFF,0xD9
} ]... Это? - person enthusiasticgeek   schedule 02.09.2011"content-length"
и"timestamp"
- person enthusiasticgeek   schedule 02.09.2011