Я пытаюсь записать видео с USB-камеры, кодировать и сохранить его с помощью GStreamer. Каждые 20 секунд я хочу остановить видео, изменить имя вывода и перезапустить захват / кодирование.
Я выложу упрощенную версию своего кода, потому что он довольно длинный и неактуальный.
Дополнительные детали:
timer
отслеживает прошедшее время (в секундах).
create_pip(j)
создает следующий конвейер gst и добавляет j к имени файла (например, test_rgb_0.mp4, test_rgb_1.mp4 и т. Д.)
"v4l2src ! video/x-raw, width=1280, height=720, framerate=30/1, format=RGB ! videoconvert ! omxh265enc bitrate=2000000 qp-range=35,51:35,51:-1,-1 vbv-size=1 iframeinterval=60 ! matroskamux ! filesink location=test_rgb.mp4 -e"
// declarations and stuff
// this for is just to have 3 different video files
for(int j=0; j<3; j++){
// create pipeline
pipeline = gst_parse_launch(create_pip(j).c_str(),NULL);
gst_element_set_state(pipeline,GST_STATE_PLAYING);
timer.reset(); // reset timer to 0
while(timer.elapsed()<=20){
// do some other stuff, can be ignored
}
// stop stream and release pipeline
gst_element_set_state(pipeline,GST_STATE_NULL);
gst_object_unref(pipeline);
}
Все работает нормально, выходные видео имеют длительность 20 секунд, но vlc (или mediainfo) показывает, что видео имеет длину 0 или 1 секунду. Если я открою видео, оно на самом деле длится 20 секунд, поэтому оставшееся время уходит на отрицательные числа (-19 или -20 секунд). Поскольку созданный мной конвейер отлично работает в командной строке, я думаю, что моей программе не удается сохранить некоторые метаданные при закрытии потока. Извините, но я довольно новичок в Gstreamer, что мне не хватает?