Кроме того, моя конечная цель — обрабатывать видеоданные в реальном времени в 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]