Получение синхронизированных видео и аудио кадров с «USB-камеры» для обработки в реальном времени с помощью GStreamer.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Получение синхронизированных видео и аудио кадров с «USB-камеры» для обработки в реальном времени с помощью GStreamer.

Сообщение Anonymous »

Мне требуется руководство по разработке системы, объединяющей камеру и GStreamer для получения потоков видео и аудио в реальном времени. Моя основная цель — добиться синхронного приема видео и аудио как видеокадров, так и аудиосэмплов со скоростью 60 кадров в секунду, обеспечивая плавную синхронизацию. В частности, я стремлюсь сопровождать каждый видеокадр (48000/60)=800 аудиосэмплами для обеспечения целостности синхронизации.
Кроме того, моя конечная цель — обрабатывать видеоданные в реальном времени в OpenCV. и аудиоданные в PortAudio с использованием C++. Хотя я изучил различные варианты, включая GStreamer, я еще не нашел более подходящего решения для захвата видео и аудио кадров.
Как новичок в GStreamer, я пытался объединить камеру с GStreamer для получения живого видео и аудио потока. Однако из-за моего ограниченного опыта и базового понимания GStreamer я столкнулся с трудностями в достижении ожидаемых результатов. Я пытался следовать некоторым базовым руководствам и примерам, но мне было сложно правильно реализовать необходимые шаги. Я ожидал, что смогу успешно настроить систему для получения синхронизированных видео- и аудиопотоков, но столкнулся с трудностями в понимании и эффективном применении этих концепций. В результате мне не удалось добиться желаемого результата.
Кроме того, я попытался использовать предоставленный фрагмент кода для чтения и декодирования кадров для OpenCV. Хотя я пытался адаптировать его к своим потребностям, я столкнулся с некоторыми проблемами при интеграции его с остальной частью моего проекта.

Код: Выделить всё

#include 
#include 
#include 
#include 

#define SAMPLE_RATE 48000
#define FRAMES_PER_BUFFER 800

struct AudioVideoFrame {
cv::Mat video_frame;
std::vector audio_samples;
};

static GstFlowReturn new_sample(GstElement *sink, gpointer user_data) {
AudioVideoFrame* frame = static_cast(user_data);
GstSample *sample = gst_app_sink_pull_sample(GST_APP_SINK(sink));
GstBuffer *buffer = gst_sample_get_buffer(sample);
GstMapInfo map;
gst_buffer_map(buffer, &map, GST_MAP_READ);

if (sink == gst_bin_get_by_name(GST_BIN(sink), "videosink")) {
frame->video_frame = cv::Mat(720, 1280, CV_8UC3, (char*)map.data).clone();
} else if (sink == gst_bin_get_by_name(GST_BIN(sink), "audiosink")) {
frame->audio_samples.resize(map.size / sizeof(float));
memcpy(frame->audio_samples.data(), map.data, map.size);
}

gst_buffer_unmap(buffer, &map);
gst_sample_unref(sample);

return GST_FLOW_OK;
}

int main(int argc, char *argv[]) {
gst_init(&argc, &argv);

const char* pipelineDesc =
"mfvideosrc device-path=\"\\\\?\\usb#vid_1e45&pid_3035&mi_00#6&35de4ec0&0&0000#{e5323777-f976-4f5b-9b55-b94699c46e44}\\global\" ! video/x-raw, format=NV12, width=1280, height=720, framerate=60/1 ! videoconvert ! video/x-raw, format=BGR ! appsink name=videosink sync=true "
"wasapisrc device=\"{0.0.1.00000000}.{fb11cbb1-5d84-489c-bacc-e7cbbde9c673}\" ! audio/x-raw, format=F32LE, rate=48000, channels=1 ! queue ! appsink name=audiosink sync=true";

GError *err = nullptr;
GstElement *pipeline = gst_parse_launch(pipelineDesc, &err);

if (err) {
std::cerr 

Подробнее здесь: [url]https://stackoverflow.com/questions/78491107/receiving-synchronized-video-and-audio-frames-from-a-usb-camera-for-real-time[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»