从“USB 摄像头”接收同步视频和音频帧,以便使用 GStreamer 进行实时处理

问题描述 投票:0回答:1

我正在寻求有关开发集成摄像头和 GStreamer 以接收实时视频和音频流的系统的指导。我的主要目标是实现视频和音频的同步接收,视频帧和音频样本的速率均为每秒60帧,确保无缝同步。具体来说,我的目标是为每个视频帧配备 44100/60 音频样本,以保持同步完整性。

此外,我的最终目标是使用C++处理OpenCV中的实时视频数据和PortAudio中的音频数据。虽然我探索了包括 GStreamer 在内的各种选项,但我尚未找到更适合捕获视频和音频帧的解决方案。

作为 GStreamer 的初学者,我尝试将相机与 GStreamer 结合起来接收实时视频和音频流。然而,由于我的经验和对GStreamer的基本了解有限,我在达到预期结果时遇到了困难。我尝试遵循一些基本教程和示例,但我很难正确实施必要的步骤。我期望成功设置系统来接收同步视频和音频流,但我在有效理解和应用这些概念方面面临挑战。结果我没能达到我想要的结果。

此外,我尝试使用提供的代码片段来读取和解码 OpenCV 的帧。尽管我尝试使其适应我的需求,但在将其与项目的其余部分集成时遇到了一些问题。

#include <gst/gst.h>
#include <gst/app/gstappsink.h>

#include <opencv2/opencv.hpp>


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

    // Create pipeline
    gchar *pipelineDesc = g_strdup_printf("mfvideosrc device-id=1 ! video/x-raw, format=NV12, width=1280, height=720, framerate=10000000/83333, pixel-aspect-ratio=1/1, colorimetry=1:4:0:1 ! videoconvert ! video/x-raw, format=BGR ! appsink");
    GError *err = nullptr;
    GstElement *pipeline = gst_parse_launch(pipelineDesc, &err);
    g_free(pipelineDesc);

    if (err != nullptr) {
        g_printerr("Error creating pipeline: %s\n", err->message);
        g_clear_error(&err);
        return -1;
    }

    // Set pipeline to playing state
    GstStateChangeReturn stateChange = gst_element_set_state(pipeline, GST_STATE_PLAYING);
    if (stateChange == GST_STATE_CHANGE_FAILURE) {
        g_printerr("Failed to start pipeline\n");
        return -1;
    }

    // Main loop to read frames
    GstSample *sample = nullptr;
    cv::Mat frame;
    GstElement *appsink = gst_bin_get_by_name(GST_BIN(pipeline), "appsink0");

    while (true) {
        // Pull sample from appsink
        sample = gst_app_sink_pull_sample(GST_APP_SINK(appsink));

        // Get buffer from sample
        GstBuffer *buffer = gst_sample_get_buffer(sample);

        // Map buffer to read data
        GstMapInfo info;
        gst_buffer_map(buffer, &info, GST_MAP_READ);

        // Convert data to OpenCV Mat
        frame = cv::Mat(720, 1280, CV_8UC3, info.data);

        // Unmap buffer
        gst_buffer_unmap(buffer, &info);

        // Show frame
        cv::imshow("Frame", frame);

        // Wait for ESC key to exit
        if (cv::waitKey(1) == 27)
            break;
    }

    // Clean up
    gst_element_set_state(pipeline, GST_STATE_NULL);
    gst_object_unref(appsink);
    gst_object_unref(pipeline);
    cv::destroyAllWindows();

    return 0;
}

任何有关实现这一目标的必要步骤的建议将不胜感激。

预先感谢您的协助。

c++ opencv video-streaming gstreamer portaudio
1个回答
0
投票

您的直播正常吗? mfvideosrc 插件没有“device-id”参数,尝试用“device-index”替换它

© www.soinside.com 2019 - 2024. All rights reserved.