Могу ли я сохранить вывод Gstreamer в буфер с помощью opencv. Если я добавлю приложение в строку - PullRequest
0 голосов
/ 06 августа 2020

Здравствуйте, я новичок в gstreamer. На данный момент я кодирую фреймы с помощью gstreamer pipline в opencv на C ++. Но теперь я не хочу сбрасывать каждый кадр. Я хочу закодировать все кадры и сохранить их в большом буфере, и когда захочу, я буду сбрасывать этот буфер. Итак, как я могу сделать appsink в gstreamer opencv.

Ниже моего фрагмента кода, где я кодирую каждый кадр и также выгружаю

cv::VideoWriter out("appsrc !  videoconvert ! video/x-raw,width=1280,height=720 ! v4l2h264enc ! avimux ! filesink location=hellotest.avi",cv::CAP_GSTREAMER,0,30,cv::Size(1280,720),true);
out.write(Frame);

Но я хочу, чтобы appsink сохранял все закодированные данные в буфер i не хочу ни сбрасывать, ни писать.

1 Ответ

2 голосов
/ 06 августа 2020

Короткий ответ - нет.

Прежде всего, вы не можете писать и читать одновременно с VideoWriter. Что вы можете сделать, так это создать два конвейера, которые взаимодействуют друг с другом, используя элементы ipcpipeline .

Например,

cv::VideoWriter out("appsrc !  videoconvert ! video/x-raw,width=1280,height=720 ! v4l2h264enc ! ipcpipelinesink",...);
cv::VideoCapture cap("ipcpipelinesrc ! ... ! appsink")

Но это не даст вам много альтернатив, потому что форматы данных, поддерживаемые VideoCapture, очень ограничены, если вы проверите исходный код .

// we support 11 types of data:
//     video/x-raw, format=BGR   -> 8bit, 3 channels
//     video/x-raw, format=GRAY8 -> 8bit, 1 channel
//     video/x-raw, format=UYVY  -> 8bit, 2 channel
//     video/x-raw, format=YUY2  -> 8bit, 2 channel
//     video/x-raw, format=YVYU  -> 8bit, 2 channel
//     video/x-raw, format=NV12  -> 8bit, 1 channel (height is 1.5x larger than true height)
//     video/x-raw, format=NV21  -> 8bit, 1 channel (height is 1.5x larger than true height)
//     video/x-raw, format=YV12  -> 8bit, 1 channel (height is 1.5x larger than true height)
//     video/x-raw, format=I420  -> 8bit, 1 channel (height is 1.5x larger than true height)
//     video/x-bayer             -> 8bit, 1 channel
//     image/jpeg                -> 8bit, mjpeg: buffer_size x 1 x 1
// bayer data is never decoded, the user is responsible for that
// everything is 8 bit, so we just test the caps for bit depth 
...